[LLVMbugs] Reassociation Transform
ccarter at cs.uiuc.edu
Wed Oct 30 19:35:16 PST 2002
I'm working on PRE for the cs426 project, and I noticed that
reassociation seems to be broken. Since I think reassociation will be
necessary for PRE to achieve impressive results on real programs, I
decided to fix it. I think I have it pretty much working, and it passes
all of the regressions.
Some issues of interest:
1. Contrary to the comment in Reassociate.cpp, floating point
addition and multiplication _are_ commutative, although they are
not associative. Associative operators are Add, Mul, And, Or,
Xor, when not applied to floating point types. Commutative
operators the associative operators plus SetEQ and SetNE, when
applied to any type.
2. For consistency, I added two methods to the Instruction class --
"bool isAssociative() const" and "bool isCommutative() const" so
that there is a single location where knowledge about
commutativity and associativity lives. I changed Reassociate.cpp,
ValueNumbering.cpp, and swapOperands in iOperators.cpp to use
these new methods.
3. ReassociateExpr was changing (a+b)+c into a+(b+c), which is a
problem of the definition of c does not dominate (b+c). I fixed
this by creating a new instruction for (b+c) and inserting it just
before the instruction that calculates a+(b+c). I'm confident
that this approach is correct, but may increase register pressure
since it may extend the live ranges of b&c.
4. I wiggled the main loop in ReassociateBB around a bit to try and
preserve instruction names. Placing the Sub test before the
reassociate test makes the iterator manipulation simpler.
Let me know what you think.
Casey at Carter.net
ccarter at uiuc.edu
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
More information about the llvm-bugs