diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2011-10-24 04:00:25 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2011-10-24 04:00:25 +0000 |
commit | 38af3d5a8dbcada6f264d3a268f525a827adaca2 (patch) | |
tree | d868789fe084d5ee09e64f921ebadfc8f8cd43a0 /lib | |
parent | 5d0700786d53046b3d5d7fe0d8d207290a13872c (diff) | |
download | external_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.cpp | 52 |
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. |