Fix PR1015 and Transforms/IndVarsSimplify/2007-01-06-TripCount.ll, a
authorChris Lattner <sabre@nondot.org>
Sun, 7 Jan 2007 02:24:26 +0000 (02:24 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 7 Jan 2007 02:24:26 +0000 (02:24 +0000)
miscompilation of Qt.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32974 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ScalarEvolution.cpp

index e2a03c89241d0e879998102e37eb03928551d335..cc483b8d13775e841040e4f552da97f301aa54f5 100644 (file)
@@ -1498,12 +1498,26 @@ SCEVHandle ScalarEvolutionsImpl::ComputeIterationCount(const Loop *L) {
   BranchInst *ExitBr = dyn_cast<BranchInst>(ExitingBlock->getTerminator());
   if (ExitBr == 0) return UnknownValue;
   assert(ExitBr->isConditional() && "If unconditional, it can't be in loop!");
+  
+  // At this point, we know we have a conditional branch that determines whether
+  // the loop is exited.  However, we don't know if the branch is executed each
+  // time through the loop.  If not, then the execution count of the branch will
+  // not be equal to the trip count of the loop.
+  //
+  // Currently we check for this by checking to see if the Exit branch goes to
+  // the loop header.  If so, we know it will always execute the same number of
+  // times as the loop.  More extensive analysis could be done to handle more
+  // cases here.
+  if (ExitBr->getSuccessor(0) != L->getHeader() &&
+      ExitBr->getSuccessor(1) != L->getHeader())
+    return UnknownValue;
+  
   ICmpInst *ExitCond = dyn_cast<ICmpInst>(ExitBr->getCondition());
 
   // If its not an integer comparison then compute it the hard way. 
   // Note that ICmpInst deals with pointer comparisons too so we must check
   // the type of the operand.
-  if (ExitCond == 0 || !ExitCond->getOperand(0)->getType()->isIntegral()) 
+  if (ExitCond == 0 || isa<PointerType>(ExitCond->getOperand(0)->getType()))
     return ComputeIterationCountExhaustively(L, ExitBr->getCondition(),
                                           ExitBr->getSuccessor(0) == ExitBlock);