aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/ScalarEvolution.cpp
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2007-06-18 19:30:09 +0000
committerDan Gohman <gohman@apple.com>2007-06-18 19:30:09 +0000
commitf50cd749e1504cea64a432757d49831ab0e23c70 (patch)
treef712460042085b259d2d270682c32e7f79404fbf /lib/Analysis/ScalarEvolution.cpp
parent03265f98a3b2f49ecd0c01b868e0a9c844c3eeb7 (diff)
In SCEVAddExpr::get, skip over any cast operands before looking for nested
add operands after constant operands. The recent change to recognize sign-extend expressions caused this to be exposed more often. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37628 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/ScalarEvolution.cpp')
-rw-r--r--lib/Analysis/ScalarEvolution.cpp7
1 files changed, 5 insertions, 2 deletions
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp
index 3ae65286fa..ed8ea32767 100644
--- a/lib/Analysis/ScalarEvolution.cpp
+++ b/lib/Analysis/ScalarEvolution.cpp
@@ -685,8 +685,11 @@ SCEVHandle SCEVAddExpr::get(std::vector<SCEVHandle> &Ops) {
return SCEVAddExpr::get(Ops);
}
- // Okay, now we know the first non-constant operand. If there are add
- // operands they would be next.
+ // Now we know the first non-constant operand. Skip past any cast SCEVs.
+ while (Idx < Ops.size() && Ops[Idx]->getSCEVType() < scAddExpr)
+ ++Idx;
+
+ // If there are add operands they would be next.
if (Idx < Ops.size()) {
bool DeletedAdd = false;
while (SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(Ops[Idx])) {