diff options
author | Andrew Trick <atrick@apple.com> | 2011-04-27 01:21:25 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2011-04-27 01:21:25 +0000 |
commit | 3f95c88162cf319bce463d0e5e2d99a96c24dff6 (patch) | |
tree | 1eab2736a719d417b069f6010c2ef07f89bc961b /lib/Analysis/ScalarEvolution.cpp | |
parent | cb5fd743a95898ddefd75b6d104f5e91c0d50b23 (diff) |
Fix for PR9633 [indvars] Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed.
Added a type check in ScalarEvolution::computeSCEVAtScope to handle the case in which operands of an
AddRecExpr in the current scope are folded.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130271 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/ScalarEvolution.cpp')
-rw-r--r-- | lib/Analysis/ScalarEvolution.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 3f69ce80f4..9396b07dab 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -4701,9 +4701,14 @@ const SCEV *ScalarEvolution::computeSCEVAtScope(const SCEV *V, const Loop *L) { for (++i; i != e; ++i) NewOps.push_back(getSCEVAtScope(AddRec->getOperand(i), L)); - AddRec = cast<SCEVAddRecExpr>( + const SCEV *FoldedRec = getAddRecExpr(NewOps, AddRec->getLoop(), - AddRec->getNoWrapFlags(SCEV::FlagNW))); + AddRec->getNoWrapFlags(SCEV::FlagNW)); + AddRec = dyn_cast<SCEVAddRecExpr>(FoldedRec); + // In cases with "undef" values, a loop's own recurrence may + // fold into a constant. Go ahead and return the optimistic value. + if (!AddRec) + return FoldedRec; break; } |