On 08/28/2017 09:46 PM, Andrew Pinski wrote:
> On Mon, Aug 28, 2017 at 7:46 PM, Martin Sebor <mse...@gmail.com> wrote:
>> operand_equal_p() doesn't handle SSA_NAMEs and returns false for
>> operands in that form even when they have equal values (when both
>> are ADDR_EXPR of the same decl).  Yet the function is extensively
>> relied on in the middle end where I would expect it be beneficial
>> to have it handle SSA_NAMEs.  At a minimum, it would let some
>> tests succeed earlier rather than later, leading to better code.
>> One example is:
>>
>>   char a[32];
>>   memcpy (&a[2], &a[4] - 2, 7);
>>
>> which would be eliminated even without optimization if the function
>> did handle SSA_NAMEs.
> 
> 
> It does handle it via:
>   /* If ARG0 and ARG1 are the same SAVE_EXPR, they are necessarily equal.
>      We don't care about side effects in that case because the SAVE_EXPR
>      takes care of that for us. In all other cases, two expressions are
>      equal if they have no side effects.  If we have two identical
>      expressions with side effects that should be treated the same due
>      to the only side effects being identical SAVE_EXPR's, that will
>      be detected in the recursive calls below.
>      If we are taking an invariant address of two identical objects
>      they are necessarily equal as well.  */
>   if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
>       && (TREE_CODE (arg0) == SAVE_EXPR
>           || (flags & OEP_MATCH_SIDE_EFFECTS)
>           || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
>     return 1;
> 
> 
> That is SSA_NAMES are only equal to another SSA_NAME if it is self.
> Otherwise it a different optimization pass job to get them to be
> equal.
Exactly.

> In this case most likely FRE or DOM.  If they are not doing the job,
> you need to check why and not change operand_equal_p to look back it
> the SSA_NAME's definition.
> 
Right.

Jeff

Reply via email to