Now that Reassociate's LinearizeExprTree can look through arbitrary expression
authorDuncan Sands <baldrick@free.fr>
Tue, 12 Jun 2012 14:33:56 +0000 (14:33 +0000)
committerDuncan Sands <baldrick@free.fr>
Tue, 12 Jun 2012 14:33:56 +0000 (14:33 +0000)
commitc038a7833565ecf92a699371d448135a097c9e2f
tree3df170cfa4feeaad9409335ee997d76551bcf483
parent3f696e568bae8afa5986e7af48156c2bac041ba7
Now that Reassociate's LinearizeExprTree can look through arbitrary expression
topologies, it is quite possible for a leaf node to have huge multiplicity, for
example: x0 = x*x, x1 = x0*x0, x2 = x1*x1, ... rapidly gives a value which is x
raised to a vast power (the multiplicity, or weight, of x).  This patch fixes
the computation of weights by correctly computing them no matter how big they
are, rather than just overflowing and getting a wrong value.  It turns out that
the weight for a value never needs more bits to represent than the value itself,
so it is enough to represent weights as APInts of the same bitwidth and do the
right overflow-avoiding dance steps when computing weights.  As a side-effect it
reduces the number of multiplies needed in some cases of large powers.  While
there, in view of external uses (eg by the vectorizer) I made LinearizeExprTree
static, pushing the rank computation out into users.  This is progress towards
fixing PR13021.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158358 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Constants.h
include/llvm/Instruction.h
lib/Transforms/Scalar/Reassociate.cpp
lib/VMCore/Constants.cpp
lib/VMCore/Instruction.cpp
test/Transforms/Reassociate/repeats.ll [new file with mode: 0644]