[llvm] [VPlan] Introduce VPIRFlags::getNWFlagsOrNone (NFC) (PR #207176)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 14 00:05:43 PDT 2026
https://github.com/artagnon updated https://github.com/llvm/llvm-project/pull/207176
>From d391ad5d1b69e480d5940e33c6919dc4f8678841 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <artagnon at tenstorrent.com>
Date: Thu, 2 Jul 2026 13:56:26 +0100
Subject: [PATCH 1/2] [VPlan] Introduce VPIRFlags::getNWFlagsOrNone (NFC)
Similar to getFMFOrNone. Also introduce a default WrapFlagsTy
constructor to go along with it.
---
llvm/lib/Transforms/Vectorize/VPlan.h | 15 ++++++---------
.../lib/Transforms/Vectorize/VPlanTransforms.cpp | 16 ++++++++--------
llvm/lib/Transforms/Vectorize/VPlanUnroll.cpp | 3 +--
3 files changed, 15 insertions(+), 19 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index 46e2ad4716323..ae80c52dc0135 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -707,6 +707,7 @@ class VPIRFlags {
char HasNSW : 1;
WrapFlagsTy(bool HasNUW, bool HasNSW) : HasNUW(HasNUW), HasNSW(HasNSW) {}
+ WrapFlagsTy() : HasNUW(false), HasNSW(false) {}
};
struct TruncFlagsTy {
@@ -1026,20 +1027,16 @@ class VPIRFlags {
}
}
- bool hasNoWrapFlags() const {
+ WrapFlagsTy getNoWrapFlagsOrNone() const {
switch (OpType) {
case OperationType::OverflowingBinOp:
case OperationType::Trunc:
- return true;
+ return {hasNoUnsignedWrap(), hasNoSignedWrap()};
default:
- return false;
+ return {};
}
}
- WrapFlagsTy getNoWrapFlags() const {
- return {hasNoUnsignedWrap(), hasNoSignedWrap()};
- }
-
bool isDisjoint() const {
assert(OpType == OperationType::DisjointOp &&
"recipe cannot have a disjoing flag");
@@ -4098,7 +4095,7 @@ class VPCurrentIterationPHIRecipe : public VPHeaderPHIRecipe {
class VPWidenCanonicalIVRecipe : public VPRecipeWithIRFlags {
public:
VPWidenCanonicalIVRecipe(VPRegionValue *CanonicalIV,
- const VPIRFlags::WrapFlagsTy &Flags = {false, false})
+ const VPIRFlags::WrapFlagsTy &Flags = {})
: VPRecipeWithIRFlags(VPRecipeBase::VPWidenCanonicalIVSC, CanonicalIV,
CanonicalIV->getType(), Flags) {}
@@ -4106,7 +4103,7 @@ class VPWidenCanonicalIVRecipe : public VPRecipeWithIRFlags {
VPWidenCanonicalIVRecipe *clone() override {
auto *WideCanIV =
- new VPWidenCanonicalIVRecipe(getCanonicalIV(), getNoWrapFlags());
+ new VPWidenCanonicalIVRecipe(getCanonicalIV(), getNoWrapFlagsOrNone());
if (VPValue *Step = getStepValue())
WideCanIV->addPerPartStep(Step);
return WideCanIV;
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 67a01c85907c9..785e06210dba8 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -785,7 +785,7 @@ void VPlanTransforms::replaceWideCanonicalIVWithWideIV(
VPValue *StepV = Plan.getConstantInt(CanIVTy, 1);
auto *NewWideIV = new VPWidenIntOrFpInductionRecipe(
/*IV=*/nullptr, Plan.getZero(CanIVTy), StepV, &Plan.getVF(), ID,
- WideCanIV->getNoWrapFlags(), WideCanIV->getDebugLoc());
+ WideCanIV->getNoWrapFlagsOrNone(), WideCanIV->getDebugLoc());
NewWideIV->insertBefore(&*Header->getFirstNonPhi());
WideCanIV->replaceAllUsesWith(NewWideIV);
WideCanIV->eraseFromParent();
@@ -2985,9 +2985,9 @@ addVPLaneMaskPhiAndUpdateExitBranch(VPlan &Plan) {
VPValue *TC = Plan.getTripCount();
VPValue *VF = &Plan.getVF();
- auto *EntryIncrement = Builder.createOverflowingOp(
- VPInstruction::CanonicalIVIncrementForPart, {StartV, VF}, {false, false},
- DL, "index.part.next");
+ auto *EntryIncrement =
+ Builder.createOverflowingOp(VPInstruction::CanonicalIVIncrementForPart,
+ {StartV, VF}, {}, DL, "index.part.next");
// Create the active lane mask instruction in the VPlan preheader.
VPValue *ALMMultiplier =
@@ -3009,7 +3009,7 @@ addVPLaneMaskPhiAndUpdateExitBranch(VPlan &Plan) {
Builder.setInsertPoint(OriginalTerminator);
auto *InLoopIncrement = Builder.createOverflowingOp(
VPInstruction::CanonicalIVIncrementForPart,
- {CanonicalIVIncrement, &Plan.getVF()}, {false, false}, DL);
+ {CanonicalIVIncrement, &Plan.getVF()}, {}, DL);
auto *ALM = Builder.createNaryOp(VPInstruction::ActiveLaneMask,
{InLoopIncrement, TC, ALMMultiplier}, DL,
"active.lane.mask.next");
@@ -3536,7 +3536,7 @@ void VPlanTransforms::addExplicitVectorLength(
auto *NextIter = Builder.createAdd(
OpVPEVL, CurrentIteration, CanonicalIVIncrement->getDebugLoc(),
- "current.iteration.next", CanonicalIVIncrement->getNoWrapFlags());
+ "current.iteration.next", CanonicalIVIncrement->getNoWrapFlagsOrNone());
CurrentIteration->addBackedgeValue(NextIter);
VPValue *NextAVL =
@@ -4278,7 +4278,7 @@ void VPlanTransforms::convertToConcreteRecipes(VPlan &Plan) {
Step, Builder.createNaryOp(VPInstruction::StepVector, {}, CanIVTy));
VPValue *CanVecIV =
Builder.createAdd(CanIV, Step, WideCanIV->getDebugLoc(), "vec.iv",
- WideCanIV->getNoWrapFlags());
+ WideCanIV->getNoWrapFlagsOrNone());
WideCanIV->replaceAllUsesWith(CanVecIV);
WideCanIV->eraseFromParent();
continue;
@@ -4355,7 +4355,7 @@ void VPlanTransforms::convertToConcreteRecipes(VPlan &Plan) {
m_VPInstruction<VPInstruction::CanonicalIVIncrementForPart>())) {
auto *VPI = cast<VPInstruction>(&R);
VPValue *Add = Builder.createOverflowingOp(
- Instruction::Add, VPI->operands(), VPI->getNoWrapFlags(),
+ Instruction::Add, VPI->operands(), VPI->getNoWrapFlagsOrNone(),
VPI->getDebugLoc());
VPI->replaceAllUsesWith(Add);
VPI->eraseFromParent();
diff --git a/llvm/lib/Transforms/Vectorize/VPlanUnroll.cpp b/llvm/lib/Transforms/Vectorize/VPlanUnroll.cpp
index 594c201d5a8cb..4b63a212b808c 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanUnroll.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanUnroll.cpp
@@ -179,8 +179,7 @@ void UnrollState::unrollWidenInductionByUF(
VPIRFlags::WrapFlagsTy WrapFlags(false, false);
if (auto *IntOrFPInd = dyn_cast<VPWidenIntOrFpInductionRecipe>(IV)) {
FMF = IntOrFPInd->getFastMathFlagsOrNone();
- if (IntOrFPInd->hasNoWrapFlags())
- WrapFlags = IntOrFPInd->getNoWrapFlags();
+ WrapFlags = IntOrFPInd->getNoWrapFlagsOrNone();
}
VPValue *ScalarStep = IV->getStepValue();
>From fe511e2f35cdaa37747a1ec8fb362e3dfd2cb3f6 Mon Sep 17 00:00:00 2001
From: Ramkumar Ramachandra <artagnon at tenstorrent.com>
Date: Tue, 14 Jul 2026 07:58:16 +0100
Subject: [PATCH 2/2] [VPlan] Reinstate getNWFlags
---
llvm/lib/Transforms/Vectorize/VPlan.h | 6 +++++-
llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp | 8 ++++----
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index ae80c52dc0135..a55d85f6f115d 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -1037,6 +1037,10 @@ class VPIRFlags {
}
}
+ WrapFlagsTy getNoWrapFlags() const {
+ return {hasNoUnsignedWrap(), hasNoSignedWrap()};
+ }
+
bool isDisjoint() const {
assert(OpType == OperationType::DisjointOp &&
"recipe cannot have a disjoing flag");
@@ -4103,7 +4107,7 @@ class VPWidenCanonicalIVRecipe : public VPRecipeWithIRFlags {
VPWidenCanonicalIVRecipe *clone() override {
auto *WideCanIV =
- new VPWidenCanonicalIVRecipe(getCanonicalIV(), getNoWrapFlagsOrNone());
+ new VPWidenCanonicalIVRecipe(getCanonicalIV(), getNoWrapFlags());
if (VPValue *Step = getStepValue())
WideCanIV->addPerPartStep(Step);
return WideCanIV;
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 785e06210dba8..0574e32b7cd99 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -785,7 +785,7 @@ void VPlanTransforms::replaceWideCanonicalIVWithWideIV(
VPValue *StepV = Plan.getConstantInt(CanIVTy, 1);
auto *NewWideIV = new VPWidenIntOrFpInductionRecipe(
/*IV=*/nullptr, Plan.getZero(CanIVTy), StepV, &Plan.getVF(), ID,
- WideCanIV->getNoWrapFlagsOrNone(), WideCanIV->getDebugLoc());
+ WideCanIV->getNoWrapFlags(), WideCanIV->getDebugLoc());
NewWideIV->insertBefore(&*Header->getFirstNonPhi());
WideCanIV->replaceAllUsesWith(NewWideIV);
WideCanIV->eraseFromParent();
@@ -3536,7 +3536,7 @@ void VPlanTransforms::addExplicitVectorLength(
auto *NextIter = Builder.createAdd(
OpVPEVL, CurrentIteration, CanonicalIVIncrement->getDebugLoc(),
- "current.iteration.next", CanonicalIVIncrement->getNoWrapFlagsOrNone());
+ "current.iteration.next", CanonicalIVIncrement->getNoWrapFlags());
CurrentIteration->addBackedgeValue(NextIter);
VPValue *NextAVL =
@@ -4278,7 +4278,7 @@ void VPlanTransforms::convertToConcreteRecipes(VPlan &Plan) {
Step, Builder.createNaryOp(VPInstruction::StepVector, {}, CanIVTy));
VPValue *CanVecIV =
Builder.createAdd(CanIV, Step, WideCanIV->getDebugLoc(), "vec.iv",
- WideCanIV->getNoWrapFlagsOrNone());
+ WideCanIV->getNoWrapFlags());
WideCanIV->replaceAllUsesWith(CanVecIV);
WideCanIV->eraseFromParent();
continue;
@@ -4355,7 +4355,7 @@ void VPlanTransforms::convertToConcreteRecipes(VPlan &Plan) {
m_VPInstruction<VPInstruction::CanonicalIVIncrementForPart>())) {
auto *VPI = cast<VPInstruction>(&R);
VPValue *Add = Builder.createOverflowingOp(
- Instruction::Add, VPI->operands(), VPI->getNoWrapFlagsOrNone(),
+ Instruction::Add, VPI->operands(), VPI->getNoWrapFlags(),
VPI->getDebugLoc());
VPI->replaceAllUsesWith(Add);
VPI->eraseFromParent();
More information about the llvm-commits
mailing list