[patch tree-ssa-reassoc.c]: Better reassoication for comparision and boolean-logic

Richard Guenther richard.guenther@gmail.com
Thu May 19 13:51:00 GMT 2011


On Thu, May 19, 2011 at 3:08 PM, Kai Tietz <ktietz70@googlemail.com> wrote:
> 2011/5/19 Richard Guenther <richard.guenther@gmail.com>:
>> On Thu, May 19, 2011 at 2:59 PM, Kai Tietz <ktietz70@googlemail.com> wrote:
>>> 2011/5/19 Richard Guenther <richard.guenther@gmail.com>:
>>>> On Thu, May 19, 2011 at 2:48 PM, Kai Tietz <ktietz70@googlemail.com> wrote:
>>>>> Hello,
>>>>>
>>>>> This patch improves reassociation folding for comparision. It expands
>>>>> expressions within binary-AND/OR expression like (X | Y) == 0 to (X ==
>>>>> 0 && Y == 0)
>>>>> and (X | Y) != 0 to (X != 0 || Y != 0).  This is necessary to allow
>>>>> better reassociation
>>>>> on weak pre-folded logical expressions.  This unfolding gets undone
>>>>> anyway later by pass,
>>>>> so no disadvantage gets introduced.
>>>>> Also while going through BB-list, it tries to do some little
>>>>> type-sinking for SSA sequences
>>>>> like "D1 = (type) bool1; D2 = (type) bool2; D3 = D1 & D2;' to 'D1 =
>>>>> bool1 & bool2; D2 = (type) D1;'.
>>>>> This folding has the advantage to see better through intermediate
>>>>> results with none-boolean type.
>>>>> The function eliminate_redundant_comparison () got reworded so, that
>>>>> doesn't break in all cases.
>>>>> It now continues to find duplicates and tries to find inverse variant
>>>>> (folded to constant). By this
>>>>> change we don't combine possible weak optimizations too fast, before
>>>>> we can find and handle
>>>>> inverse or duplicates.
>>>>
>>>> sinking casting belongs not here but instead to tree-ssa-forwprop.
>>>> I'm not sure that a != 0 | b != 0 is the better canonical variant than
>>>> a | b != 0 though.
>>>>
>>>> is_boolean_compatible_type_p looks like a strange remanent.
>>>>
>>>> Richard.
>>>
>>> Well, a | b != 0 is for sure more optimal, but for reassociation we
>>> need to see the unfolded variant temporary. This is necessary as
>>> fold-const can't see through SSA statements.  But this kind of
>>> expansion should be reversed then by pass to the form (a | b) != 0
>>> back.
>>
>> ?  fold-const shouldn't deal with this at all as we are in gimple and in
>> SSA form.  Surely re-association comes to play only with chains of
>> the above with more than two operands.
>>
>> Richard.
>>
>>>
>>> Regards,
>>> Kai
>>>
>>
>
> The issue you can see by testcase binop_tor4.c, as here are the
> intermediate variables d and e (with int type) are destroying the
> reassociation pass. This testcase for example needs this sinking.

hoisting would work equally well

> Kai
>



More information about the Gcc-patches mailing list