Changes in directory llvm/lib/Analysis:
ScalarEvolution.cpp updated: 1.79 -> 1.80 --- Log message: Fix PR1015: http://llvm.org/PR1015 and Transforms/IndVarsSimplify/2007-01-06-TripCount.ll, a miscompilation of Qt. --- Diffs of the changes: (+15 -1) ScalarEvolution.cpp | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletion(-) Index: llvm/lib/Analysis/ScalarEvolution.cpp diff -u llvm/lib/Analysis/ScalarEvolution.cpp:1.79 llvm/lib/Analysis/ScalarEvolution.cpp:1.80 --- llvm/lib/Analysis/ScalarEvolution.cpp:1.79 Sat Jan 6 20:05:20 2007 +++ llvm/lib/Analysis/ScalarEvolution.cpp Sat Jan 6 20:24:26 2007 @@ -1498,12 +1498,26 @@ 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); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits