[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