On Mon, Oct 26, 2015 at 11:30 AM, Richard Sandiford
<richard.sandif...@arm.com> wrote:
> Richard Biener <richard.guent...@gmail.com> writes:
>> On Mon, Oct 26, 2015 at 10:41 AM, Richard Sandiford
>> <rdsandif...@googlemail.com> wrote:
>>> An upcoming patch adds a match.pd rule that folds pow(pow(x,y),z)
>>> to pow(x,y*z).  This fold can reuse the existing pow gimple statement
>>> and simply replace the operands with x and y*z.  However, the y*z
>>> itself requires a separate gimple statement and the code wasn't
>>> prepared to handle that.
>>>
>>> Tested on x86_64-linux-gnu, aarch64-linux-gnu and arm-linux-gnueabi.
>>> OK to install?
>>
>> Hmm, I put the assert there because of the !inplace case but I see the
>> is_tree_code case alredy behaves the same.
>>
>> I think the intent of fold_stmt_inplace (and thus the 'inplace' case)
>> was that no additional stmts are inserted (and obviously the
>> stmt itself being not replaced, so gsi_stmt () is the same before and
>> after).
>>
>> So I think both the is_gimple_assign && is_tree_code and the
>> case you are amending need a
>>
>>   if (inplace && !gimple_seq_empty_p (*seq))
>>    return false;
>
> OK.  I was wondering about that, but the comment isn't clear whether
> inserting extra statements before the original statement is OK, as long
> as the final statement has the same form.
>
> If this hasn't caused problems for tree codes, do you think that means
> that callers don't care about extra statements matter in practice,
> that there simply aren't many fold patterns like this, or that most
> cases where this kind of fold hits are caught earlier?  Just worried
> about introducing a pessimisation...

There are not many passes restricting folding to inplace anymore.  Maybe
it's again time to re-evaluate some of them.

>
> Should we simply have that check before:
>
>   if (gcond *cond_stmt = dyn_cast <gcond *> (stmt))
>
> so that it's common to all cases?

Yeah, that makes sense.

Thanks,
Richard.

> Thanks,
> Richard
>

Reply via email to