[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