diff options
author | Dan Gohman <gohman@apple.com> | 2010-08-12 15:00:23 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-08-12 15:00:23 +0000 |
commit | 727356fc7d6898f1628f2a64930fe46b3540050d (patch) | |
tree | a101052892eac5f104f10c458dc495b362de65f5 /lib/Analysis/ScalarEvolution.cpp | |
parent | 918e76b8b5e1766db25004bafb8148387b5709e1 (diff) |
Optimize ScalarEvolution::getAddExpr's operand factoring code by
having it finish processing all of the muliply operands before
starting the whole getAddExpr process over again, instead of
immediately after the first simplification.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110916 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/ScalarEvolution.cpp')
-rw-r--r-- | lib/Analysis/ScalarEvolution.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 1803c3c7b5..394e0159db 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -1541,6 +1541,7 @@ const SCEV *ScalarEvolution::getAddExpr(SmallVectorImpl<const SCEV *> &Ops, } // Check this multiply against other multiplies being added together. + bool AnyFold = false; for (unsigned OtherMulIdx = Idx+1; OtherMulIdx < Ops.size() && isa<SCEVMulExpr>(Ops[OtherMulIdx]); ++OtherMulIdx) { @@ -1568,12 +1569,14 @@ const SCEV *ScalarEvolution::getAddExpr(SmallVectorImpl<const SCEV *> &Ops, const SCEV *InnerMulSum = getAddExpr(InnerMul1,InnerMul2); const SCEV *OuterMul = getMulExpr(MulOpSCEV, InnerMulSum); if (Ops.size() == 2) return OuterMul; - Ops.erase(Ops.begin()+Idx); - Ops.erase(Ops.begin()+OtherMulIdx-1); - Ops.push_back(OuterMul); - return getAddExpr(Ops); + Ops[Idx] = OuterMul; + Ops.erase(Ops.begin()+OtherMulIdx); + OtherMulIdx = Idx; + AnyFold = true; } } + if (AnyFold) + return getAddExpr(Ops); } } |