[llvm] [CVP] Extract computeNoWrapFlags helper from processBinOp (NFC). (PR #207527)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sat Jul 4 09:48:47 PDT 2026
https://github.com/fhahn created https://github.com/llvm/llvm-project/pull/207527
Pull the per-operand-range no-wrap deduction in processBinOp out into a standalone computeNoWrapFlags helper to be re-used in https://github.com/llvm/llvm-project/pull/207522.
>From 798f16167ebdb592e210171ec363b2c6d51ee845 Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Fri, 3 Jul 2026 17:47:44 +0100
Subject: [PATCH] [CVP] Extract computeNoWrapFlags helper from processBinOp
(NFC).
Pull the per-operand-range no-wrap deduction in processBinOp out into a
standalone computeNoWrapFlags helper to be re-used in
https://github.com/llvm/llvm-project/pull/207522.
---
.../Scalar/CorrelatedValuePropagation.cpp | 47 ++++++++++++-------
1 file changed, 30 insertions(+), 17 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
index ff0b70b51e5f7..f893f5281ceff 100644
--- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -1176,9 +1176,33 @@ static bool processSIToFP(SIToFPInst *SIToFP, LazyValueInfo *LVI) {
return true;
}
-static bool processBinOp(BinaryOperator *BinOp, LazyValueInfo *LVI) {
+namespace {
+struct NoWrapFlags {
+ bool NSW = false;
+ bool NUW = false;
+};
+} // namespace
+
+// Check if the requested no-wrap flags are valid for \p Opcode on \p LRange and
+// \p RRange.
+static NoWrapFlags computeNoWrapFlags(Instruction::BinaryOps Opcode,
+ const ConstantRange &LRange,
+ const ConstantRange &RRange,
+ bool CheckNSW, bool CheckNUW) {
using OBO = OverflowingBinaryOperator;
+ NoWrapFlags Flags;
+ if (CheckNUW)
+ Flags.NUW = ConstantRange::makeGuaranteedNoWrapRegion(Opcode, RRange,
+ OBO::NoUnsignedWrap)
+ .contains(LRange);
+ if (CheckNSW)
+ Flags.NSW = ConstantRange::makeGuaranteedNoWrapRegion(Opcode, RRange,
+ OBO::NoSignedWrap)
+ .contains(LRange);
+ return Flags;
+}
+static bool processBinOp(BinaryOperator *BinOp, LazyValueInfo *LVI) {
bool NSW = BinOp->hasNoSignedWrap();
bool NUW = BinOp->hasNoUnsignedWrap();
if (NSW && NUW)
@@ -1190,24 +1214,13 @@ static bool processBinOp(BinaryOperator *BinOp, LazyValueInfo *LVI) {
ConstantRange RRange = LVI->getConstantRangeAtUse(BinOp->getOperandUse(1),
/*UndefAllowed=*/false);
- bool Changed = false;
- bool NewNUW = false, NewNSW = false;
- if (!NUW) {
- ConstantRange NUWRange = ConstantRange::makeGuaranteedNoWrapRegion(
- Opcode, RRange, OBO::NoUnsignedWrap);
- NewNUW = NUWRange.contains(LRange);
- Changed |= NewNUW;
- }
- if (!NSW) {
- ConstantRange NSWRange = ConstantRange::makeGuaranteedNoWrapRegion(
- Opcode, RRange, OBO::NoSignedWrap);
- NewNSW = NSWRange.contains(LRange);
- Changed |= NewNSW;
- }
+ NoWrapFlags New =
+ computeNoWrapFlags(Opcode, LRange, RRange, /*CheckNSW=*/!NSW,
+ /*CheckNUW=*/!NUW);
- setDeducedOverflowingFlags(BinOp, Opcode, NewNSW, NewNUW);
+ setDeducedOverflowingFlags(BinOp, Opcode, New.NSW, New.NUW);
- return Changed;
+ return New.NSW || New.NUW;
}
static bool processAnd(BinaryOperator *BinOp, LazyValueInfo *LVI) {
More information about the llvm-commits
mailing list