[llvm] change contents of ScalarEvolution from private to protected (PR #83052)
Eli Friedman via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 20 17:03:39 PDT 2024
================
@@ -9204,16 +9270,33 @@ ScalarEvolution::ExitLimit ScalarEvolution::computeExitLimitFromICmp(
}
case ICmpInst::ICMP_SGE:
case ICmpInst::ICMP_UGE:
- // Since the loop is finite, an invariant RHS cannot include the boundary
- // value, otherwise it would loop forever.
- if (!EnableFiniteLoopControl || !ControllingFiniteLoop ||
- !isLoopInvariant(RHS, L))
- break;
- RHS = getAddExpr(getMinusOne(RHS->getType()), RHS);
+ if (!AssumeLoopFinite) {
+ // Since the loop is finite, an invariant RHS cannot include the boundary
+ // value, otherwise it would loop forever.
+ if (!EnableFiniteLoopControl || !ControllingFiniteLoop ||
+ !isLoopInvariant(RHS, L))
+ break;
+ RHS = getAddExpr(getMinusOne(RHS->getType()), RHS);
+ }
[[fallthrough]];
case ICmpInst::ICMP_SGT:
case ICmpInst::ICMP_UGT: { // while (X > Y)
bool IsSigned = ICmpInst::isSigned(Pred);
+ if (AssumeLoopFinite) {
+ if (Pred == ICmpInst::ICMP_SGE || Pred == ICmpInst::ICMP_UGE) {
+ if (!isa<IntegerType>(RHS->getType()))
+ break;
+ SmallVector<const SCEV *, 2> sv = {
+ RHS, getConstant(
+ ConstantInt::get(cast<IntegerType>(RHS->getType()), -1))};
+ // Since this is not an infinite loop by induction, RHS cannot be
+ // int_min/uint_min Therefore subtracting 1 does not wrap.
+ if (IsSigned)
+ RHS = getAddExpr(sv, SCEV::FlagNSW);
+ else
+ RHS = getAddExpr(sv, SCEV::FlagNUW);
----------------
efriedma-quic wrote:
This looks like duplicated code from above (the EnableFiniteLoopControl bit).
https://github.com/llvm/llvm-project/pull/83052
More information about the llvm-commits
mailing list