diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -11633,13 +11633,15 @@ // a) IV is either nuw or nsw depending upon signedness (indicated by the // NoWrap flag). // b) loop is single exit with no side effects. + // c) loop has no abnormal exits // // // Precondition a) implies that if the stride is negative, this is a single // trip loop. The backedge taken count formula reduces to zero in this case. // - // Precondition b) implies that if rhs is invariant in L, then unknown - // stride being zero means the backedge can't be taken without UB. + // Precondition b) and c) combine to imply that if rhs is invariant in L, + // then a zero stride means the backedge can't be taken without executing + // undefined behavior. // // The positive stride case is the same as isKnownPositive(Stride) returning // true (original behavior of the function). @@ -11657,7 +11659,7 @@ // A[i] = i; // if (PredicatedIV || !NoWrap || isKnownNonPositive(Stride) || - !loopIsFiniteByAssumption(L)) + !loopIsFiniteByAssumption(L) || !loopHasNoAbnormalExits(L)) return getCouldNotCompute(); if (!isKnownNonZero(Stride)) {