On 11/4/19 6:35 AM, Richard Biener wrote:
> On Mon, Nov 4, 2019 at 10:09 AM Martin Liška <mli...@suse.cz> wrote:
>>
>> On 11/1/19 10:51 PM, Jeff Law wrote:
>>> On 10/31/19 10:01 AM, Martin Liška wrote:
>>>> Hi.
>>>>
>>>> operand_equal_p can properly handle situation where we have a CONSTRUCTOR
>>>> where indices are NULL:
>>>>
>>>>            if (!operand_equal_p (c0->value, c1->value, flags)
>>>>                /* In GIMPLE the indexes can be either NULL or matching i.
>>>>                   Double check this so we won't get false
>>>>                   positives for GENERIC.  */
>>>>                || (c0->index
>>>>                    && (TREE_CODE (c0->index) != INTEGER_CST
>>>>                        || compare_tree_int (c0->index, i)))
>>>>                || (c1->index
>>>>                    && (TREE_CODE (c1->index) != INTEGER_CST
>>>>                        || compare_tree_int (c1->index, i))))
>>>>              return false;
>>>>
>>>> but the corresponding hash function always hashes field (which
>>>> can be NULL_TREE or equal to ctor index).
>>>>
>>>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>>>>
>>>> Ready to be installed?
>>>> Thanks,
>>>> Martin
>>>>
>>>> gcc/ChangeLog:
>>>>
>>>> 2019-10-31  Martin Liska  <mli...@suse.cz>
>>>>
>>>>      PR ipa/92304
>>>>      * fold-const.c (operand_compare::hash_operand): Fix field
>>>>      hashing of CONSTRUCTOR.
>>> OK.  One question though, do these routines need to handle
>>> CONSTRUCTOR_NO_CLEARING?
>>
>> Good point, but I bet it's just a flag used in GENERIC, right?
> 
> Yes.  It matters for gimplification only.  I don't think we can
> optimistically make use of it in operand_equal_p.
I'm not thinking about optimistically using it, quite the opposite :-)

My worry is that we could potentially consider two CONSTRUCTOR nodes
equal in the hashing and equality functions when they really aren't
equal due to the semantics around CONSTRUCTOR_NO_CLEARING.

jeff

Reply via email to