[llvm] [SCEV] Strengthen nuw/nsw on add/mul with CR (PR #217638)

Krzysztof Drewniak via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 20 10:30:43 PDT 2026


================
@@ -2514,20 +2509,18 @@ static SCEV::NoWrapFlags StrengthenNoWrapFlags(ScalarEvolution *SE,
       }
     }();
 
-    const APInt &C = cast<SCEVConstant>(Ops[0])->getAPInt();
-
     // (A <opcode> C) --> (A <opcode> C)<nsw> if the op doesn't sign overflow.
-    if (!(SignOrUnsignWrap & SCEV::FlagNSW)) {
+    if (!ScalarEvolution::hasFlags(Flags, SCEV::FlagNSW)) {
       auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
-          Opcode, C, OBO::NoSignedWrap);
+          Opcode, SE->getSignedRange(Ops[0]), OBO::NoSignedWrap);
       if (NSWRegion.contains(SE->getSignedRange(Ops[1])))
         Flags = ScalarEvolution::setFlags(Flags, SCEV::FlagNSW);
     }
 
     // (A <opcode> C) --> (A <opcode> C)<nuw> if the op doesn't unsign overflow.
-    if (!(SignOrUnsignWrap & SCEV::FlagNUW)) {
+    if (!ScalarEvolution::hasFlags(Flags, SCEV::FlagNUW)) {
       auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
-          Opcode, C, OBO::NoUnsignedWrap);
+          Opcode, SE->getUnsignedRange(Ops[0]), OBO::NoUnsignedWrap);
----------------
krzysz00 wrote:

Perhaps the compile time hit can be mitigated by some sort of memoization for these ranges?

https://github.com/llvm/llvm-project/pull/217638


More information about the llvm-commits mailing list