aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2011-10-24 04:00:25 +0000
committerNick Lewycky <nicholas@mxc.ca>2011-10-24 04:00:25 +0000
commit38af3d5a8dbcada6f264d3a268f525a827adaca2 (patch)
treed868789fe084d5ee09e64f921ebadfc8f8cd43a0 /lib
parent5d0700786d53046b3d5d7fe0d8d207290a13872c (diff)
downloadexternal_llvm-38af3d5a8dbcada6f264d3a268f525a827adaca2.zip
external_llvm-38af3d5a8dbcada6f264d3a268f525a827adaca2.tar.gz
external_llvm-38af3d5a8dbcada6f264d3a268f525a827adaca2.tar.bz2
Speculatively revert r142781. Bots are showing
Assertion `i_nocapture < OperandTraits<PHINode>::operands(this) && "getOperand() out of range!"' failed. coming out of indvars. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142786 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Analysis/ScalarEvolution.cpp52
1 files changed, 20 insertions, 32 deletions
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp
index 3d1fa95..2da8e6f 100644
--- a/lib/Analysis/ScalarEvolution.cpp
+++ b/lib/Analysis/ScalarEvolution.cpp
@@ -4882,33 +4882,29 @@ const SCEV *ScalarEvolution::ComputeExitCountExhaustively(const Loop *L,
// That's the only form we support here.
if (PN->getNumIncomingValues() != 2) return getCouldNotCompute();
- DenseMap<Instruction *, Constant *> CurrentIterVals;
- BasicBlock *Header = L->getHeader();
- assert(PN->getParent() == Header && "Can't evaluate PHI not in loop header!");
-
// One entry must be a constant (coming in from outside of the loop), and the
// second must be derived from the same PHI.
bool SecondIsBackedge = L->contains(PN->getIncomingBlock(1));
- PHINode *PHI = 0;
- for (BasicBlock::iterator I = Header->begin();
- (PHI = dyn_cast<PHINode>(I)); ++I) {
- Constant *StartCST =
- dyn_cast<Constant>(PHI->getIncomingValue(!SecondIsBackedge));
- if (StartCST == 0) continue;
- CurrentIterVals[PHI] = StartCST;
- }
- if (!CurrentIterVals.count(PN))
- return getCouldNotCompute();
+ Constant *StartCST =
+ dyn_cast<Constant>(PN->getIncomingValue(!SecondIsBackedge));
+ if (StartCST == 0) return getCouldNotCompute(); // Must be a constant.
+
+ Value *BEValue = PN->getIncomingValue(SecondIsBackedge);
+ if (getConstantEvolvingPHI(BEValue, L) != PN &&
+ !isa<Constant>(BEValue))
+ return getCouldNotCompute(); // Not derived from same PHI.
// Okay, we find a PHI node that defines the trip count of this loop. Execute
// the loop symbolically to determine when the condition gets a value of
// "ExitWhen".
-
- unsigned MaxIterations = MaxBruteForceIterations; // Limit analysis.
- for (unsigned IterationNum = 0; IterationNum != MaxIterations;++IterationNum){
+ unsigned IterationNum = 0;
+ unsigned MaxIterations = MaxBruteForceIterations; // Limit analysis.
+ for (Constant *PHIVal = StartCST;
+ IterationNum != MaxIterations; ++IterationNum) {
+ DenseMap<Instruction *, Constant *> PHIValMap;
+ PHIValMap[PN] = PHIVal;
ConstantInt *CondVal =
- dyn_cast_or_null<ConstantInt>(EvaluateExpression(Cond, L,
- CurrentIterVals, TD));
+ dyn_cast_or_null<ConstantInt>(EvaluateExpression(Cond, L, PHIValMap, TD));
// Couldn't symbolically evaluate.
if (!CondVal) return getCouldNotCompute();
@@ -4918,19 +4914,11 @@ const SCEV *ScalarEvolution::ComputeExitCountExhaustively(const Loop *L,
return getConstant(Type::getInt32Ty(getContext()), IterationNum);
}
- // Update all the PHI nodes for the next iteration.
- DenseMap<Instruction *, Constant *> NextIterVals;
- for (DenseMap<Instruction *, Constant *>::const_iterator
- I = CurrentIterVals.begin(), E = CurrentIterVals.end(); I != E; ++I){
- PHINode *PHI = dyn_cast<PHINode>(I->first);
- if (!PHI) continue;
- Constant *&NextPHI = NextIterVals[PHI];
- if (NextPHI) continue; // Already computed!
-
- Value *BEValue = PHI->getIncomingValue(SecondIsBackedge);
- NextPHI = EvaluateExpression(BEValue, L, CurrentIterVals, TD);
- }
- CurrentIterVals.swap(NextIterVals);
+ // Compute the value of the PHI node for the next iteration.
+ Constant *NextPHI = EvaluateExpression(BEValue, L, PHIValMap, TD);
+ if (NextPHI == 0 || NextPHI == PHIVal)
+ return getCouldNotCompute();// Couldn't evaluate or not making progress...
+ PHIVal = NextPHI;
}
// Too many iterations were needed to evaluate.