This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


On Thu, May 19, 2011 at 3:30 PM, Kai Tietz <ktietz70@googlemail.com> wrote:
> 2011/5/19 Richard Guenther <richard.guenther@gmail.com>:
>> 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
>
> Well, but just if then all operands in combined BIT_AND/OR block are
> getting hoisting. And well, there might be still some cases where we
> wouldn't find the equivalent. As hoisting leads to following
> sequences, eg:
>
> D1 = a != 0;
> D2 = b != 0;
> D3 = a == 0;
> D4 = b == 0;
> D5 = (long) D1
> D6 = (long) D2
> D7 = (long) D3
> D8 = (long) D4
> D9 = D5 & D6;
> D10 = D8 & D9
> D11 = D9 & D10;
>
> which means that comparision folding will never will happen as the
> statement passed to fold algorithm is a cast to a comparison and not
> the comparison itself. ?So sinking looks more sane IMHO.

The above is what you do.

>
> Regards,
> Kai
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]