[llvm] [VPlan] Verify VPIRFlags when creating VPWidenRecipe. (PR #213039)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 30 08:00:56 PDT 2026
https://github.com/fhahn created https://github.com/llvm/llvm-project/pull/213039
VPWidenRecipe's constructor didn't check its flags at all, unlike VPInstruction and VPWidenCastRecipe. Add checks and fix remaining violations.
>From 00f14d625324403a321625f04ea1e9f6cfc73b94 Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Thu, 30 Jul 2026 14:02:09 +0100
Subject: [PATCH] [VPlan] Verify VPIRFlags when creating VPWidenRecipe.
VPWidenRecipe's constructor didn't check its flags at all, unlike
VPInstruction and VPWidenCastRecipe. Add checks and fix remaining
violations.
---
llvm/lib/Transforms/Vectorize/VPlan.h | 7 ++++++-
llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp | 11 +++++++----
llvm/unittests/Transforms/Vectorize/VPlanTest.cpp | 8 +++++---
3 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index 1aeed394d7482..983cdc9adbac1 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -1833,7 +1833,12 @@ class LLVM_ABI_FOR_TEST VPWidenRecipe : public VPRecipeWithIRFlags,
: VPRecipeWithIRFlags(VPRecipeBase::VPWidenSC, Operands,
computeScalarTypeForInstruction(Opcode, Operands),
Flags, DL),
- VPIRMetadata(Metadata), Opcode(Opcode) {}
+ VPIRMetadata(Metadata), Opcode(Opcode) {
+ assert(flagsValidForOpcode(Opcode) &&
+ "Set flags not supported for the provided opcode");
+ assert(hasRequiredFlagsForOpcode(Opcode) &&
+ "Opcode requires specific flags to be set");
+ }
~VPWidenRecipe() override = default;
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 3311a9711cb3f..a254c06f5765d 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -4751,8 +4751,9 @@ optimizeExtendsForPartialReduction(VPSingleDefRecipe *Op) {
auto *Min = Builder.insert(
new VPWidenIntrinsicRecipe(IsSigned ? Intrinsic::smin : Intrinsic::umin,
{FreezeX, FreezeY}, SrcTy));
- auto *AbsDiff =
- Builder.insert(new VPWidenRecipe(Instruction::Sub, {Max, Min}));
+ auto *AbsDiff = Builder.insert(
+ new VPWidenRecipe(Instruction::Sub, {Max, Min},
+ VPIRFlags::getDefaultFlags(Instruction::Sub)));
return Builder.createWidenCast(Instruction::CastOps::ZExt, AbsDiff,
Op->getScalarType());
}
@@ -4881,12 +4882,14 @@ static void transformToPartialReduction(const VPPartialReductionChain &Chain,
VPWidenRecipe *NegRecipe;
if (WidenRecipe->getOpcode() == Instruction::FSub) {
NegRecipe =
- new VPWidenRecipe(Instruction::FNeg, {ExtendedOp}, VPIRFlags(),
+ new VPWidenRecipe(Instruction::FNeg, {ExtendedOp},
+ VPIRFlags::getDefaultFlags(Instruction::FNeg),
VPIRMetadata(), DebugLoc::getUnknown());
} else {
auto *Zero = Plan.getZero(ElemTy);
NegRecipe =
- new VPWidenRecipe(Instruction::Sub, {Zero, ExtendedOp}, VPIRFlags(),
+ new VPWidenRecipe(Instruction::Sub, {Zero, ExtendedOp},
+ VPIRFlags::getDefaultFlags(Instruction::Sub),
VPIRMetadata(), DebugLoc::getUnknown());
}
Builder.insert(NegRecipe);
diff --git a/llvm/unittests/Transforms/Vectorize/VPlanTest.cpp b/llvm/unittests/Transforms/Vectorize/VPlanTest.cpp
index f10435dfb2da6..084a97db157a5 100644
--- a/llvm/unittests/Transforms/Vectorize/VPlanTest.cpp
+++ b/llvm/unittests/Transforms/Vectorize/VPlanTest.cpp
@@ -1128,7 +1128,7 @@ TEST_F(VPRecipeTest, CastVPWidenRecipeToVPUser) {
SmallVector<VPValue *, 2> Args;
Args.push_back(Op1);
Args.push_back(Op2);
- VPWidenRecipe WidenR(*AI, Args);
+ VPWidenRecipe WidenR(*AI, Args, VPIRFlags::getDefaultFlags(AI->getOpcode()));
checkVPRecipeCastImpl<VPWidenRecipe, VPUser, VPIRMetadata>(&WidenR);
delete AI;
@@ -1358,7 +1358,8 @@ TEST_F(VPRecipeTest, MayHaveSideEffectsAndMayReadWriteMemory) {
SmallVector<VPValue *, 2> Args;
Args.push_back(Op1);
Args.push_back(Op2);
- VPWidenRecipe Recipe(*AI, Args);
+ VPWidenRecipe Recipe(*AI, Args,
+ VPIRFlags::getDefaultFlags(AI->getOpcode()));
EXPECT_FALSE(Recipe.mayHaveSideEffects());
EXPECT_FALSE(Recipe.mayReadFromMemory());
EXPECT_FALSE(Recipe.mayWriteToMemory());
@@ -1546,7 +1547,8 @@ TEST_F(VPRecipeTest, dumpRecipeInPlan) {
VPValue *ExtVPV2 = Plan.getOrAddLiveIn(ConstantInt::get(Int32, 2));
Args.push_back(ExtVPV1);
Args.push_back(ExtVPV2);
- VPWidenRecipe *WidenR = new VPWidenRecipe(*AI, Args);
+ VPWidenRecipe *WidenR =
+ new VPWidenRecipe(*AI, Args, VPIRFlags::getDefaultFlags(AI->getOpcode()));
VPBB1->appendRecipe(WidenR);
{
More information about the llvm-commits
mailing list