[llvm] [VPlan] Verify VPIRFlags when creating VPWidenRecipe. (PR #213039)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 30 08:01:47 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-vectorizers
Author: Florian Hahn (fhahn)
<details>
<summary>Changes</summary>
VPWidenRecipe's constructor didn't check its flags at all, unlike VPInstruction and VPWidenCastRecipe. Add checks and fix remaining violations.
---
Full diff: https://github.com/llvm/llvm-project/pull/213039.diff
3 Files Affected:
- (modified) llvm/lib/Transforms/Vectorize/VPlan.h (+6-1)
- (modified) llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp (+7-4)
- (modified) llvm/unittests/Transforms/Vectorize/VPlanTest.cpp (+5-3)
``````````diff
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);
{
``````````
</details>
https://github.com/llvm/llvm-project/pull/213039
More information about the llvm-commits
mailing list