Index: llvm/lib/Analysis/ScalarEvolution.cpp =================================================================== --- llvm/lib/Analysis/ScalarEvolution.cpp +++ llvm/lib/Analysis/ScalarEvolution.cpp @@ -6582,15 +6582,11 @@ // instructions can map to the same SCEV. If we apply NSW or NUW from I to // the SCEV, we must guarantee no wrapping for that SCEV also when it is // derived from other instructions that map to the same SCEV. We cannot make - // that guarantee for cases where I is not executed. So we need to find the - // loop that I is considered in relation to and prove that I is executed for - // every iteration of that loop. That implies that the value that I - // calculates does not wrap anywhere in the loop, so then we can apply the - // flags to the SCEV. - // - // We check isLoopInvariant to disambiguate in case we are adding recurrences - // from different loops, so that we know which loop to prove that I is - // executed in. + // that guarantee for cases where I is not executed. So we need to find a + // upper bound on the defining scope for the SCEV, and prove that I is + // executed every time we enter that scope. (When the bounding scope is a + // loop (the common case), this is equivalent to proving I executes on every + // iteration of that loop. for (const Use &Op : I->operands()) { // I could be an extractvalue from a call to an overflow intrinsic. // TODO: We can do better here in some cases. @@ -6598,14 +6594,7 @@ return false; const SCEV *OpS = getSCEV(Op); if (auto *AddRecS = dyn_cast(OpS)) { - const bool AllOtherOpsLoopInvariant = - llvm::all_of(I->operands(), [&](const Use &Op2) -> bool { - if (Op.getOperandNo() == Op2.getOperandNo()) - return true; - const SCEV *OtherOp = getSCEV(Op2); - return isLoopInvariant(OtherOp, AddRecS->getLoop()); - }); - if (AllOtherOpsLoopInvariant && + if (AddRecS->getLoop() == InnermostContainingLoop && isGuaranteedToExecuteForEveryIteration(I, AddRecS->getLoop())) return true; }