2011/5/19 Richard Guenther <richard.guent...@gmail.com>: > On Thu, May 19, 2011 at 2:59 PM, Kai Tietz <ktiet...@googlemail.com> wrote: >> 2011/5/19 Richard Guenther <richard.guent...@gmail.com>: >>> On Thu, May 19, 2011 at 2:48 PM, Kai Tietz <ktiet...@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. Kai