diff --git a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp index f5b9cd78cb5d8..61acf3ab61a22 100644 --- a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp @@ -43,7 +43,9 @@ STATISTIC( STATISTIC( NumSimplifiedSRem, "Number of IV signed remainder operations converted to unsigned remainder"); -STATISTIC(NumElimCmp , "Number of IV comparisons eliminated"); +STATISTIC(NumElimCmp, "Number of IV comparisons eliminated"); +STATISTIC(NumInvariantCmp, "Number of IV comparisons made loop invariant"); +STATISTIC(NumSameSign, "Number of IV comparisons with new samesign flags"); namespace { /// This is a utility for simplifying induction variables @@ -275,11 +277,20 @@ void SimplifyIndvar::eliminateIVComparison(ICmpInst *ICmp, ICmp->replaceAllUsesWith(ConstantInt::getBool(ICmp->getContext(), *Ev)); DeadInsts.emplace_back(ICmp); LLVM_DEBUG(dbgs() << "INDVARS: Eliminated comparison: " << *ICmp << '\n'); - } else if (makeIVComparisonInvariant(ICmp, IVOperand)) { - // fallthrough to end of function - } else if ((ICmpInst::isSigned(OriginalPred) || - (ICmpInst::isUnsigned(OriginalPred) && !ICmp->hasSameSign())) && - SE->haveSameSign(S, X)) { + ++NumElimCmp; + Changed = true; + return; + } + + if (makeIVComparisonInvariant(ICmp, IVOperand)) { + ++NumInvariantCmp; + Changed = true; + return; + } + + if ((ICmpInst::isSigned(OriginalPred) || + (ICmpInst::isUnsigned(OriginalPred) && !ICmp->hasSameSign())) && + SE->haveSameSign(S, X)) { // Set the samesign flag on the compare if legal, and canonicalize to // the unsigned variant (for signed compares) hoping that it will open // the doors for other optimizations. Note that we cannot rely on Pred @@ -289,11 +300,10 @@ void SimplifyIndvar::eliminateIVComparison(ICmpInst *ICmp, << '\n'); ICmp->setPredicate(ICmpInst::getUnsignedPredicate(OriginalPred)); ICmp->setSameSign(); - } else + NumSameSign++; + Changed = true; return; - - ++NumElimCmp; - Changed = true; + } } bool SimplifyIndvar::eliminateSDiv(BinaryOperator *SDiv) {