[llvm] [VPlanTransform] Rename and narrow simplifyRecipe to VPSingleDefRecipe. nfc (PR #165568)
Mel Chen via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 30 01:24:32 PDT 2025
https://github.com/Mel-Chen updated https://github.com/llvm/llvm-project/pull/165568
>From 384f8292e6a803702c5de5c44ee9303c39aa9ed6 Mon Sep 17 00:00:00 2001
From: Mel Chen <mel.chen at sifive.com>
Date: Wed, 29 Oct 2025 01:39:19 -0700
Subject: [PATCH 1/3] [VPlan] Refactor simplifyRecipe to handle only
VPSingleDefRecipe. nfc
---
.../Transforms/Vectorize/VPlanTransforms.cpp | 205 +++++++++---------
1 file changed, 101 insertions(+), 104 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 4d98014622224..cf9a479ee9d44 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -1057,54 +1057,51 @@ static VPValue *tryToFoldLiveIns(VPSingleDefRecipe &R,
return nullptr;
}
-/// Try to simplify recipe \p R.
-static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
- VPlan *Plan = R.getParent()->getPlan();
-
- auto *Def = dyn_cast<VPSingleDefRecipe>(&R);
- if (!Def)
- return;
+/// Try to simplify VPSingleDefRecipe \p Def.
+static void simplifySingleDefRecipe(VPSingleDefRecipe &Def,
+ VPTypeAnalysis &TypeInfo) {
+ VPlan *Plan = Def.getParent()->getPlan();
// Simplification of live-in IR values for SingleDef recipes using
// InstSimplifyFolder.
const DataLayout &DL =
Plan->getScalarHeader()->getIRBasicBlock()->getDataLayout();
- if (VPValue *V = tryToFoldLiveIns(*Def, Def->operands(), DL, TypeInfo))
- return Def->replaceAllUsesWith(V);
+ if (VPValue *V = tryToFoldLiveIns(Def, Def.operands(), DL, TypeInfo))
+ return Def.replaceAllUsesWith(V);
// Fold PredPHI LiveIn -> LiveIn.
- if (auto *PredPHI = dyn_cast<VPPredInstPHIRecipe>(&R)) {
+ if (auto *PredPHI = dyn_cast<VPPredInstPHIRecipe>(&Def)) {
VPValue *Op = PredPHI->getOperand(0);
if (Op->isLiveIn())
PredPHI->replaceAllUsesWith(Op);
}
- VPBuilder Builder(Def);
+ VPBuilder Builder(&Def);
VPValue *A;
- if (match(Def, m_Trunc(m_ZExtOrSExt(m_VPValue(A))))) {
- Type *TruncTy = TypeInfo.inferScalarType(Def);
+ if (match(&Def, m_Trunc(m_ZExtOrSExt(m_VPValue(A))))) {
+ Type *TruncTy = TypeInfo.inferScalarType(&Def);
Type *ATy = TypeInfo.inferScalarType(A);
if (TruncTy == ATy) {
- Def->replaceAllUsesWith(A);
+ Def.replaceAllUsesWith(A);
} else {
// Don't replace a scalarizing recipe with a widened cast.
- if (isa<VPReplicateRecipe>(Def))
+ if (isa<VPReplicateRecipe>(&Def))
return;
if (ATy->getScalarSizeInBits() < TruncTy->getScalarSizeInBits()) {
- unsigned ExtOpcode = match(R.getOperand(0), m_SExt(m_VPValue()))
+ unsigned ExtOpcode = match(Def.getOperand(0), m_SExt(m_VPValue()))
? Instruction::SExt
: Instruction::ZExt;
auto *Ext = Builder.createWidenCast(Instruction::CastOps(ExtOpcode), A,
TruncTy);
- if (auto *UnderlyingExt = R.getOperand(0)->getUnderlyingValue()) {
+ if (auto *UnderlyingExt = Def.getOperand(0)->getUnderlyingValue()) {
// UnderlyingExt has distinct return type, used to retain legacy cost.
Ext->setUnderlyingValue(UnderlyingExt);
}
- Def->replaceAllUsesWith(Ext);
+ Def.replaceAllUsesWith(Ext);
} else if (ATy->getScalarSizeInBits() > TruncTy->getScalarSizeInBits()) {
auto *Trunc = Builder.createWidenCast(Instruction::Trunc, A, TruncTy);
- Def->replaceAllUsesWith(Trunc);
+ Def.replaceAllUsesWith(Trunc);
}
}
#ifndef NDEBUG
@@ -1125,75 +1122,75 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
// && (Y || Z) and (X || !X) into true. This requires queuing newly created
// recipes to be visited during simplification.
VPValue *X, *Y, *Z;
- if (match(Def,
+ if (match(&Def,
m_c_BinaryOr(m_LogicalAnd(m_VPValue(X), m_VPValue(Y)),
m_LogicalAnd(m_Deferred(X), m_Not(m_Deferred(Y)))))) {
- Def->replaceAllUsesWith(X);
- Def->eraseFromParent();
+ Def.replaceAllUsesWith(X);
+ Def.eraseFromParent();
return;
}
// x | 1 -> 1
- if (match(Def, m_c_BinaryOr(m_VPValue(X), m_AllOnes())))
- return Def->replaceAllUsesWith(Def->getOperand(Def->getOperand(0) == X));
+ if (match(&Def, m_c_BinaryOr(m_VPValue(X), m_AllOnes())))
+ return Def.replaceAllUsesWith(Def.getOperand(Def.getOperand(0) == X));
// x | 0 -> x
- if (match(Def, m_c_BinaryOr(m_VPValue(X), m_ZeroInt())))
- return Def->replaceAllUsesWith(X);
+ if (match(&Def, m_c_BinaryOr(m_VPValue(X), m_ZeroInt())))
+ return Def.replaceAllUsesWith(X);
// x & 0 -> 0
- if (match(Def, m_c_BinaryAnd(m_VPValue(X), m_ZeroInt())))
- return Def->replaceAllUsesWith(Def->getOperand(Def->getOperand(0) == X));
+ if (match(&Def, m_c_BinaryAnd(m_VPValue(X), m_ZeroInt())))
+ return Def.replaceAllUsesWith(Def.getOperand(Def.getOperand(0) == X));
// x && false -> false
- if (match(Def, m_LogicalAnd(m_VPValue(X), m_False())))
- return Def->replaceAllUsesWith(Def->getOperand(1));
+ if (match(&Def, m_LogicalAnd(m_VPValue(X), m_False())))
+ return Def.replaceAllUsesWith(Def.getOperand(1));
// (x && y) || (x && z) -> x && (y || z)
- if (match(Def, m_c_BinaryOr(m_LogicalAnd(m_VPValue(X), m_VPValue(Y)),
- m_LogicalAnd(m_Deferred(X), m_VPValue(Z)))) &&
+ if (match(&Def, m_c_BinaryOr(m_LogicalAnd(m_VPValue(X), m_VPValue(Y)),
+ m_LogicalAnd(m_Deferred(X), m_VPValue(Z)))) &&
// Simplify only if one of the operands has one use to avoid creating an
// extra recipe.
- (!Def->getOperand(0)->hasMoreThanOneUniqueUser() ||
- !Def->getOperand(1)->hasMoreThanOneUniqueUser()))
- return Def->replaceAllUsesWith(
+ (!Def.getOperand(0)->hasMoreThanOneUniqueUser() ||
+ !Def.getOperand(1)->hasMoreThanOneUniqueUser()))
+ return Def.replaceAllUsesWith(
Builder.createLogicalAnd(X, Builder.createOr(Y, Z)));
// x && !x -> 0
- if (match(&R, m_LogicalAnd(m_VPValue(X), m_Not(m_Deferred(X)))))
- return Def->replaceAllUsesWith(Plan->getFalse());
+ if (match(&Def, m_LogicalAnd(m_VPValue(X), m_Not(m_Deferred(X)))))
+ return Def.replaceAllUsesWith(Plan->getFalse());
- if (match(Def, m_Select(m_VPValue(), m_VPValue(X), m_Deferred(X))))
- return Def->replaceAllUsesWith(X);
+ if (match(&Def, m_Select(m_VPValue(), m_VPValue(X), m_Deferred(X))))
+ return Def.replaceAllUsesWith(X);
// select !c, x, y -> select c, y, x
VPValue *C;
- if (match(Def, m_Select(m_Not(m_VPValue(C)), m_VPValue(X), m_VPValue(Y)))) {
- Def->setOperand(0, C);
- Def->setOperand(1, Y);
- Def->setOperand(2, X);
+ if (match(&Def, m_Select(m_Not(m_VPValue(C)), m_VPValue(X), m_VPValue(Y)))) {
+ Def.setOperand(0, C);
+ Def.setOperand(1, Y);
+ Def.setOperand(2, X);
return;
}
// Reassociate (x && y) && z -> x && (y && z) if x has multiple users. With
// tail folding it is likely that x is a header mask and can be simplified
// further.
- if (match(Def, m_LogicalAnd(m_LogicalAnd(m_VPValue(X), m_VPValue(Y)),
- m_VPValue(Z))) &&
+ if (match(&Def, m_LogicalAnd(m_LogicalAnd(m_VPValue(X), m_VPValue(Y)),
+ m_VPValue(Z))) &&
X->hasMoreThanOneUniqueUser())
- return Def->replaceAllUsesWith(
+ return Def.replaceAllUsesWith(
Builder.createLogicalAnd(X, Builder.createLogicalAnd(Y, Z)));
- if (match(Def, m_c_Mul(m_VPValue(A), m_One())))
- return Def->replaceAllUsesWith(A);
+ if (match(&Def, m_c_Mul(m_VPValue(A), m_One())))
+ return Def.replaceAllUsesWith(A);
- if (match(Def, m_c_Mul(m_VPValue(A), m_ZeroInt())))
- return Def->replaceAllUsesWith(R.getOperand(0) == A ? R.getOperand(1)
- : R.getOperand(0));
+ if (match(&Def, m_c_Mul(m_VPValue(A), m_ZeroInt())))
+ return Def.replaceAllUsesWith(Def.getOperand(0) == A ? Def.getOperand(1)
+ : Def.getOperand(0));
- if (match(Def, m_Not(m_VPValue(A)))) {
+ if (match(&Def, m_Not(m_VPValue(A)))) {
if (match(A, m_Not(m_VPValue(A))))
- return Def->replaceAllUsesWith(A);
+ return Def.replaceAllUsesWith(A);
// Try to fold Not into compares by adjusting the predicate in-place.
CmpPredicate Pred;
@@ -1218,71 +1215,71 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
}
// If Cmp doesn't have a debug location, use the one from the negation,
// to preserve the location.
- if (!Cmp->getDebugLoc() && R.getDebugLoc())
- Cmp->setDebugLoc(R.getDebugLoc());
+ if (!Cmp->getDebugLoc() && Def.getDebugLoc())
+ Cmp->setDebugLoc(Def.getDebugLoc());
}
}
}
// Remove redundant DerviedIVs, that is 0 + A * 1 -> A and 0 + 0 * x -> 0.
- if ((match(Def, m_DerivedIV(m_ZeroInt(), m_VPValue(A), m_One())) ||
- match(Def, m_DerivedIV(m_ZeroInt(), m_ZeroInt(), m_VPValue()))) &&
- TypeInfo.inferScalarType(Def->getOperand(1)) ==
- TypeInfo.inferScalarType(Def))
- return Def->replaceAllUsesWith(Def->getOperand(1));
-
- if (match(Def, m_VPInstruction<VPInstruction::WideIVStep>(m_VPValue(X),
- m_One()))) {
- Type *WideStepTy = TypeInfo.inferScalarType(Def);
+ if ((match(&Def, m_DerivedIV(m_ZeroInt(), m_VPValue(A), m_One())) ||
+ match(&Def, m_DerivedIV(m_ZeroInt(), m_ZeroInt(), m_VPValue()))) &&
+ TypeInfo.inferScalarType(Def.getOperand(1)) ==
+ TypeInfo.inferScalarType(&Def))
+ return Def.replaceAllUsesWith(Def.getOperand(1));
+
+ if (match(&Def, m_VPInstruction<VPInstruction::WideIVStep>(m_VPValue(X),
+ m_One()))) {
+ Type *WideStepTy = TypeInfo.inferScalarType(&Def);
if (TypeInfo.inferScalarType(X) != WideStepTy)
X = Builder.createWidenCast(Instruction::Trunc, X, WideStepTy);
- Def->replaceAllUsesWith(X);
+ Def.replaceAllUsesWith(X);
return;
}
// For i1 vp.merges produced by AnyOf reductions:
// vp.merge true, (or x, y), x, evl -> vp.merge y, true, x, evl
- if (match(Def, m_Intrinsic<Intrinsic::vp_merge>(m_True(), m_VPValue(A),
- m_VPValue(X), m_VPValue())) &&
+ if (match(&Def, m_Intrinsic<Intrinsic::vp_merge>(
+ m_True(), m_VPValue(A), m_VPValue(X), m_VPValue())) &&
match(A, m_c_BinaryOr(m_Specific(X), m_VPValue(Y))) &&
- TypeInfo.inferScalarType(R.getVPSingleValue())->isIntegerTy(1)) {
- Def->setOperand(1, Def->getOperand(0));
- Def->setOperand(0, Y);
+ TypeInfo.inferScalarType(Def.getVPSingleValue())->isIntegerTy(1)) {
+ Def.setOperand(1, Def.getOperand(0));
+ Def.setOperand(0, Y);
return;
}
- if (auto *Phi = dyn_cast<VPFirstOrderRecurrencePHIRecipe>(Def)) {
+ if (auto *Phi = dyn_cast<VPFirstOrderRecurrencePHIRecipe>(&Def)) {
if (Phi->getOperand(0) == Phi->getOperand(1))
- Def->replaceAllUsesWith(Phi->getOperand(0));
+ Phi->replaceAllUsesWith(Phi->getOperand(0));
return;
}
// Look through ExtractLastElement (BuildVector ....).
- if (match(&R, m_CombineOr(m_ExtractLastElement(m_BuildVector()),
- m_ExtractLastLanePerPart(m_BuildVector())))) {
- auto *BuildVector = cast<VPInstruction>(R.getOperand(0));
- Def->replaceAllUsesWith(
+ if (match(&Def, m_CombineOr(m_ExtractLastElement(m_BuildVector()),
+ m_ExtractLastLanePerPart(m_BuildVector())))) {
+ auto *BuildVector = cast<VPInstruction>(Def.getOperand(0));
+ Def.replaceAllUsesWith(
BuildVector->getOperand(BuildVector->getNumOperands() - 1));
return;
}
// Look through ExtractPenultimateElement (BuildVector ....).
- if (match(&R, m_VPInstruction<VPInstruction::ExtractPenultimateElement>(
- m_BuildVector()))) {
- auto *BuildVector = cast<VPInstruction>(R.getOperand(0));
- Def->replaceAllUsesWith(
+ if (match(&Def, m_VPInstruction<VPInstruction::ExtractPenultimateElement>(
+ m_BuildVector()))) {
+ auto *BuildVector = cast<VPInstruction>(Def.getOperand(0));
+ Def.replaceAllUsesWith(
BuildVector->getOperand(BuildVector->getNumOperands() - 2));
return;
}
uint64_t Idx;
- if (match(&R, m_ExtractElement(m_BuildVector(), m_ConstantInt(Idx)))) {
- auto *BuildVector = cast<VPInstruction>(R.getOperand(0));
- Def->replaceAllUsesWith(BuildVector->getOperand(Idx));
+ if (match(&Def, m_ExtractElement(m_BuildVector(), m_ConstantInt(Idx)))) {
+ auto *BuildVector = cast<VPInstruction>(Def.getOperand(0));
+ Def.replaceAllUsesWith(BuildVector->getOperand(Idx));
return;
}
- if (auto *Phi = dyn_cast<VPPhi>(Def)) {
+ if (auto *Phi = dyn_cast<VPPhi>(&Def)) {
if (Phi->getNumOperands() == 1)
Phi->replaceAllUsesWith(Phi->getOperand(0));
return;
@@ -1294,19 +1291,19 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
return;
// Hoist an invariant increment Y of a phi X, by having X start at Y.
- if (match(Def, m_c_Add(m_VPValue(X), m_VPValue(Y))) && Y->isLiveIn() &&
+ if (match(&Def, m_c_Add(m_VPValue(X), m_VPValue(Y))) && Y->isLiveIn() &&
isa<VPPhi>(X)) {
auto *Phi = cast<VPPhi>(X);
- if (Phi->getOperand(1) != Def && match(Phi->getOperand(0), m_ZeroInt()) &&
- Phi->getNumUsers() == 1 && (*Phi->user_begin() == &R)) {
+ if (Phi->getOperand(1) != &Def && match(Phi->getOperand(0), m_ZeroInt()) &&
+ Phi->getNumUsers() == 1 && (*Phi->user_begin() == &Def)) {
Phi->setOperand(0, Y);
- Def->replaceAllUsesWith(Phi);
+ Def.replaceAllUsesWith(Phi);
return;
}
}
// VPVectorPointer for part 0 can be replaced by their start pointer.
- if (auto *VecPtr = dyn_cast<VPVectorPointerRecipe>(&R)) {
+ if (auto *VecPtr = dyn_cast<VPVectorPointerRecipe>(&Def)) {
if (VecPtr->isFirstPart()) {
VecPtr->replaceAllUsesWith(VecPtr->getOperand(0));
return;
@@ -1315,7 +1312,7 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
// VPScalarIVSteps for part 0 can be replaced by their start value, if only
// the first lane is demanded.
- if (auto *Steps = dyn_cast<VPScalarIVStepsRecipe>(Def)) {
+ if (auto *Steps = dyn_cast<VPScalarIVStepsRecipe>(&Def)) {
if (Steps->isPart0() && vputils::onlyFirstLaneUsed(Steps)) {
Steps->replaceAllUsesWith(Steps->getOperand(0));
return;
@@ -1323,35 +1320,35 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
}
// Simplify redundant ReductionStartVector recipes after unrolling.
VPValue *StartV;
- if (match(Def, m_VPInstruction<VPInstruction::ReductionStartVector>(
- m_VPValue(StartV), m_VPValue(), m_VPValue()))) {
- Def->replaceUsesWithIf(StartV, [](const VPUser &U, unsigned Idx) {
+ if (match(&Def, m_VPInstruction<VPInstruction::ReductionStartVector>(
+ m_VPValue(StartV), m_VPValue(), m_VPValue()))) {
+ Def.replaceUsesWithIf(StartV, [](const VPUser &U, unsigned Idx) {
auto *PhiR = dyn_cast<VPReductionPHIRecipe>(&U);
return PhiR && PhiR->isInLoop();
});
return;
}
- if (match(Def,
+ if (match(&Def,
m_CombineOr(m_ExtractLastElement(m_Broadcast(m_VPValue(A))),
m_ExtractLastLanePerPart(m_Broadcast(m_VPValue(A)))))) {
- Def->replaceAllUsesWith(A);
+ Def.replaceAllUsesWith(A);
return;
}
- if (match(Def, m_CombineOr(m_ExtractLastElement(m_VPValue(A)),
- m_ExtractLastLanePerPart(m_VPValue(A)))) &&
+ if (match(&Def, m_CombineOr(m_ExtractLastElement(m_VPValue(A)),
+ m_ExtractLastLanePerPart(m_VPValue(A)))) &&
((isa<VPInstruction>(A) && vputils::isSingleScalar(A)) ||
(isa<VPReplicateRecipe>(A) &&
cast<VPReplicateRecipe>(A)->isSingleScalar())) &&
all_of(A->users(),
- [Def, A](VPUser *U) { return U->usesScalars(A) || Def == U; })) {
- return Def->replaceAllUsesWith(A);
+ [&Def, A](VPUser *U) { return U->usesScalars(A) || &Def == U; })) {
+ return Def.replaceAllUsesWith(A);
}
if (Plan->getUF() == 1 &&
- match(Def, m_ExtractLastLanePerPart(m_VPValue(A)))) {
- return Def->replaceAllUsesWith(
+ match(&Def, m_ExtractLastLanePerPart(m_VPValue(A)))) {
+ return Def.replaceAllUsesWith(
Builder.createNaryOp(VPInstruction::ExtractLastElement, {A}));
}
}
@@ -1361,9 +1358,9 @@ void VPlanTransforms::simplifyRecipes(VPlan &Plan) {
Plan.getEntry());
VPTypeAnalysis TypeInfo(Plan);
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(RPOT)) {
- for (VPRecipeBase &R : make_early_inc_range(*VPBB)) {
- simplifyRecipe(R, TypeInfo);
- }
+ for (VPRecipeBase &R : make_early_inc_range(*VPBB))
+ if (auto *Def = dyn_cast<VPSingleDefRecipe>(&R))
+ simplifySingleDefRecipe(*Def, TypeInfo);
}
}
>From 9310d6bdff5cd6fca53182086da26716968dabf4 Mon Sep 17 00:00:00 2001
From: Mel Chen <mel.chen at sifive.com>
Date: Thu, 30 Oct 2025 01:03:44 -0700
Subject: [PATCH 2/3] Take a pointer instead of a reference
---
.../Transforms/Vectorize/VPlanTransforms.cpp | 190 +++++++++---------
1 file changed, 95 insertions(+), 95 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index cf9a479ee9d44..3922c3f40e5bf 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -1058,50 +1058,50 @@ static VPValue *tryToFoldLiveIns(VPSingleDefRecipe &R,
}
/// Try to simplify VPSingleDefRecipe \p Def.
-static void simplifySingleDefRecipe(VPSingleDefRecipe &Def,
+static void simplifySingleDefRecipe(VPSingleDefRecipe *Def,
VPTypeAnalysis &TypeInfo) {
- VPlan *Plan = Def.getParent()->getPlan();
+ VPlan *Plan = Def->getParent()->getPlan();
// Simplification of live-in IR values for SingleDef recipes using
// InstSimplifyFolder.
const DataLayout &DL =
Plan->getScalarHeader()->getIRBasicBlock()->getDataLayout();
- if (VPValue *V = tryToFoldLiveIns(Def, Def.operands(), DL, TypeInfo))
- return Def.replaceAllUsesWith(V);
+ if (VPValue *V = tryToFoldLiveIns(*Def, Def->operands(), DL, TypeInfo))
+ return Def->replaceAllUsesWith(V);
// Fold PredPHI LiveIn -> LiveIn.
- if (auto *PredPHI = dyn_cast<VPPredInstPHIRecipe>(&Def)) {
+ if (auto *PredPHI = dyn_cast<VPPredInstPHIRecipe>(Def)) {
VPValue *Op = PredPHI->getOperand(0);
if (Op->isLiveIn())
PredPHI->replaceAllUsesWith(Op);
}
- VPBuilder Builder(&Def);
+ VPBuilder Builder(Def);
VPValue *A;
- if (match(&Def, m_Trunc(m_ZExtOrSExt(m_VPValue(A))))) {
- Type *TruncTy = TypeInfo.inferScalarType(&Def);
+ if (match(Def, m_Trunc(m_ZExtOrSExt(m_VPValue(A))))) {
+ Type *TruncTy = TypeInfo.inferScalarType(Def);
Type *ATy = TypeInfo.inferScalarType(A);
if (TruncTy == ATy) {
- Def.replaceAllUsesWith(A);
+ Def->replaceAllUsesWith(A);
} else {
// Don't replace a scalarizing recipe with a widened cast.
- if (isa<VPReplicateRecipe>(&Def))
+ if (isa<VPReplicateRecipe>(Def))
return;
if (ATy->getScalarSizeInBits() < TruncTy->getScalarSizeInBits()) {
- unsigned ExtOpcode = match(Def.getOperand(0), m_SExt(m_VPValue()))
+ unsigned ExtOpcode = match(Def->getOperand(0), m_SExt(m_VPValue()))
? Instruction::SExt
: Instruction::ZExt;
auto *Ext = Builder.createWidenCast(Instruction::CastOps(ExtOpcode), A,
TruncTy);
- if (auto *UnderlyingExt = Def.getOperand(0)->getUnderlyingValue()) {
+ if (auto *UnderlyingExt = Def->getOperand(0)->getUnderlyingValue()) {
// UnderlyingExt has distinct return type, used to retain legacy cost.
Ext->setUnderlyingValue(UnderlyingExt);
}
- Def.replaceAllUsesWith(Ext);
+ Def->replaceAllUsesWith(Ext);
} else if (ATy->getScalarSizeInBits() > TruncTy->getScalarSizeInBits()) {
auto *Trunc = Builder.createWidenCast(Instruction::Trunc, A, TruncTy);
- Def.replaceAllUsesWith(Trunc);
+ Def->replaceAllUsesWith(Trunc);
}
}
#ifndef NDEBUG
@@ -1122,75 +1122,75 @@ static void simplifySingleDefRecipe(VPSingleDefRecipe &Def,
// && (Y || Z) and (X || !X) into true. This requires queuing newly created
// recipes to be visited during simplification.
VPValue *X, *Y, *Z;
- if (match(&Def,
+ if (match(Def,
m_c_BinaryOr(m_LogicalAnd(m_VPValue(X), m_VPValue(Y)),
m_LogicalAnd(m_Deferred(X), m_Not(m_Deferred(Y)))))) {
- Def.replaceAllUsesWith(X);
- Def.eraseFromParent();
+ Def->replaceAllUsesWith(X);
+ Def->eraseFromParent();
return;
}
// x | 1 -> 1
- if (match(&Def, m_c_BinaryOr(m_VPValue(X), m_AllOnes())))
- return Def.replaceAllUsesWith(Def.getOperand(Def.getOperand(0) == X));
+ if (match(Def, m_c_BinaryOr(m_VPValue(X), m_AllOnes())))
+ return Def->replaceAllUsesWith(Def->getOperand(Def->getOperand(0) == X));
// x | 0 -> x
- if (match(&Def, m_c_BinaryOr(m_VPValue(X), m_ZeroInt())))
- return Def.replaceAllUsesWith(X);
+ if (match(Def, m_c_BinaryOr(m_VPValue(X), m_ZeroInt())))
+ return Def->replaceAllUsesWith(X);
// x & 0 -> 0
- if (match(&Def, m_c_BinaryAnd(m_VPValue(X), m_ZeroInt())))
- return Def.replaceAllUsesWith(Def.getOperand(Def.getOperand(0) == X));
+ if (match(Def, m_c_BinaryAnd(m_VPValue(X), m_ZeroInt())))
+ return Def->replaceAllUsesWith(Def->getOperand(Def->getOperand(0) == X));
// x && false -> false
- if (match(&Def, m_LogicalAnd(m_VPValue(X), m_False())))
- return Def.replaceAllUsesWith(Def.getOperand(1));
+ if (match(Def, m_LogicalAnd(m_VPValue(X), m_False())))
+ return Def->replaceAllUsesWith(Def->getOperand(1));
// (x && y) || (x && z) -> x && (y || z)
- if (match(&Def, m_c_BinaryOr(m_LogicalAnd(m_VPValue(X), m_VPValue(Y)),
- m_LogicalAnd(m_Deferred(X), m_VPValue(Z)))) &&
+ if (match(Def, m_c_BinaryOr(m_LogicalAnd(m_VPValue(X), m_VPValue(Y)),
+ m_LogicalAnd(m_Deferred(X), m_VPValue(Z)))) &&
// Simplify only if one of the operands has one use to avoid creating an
// extra recipe.
- (!Def.getOperand(0)->hasMoreThanOneUniqueUser() ||
- !Def.getOperand(1)->hasMoreThanOneUniqueUser()))
- return Def.replaceAllUsesWith(
+ (!Def->getOperand(0)->hasMoreThanOneUniqueUser() ||
+ !Def->getOperand(1)->hasMoreThanOneUniqueUser()))
+ return Def->replaceAllUsesWith(
Builder.createLogicalAnd(X, Builder.createOr(Y, Z)));
// x && !x -> 0
- if (match(&Def, m_LogicalAnd(m_VPValue(X), m_Not(m_Deferred(X)))))
- return Def.replaceAllUsesWith(Plan->getFalse());
+ if (match(Def, m_LogicalAnd(m_VPValue(X), m_Not(m_Deferred(X)))))
+ return Def->replaceAllUsesWith(Plan->getFalse());
- if (match(&Def, m_Select(m_VPValue(), m_VPValue(X), m_Deferred(X))))
- return Def.replaceAllUsesWith(X);
+ if (match(Def, m_Select(m_VPValue(), m_VPValue(X), m_Deferred(X))))
+ return Def->replaceAllUsesWith(X);
// select !c, x, y -> select c, y, x
VPValue *C;
- if (match(&Def, m_Select(m_Not(m_VPValue(C)), m_VPValue(X), m_VPValue(Y)))) {
- Def.setOperand(0, C);
- Def.setOperand(1, Y);
- Def.setOperand(2, X);
+ if (match(Def, m_Select(m_Not(m_VPValue(C)), m_VPValue(X), m_VPValue(Y)))) {
+ Def->setOperand(0, C);
+ Def->setOperand(1, Y);
+ Def->setOperand(2, X);
return;
}
// Reassociate (x && y) && z -> x && (y && z) if x has multiple users. With
// tail folding it is likely that x is a header mask and can be simplified
// further.
- if (match(&Def, m_LogicalAnd(m_LogicalAnd(m_VPValue(X), m_VPValue(Y)),
- m_VPValue(Z))) &&
+ if (match(Def, m_LogicalAnd(m_LogicalAnd(m_VPValue(X), m_VPValue(Y)),
+ m_VPValue(Z))) &&
X->hasMoreThanOneUniqueUser())
- return Def.replaceAllUsesWith(
+ return Def->replaceAllUsesWith(
Builder.createLogicalAnd(X, Builder.createLogicalAnd(Y, Z)));
- if (match(&Def, m_c_Mul(m_VPValue(A), m_One())))
- return Def.replaceAllUsesWith(A);
+ if (match(Def, m_c_Mul(m_VPValue(A), m_One())))
+ return Def->replaceAllUsesWith(A);
- if (match(&Def, m_c_Mul(m_VPValue(A), m_ZeroInt())))
- return Def.replaceAllUsesWith(Def.getOperand(0) == A ? Def.getOperand(1)
- : Def.getOperand(0));
+ if (match(Def, m_c_Mul(m_VPValue(A), m_ZeroInt())))
+ return Def->replaceAllUsesWith(
+ Def->getOperand(0) == A ? Def->getOperand(1) : Def->getOperand(0));
- if (match(&Def, m_Not(m_VPValue(A)))) {
+ if (match(Def, m_Not(m_VPValue(A)))) {
if (match(A, m_Not(m_VPValue(A))))
- return Def.replaceAllUsesWith(A);
+ return Def->replaceAllUsesWith(A);
// Try to fold Not into compares by adjusting the predicate in-place.
CmpPredicate Pred;
@@ -1215,71 +1215,71 @@ static void simplifySingleDefRecipe(VPSingleDefRecipe &Def,
}
// If Cmp doesn't have a debug location, use the one from the negation,
// to preserve the location.
- if (!Cmp->getDebugLoc() && Def.getDebugLoc())
- Cmp->setDebugLoc(Def.getDebugLoc());
+ if (!Cmp->getDebugLoc() && Def->getDebugLoc())
+ Cmp->setDebugLoc(Def->getDebugLoc());
}
}
}
// Remove redundant DerviedIVs, that is 0 + A * 1 -> A and 0 + 0 * x -> 0.
- if ((match(&Def, m_DerivedIV(m_ZeroInt(), m_VPValue(A), m_One())) ||
- match(&Def, m_DerivedIV(m_ZeroInt(), m_ZeroInt(), m_VPValue()))) &&
- TypeInfo.inferScalarType(Def.getOperand(1)) ==
- TypeInfo.inferScalarType(&Def))
- return Def.replaceAllUsesWith(Def.getOperand(1));
-
- if (match(&Def, m_VPInstruction<VPInstruction::WideIVStep>(m_VPValue(X),
- m_One()))) {
- Type *WideStepTy = TypeInfo.inferScalarType(&Def);
+ if ((match(Def, m_DerivedIV(m_ZeroInt(), m_VPValue(A), m_One())) ||
+ match(Def, m_DerivedIV(m_ZeroInt(), m_ZeroInt(), m_VPValue()))) &&
+ TypeInfo.inferScalarType(Def->getOperand(1)) ==
+ TypeInfo.inferScalarType(Def))
+ return Def->replaceAllUsesWith(Def->getOperand(1));
+
+ if (match(Def, m_VPInstruction<VPInstruction::WideIVStep>(m_VPValue(X),
+ m_One()))) {
+ Type *WideStepTy = TypeInfo.inferScalarType(Def);
if (TypeInfo.inferScalarType(X) != WideStepTy)
X = Builder.createWidenCast(Instruction::Trunc, X, WideStepTy);
- Def.replaceAllUsesWith(X);
+ Def->replaceAllUsesWith(X);
return;
}
// For i1 vp.merges produced by AnyOf reductions:
// vp.merge true, (or x, y), x, evl -> vp.merge y, true, x, evl
- if (match(&Def, m_Intrinsic<Intrinsic::vp_merge>(
- m_True(), m_VPValue(A), m_VPValue(X), m_VPValue())) &&
+ if (match(Def, m_Intrinsic<Intrinsic::vp_merge>(m_True(), m_VPValue(A),
+ m_VPValue(X), m_VPValue())) &&
match(A, m_c_BinaryOr(m_Specific(X), m_VPValue(Y))) &&
- TypeInfo.inferScalarType(Def.getVPSingleValue())->isIntegerTy(1)) {
- Def.setOperand(1, Def.getOperand(0));
- Def.setOperand(0, Y);
+ TypeInfo.inferScalarType(Def->getVPSingleValue())->isIntegerTy(1)) {
+ Def->setOperand(1, Def->getOperand(0));
+ Def->setOperand(0, Y);
return;
}
- if (auto *Phi = dyn_cast<VPFirstOrderRecurrencePHIRecipe>(&Def)) {
+ if (auto *Phi = dyn_cast<VPFirstOrderRecurrencePHIRecipe>(Def)) {
if (Phi->getOperand(0) == Phi->getOperand(1))
Phi->replaceAllUsesWith(Phi->getOperand(0));
return;
}
// Look through ExtractLastElement (BuildVector ....).
- if (match(&Def, m_CombineOr(m_ExtractLastElement(m_BuildVector()),
- m_ExtractLastLanePerPart(m_BuildVector())))) {
- auto *BuildVector = cast<VPInstruction>(Def.getOperand(0));
- Def.replaceAllUsesWith(
+ if (match(Def, m_CombineOr(m_ExtractLastElement(m_BuildVector()),
+ m_ExtractLastLanePerPart(m_BuildVector())))) {
+ auto *BuildVector = cast<VPInstruction>(Def->getOperand(0));
+ Def->replaceAllUsesWith(
BuildVector->getOperand(BuildVector->getNumOperands() - 1));
return;
}
// Look through ExtractPenultimateElement (BuildVector ....).
- if (match(&Def, m_VPInstruction<VPInstruction::ExtractPenultimateElement>(
+ if (match(Def, m_VPInstruction<VPInstruction::ExtractPenultimateElement>(
m_BuildVector()))) {
- auto *BuildVector = cast<VPInstruction>(Def.getOperand(0));
- Def.replaceAllUsesWith(
+ auto *BuildVector = cast<VPInstruction>(Def->getOperand(0));
+ Def->replaceAllUsesWith(
BuildVector->getOperand(BuildVector->getNumOperands() - 2));
return;
}
uint64_t Idx;
- if (match(&Def, m_ExtractElement(m_BuildVector(), m_ConstantInt(Idx)))) {
- auto *BuildVector = cast<VPInstruction>(Def.getOperand(0));
- Def.replaceAllUsesWith(BuildVector->getOperand(Idx));
+ if (match(Def, m_ExtractElement(m_BuildVector(), m_ConstantInt(Idx)))) {
+ auto *BuildVector = cast<VPInstruction>(Def->getOperand(0));
+ Def->replaceAllUsesWith(BuildVector->getOperand(Idx));
return;
}
- if (auto *Phi = dyn_cast<VPPhi>(&Def)) {
+ if (auto *Phi = dyn_cast<VPPhi>(Def)) {
if (Phi->getNumOperands() == 1)
Phi->replaceAllUsesWith(Phi->getOperand(0));
return;
@@ -1291,19 +1291,19 @@ static void simplifySingleDefRecipe(VPSingleDefRecipe &Def,
return;
// Hoist an invariant increment Y of a phi X, by having X start at Y.
- if (match(&Def, m_c_Add(m_VPValue(X), m_VPValue(Y))) && Y->isLiveIn() &&
+ if (match(Def, m_c_Add(m_VPValue(X), m_VPValue(Y))) && Y->isLiveIn() &&
isa<VPPhi>(X)) {
auto *Phi = cast<VPPhi>(X);
- if (Phi->getOperand(1) != &Def && match(Phi->getOperand(0), m_ZeroInt()) &&
- Phi->getNumUsers() == 1 && (*Phi->user_begin() == &Def)) {
+ if (Phi->getOperand(1) != Def && match(Phi->getOperand(0), m_ZeroInt()) &&
+ Phi->getNumUsers() == 1 && (*Phi->user_begin() == Def)) {
Phi->setOperand(0, Y);
- Def.replaceAllUsesWith(Phi);
+ Def->replaceAllUsesWith(Phi);
return;
}
}
// VPVectorPointer for part 0 can be replaced by their start pointer.
- if (auto *VecPtr = dyn_cast<VPVectorPointerRecipe>(&Def)) {
+ if (auto *VecPtr = dyn_cast<VPVectorPointerRecipe>(Def)) {
if (VecPtr->isFirstPart()) {
VecPtr->replaceAllUsesWith(VecPtr->getOperand(0));
return;
@@ -1312,7 +1312,7 @@ static void simplifySingleDefRecipe(VPSingleDefRecipe &Def,
// VPScalarIVSteps for part 0 can be replaced by their start value, if only
// the first lane is demanded.
- if (auto *Steps = dyn_cast<VPScalarIVStepsRecipe>(&Def)) {
+ if (auto *Steps = dyn_cast<VPScalarIVStepsRecipe>(Def)) {
if (Steps->isPart0() && vputils::onlyFirstLaneUsed(Steps)) {
Steps->replaceAllUsesWith(Steps->getOperand(0));
return;
@@ -1320,35 +1320,35 @@ static void simplifySingleDefRecipe(VPSingleDefRecipe &Def,
}
// Simplify redundant ReductionStartVector recipes after unrolling.
VPValue *StartV;
- if (match(&Def, m_VPInstruction<VPInstruction::ReductionStartVector>(
- m_VPValue(StartV), m_VPValue(), m_VPValue()))) {
- Def.replaceUsesWithIf(StartV, [](const VPUser &U, unsigned Idx) {
+ if (match(Def, m_VPInstruction<VPInstruction::ReductionStartVector>(
+ m_VPValue(StartV), m_VPValue(), m_VPValue()))) {
+ Def->replaceUsesWithIf(StartV, [](const VPUser &U, unsigned Idx) {
auto *PhiR = dyn_cast<VPReductionPHIRecipe>(&U);
return PhiR && PhiR->isInLoop();
});
return;
}
- if (match(&Def,
+ if (match(Def,
m_CombineOr(m_ExtractLastElement(m_Broadcast(m_VPValue(A))),
m_ExtractLastLanePerPart(m_Broadcast(m_VPValue(A)))))) {
- Def.replaceAllUsesWith(A);
+ Def->replaceAllUsesWith(A);
return;
}
- if (match(&Def, m_CombineOr(m_ExtractLastElement(m_VPValue(A)),
- m_ExtractLastLanePerPart(m_VPValue(A)))) &&
+ if (match(Def, m_CombineOr(m_ExtractLastElement(m_VPValue(A)),
+ m_ExtractLastLanePerPart(m_VPValue(A)))) &&
((isa<VPInstruction>(A) && vputils::isSingleScalar(A)) ||
(isa<VPReplicateRecipe>(A) &&
cast<VPReplicateRecipe>(A)->isSingleScalar())) &&
all_of(A->users(),
- [&Def, A](VPUser *U) { return U->usesScalars(A) || &Def == U; })) {
- return Def.replaceAllUsesWith(A);
+ [Def, A](VPUser *U) { return U->usesScalars(A) || Def == U; })) {
+ return Def->replaceAllUsesWith(A);
}
if (Plan->getUF() == 1 &&
- match(&Def, m_ExtractLastLanePerPart(m_VPValue(A)))) {
- return Def.replaceAllUsesWith(
+ match(Def, m_ExtractLastLanePerPart(m_VPValue(A)))) {
+ return Def->replaceAllUsesWith(
Builder.createNaryOp(VPInstruction::ExtractLastElement, {A}));
}
}
@@ -1360,7 +1360,7 @@ void VPlanTransforms::simplifyRecipes(VPlan &Plan) {
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(RPOT)) {
for (VPRecipeBase &R : make_early_inc_range(*VPBB))
if (auto *Def = dyn_cast<VPSingleDefRecipe>(&R))
- simplifySingleDefRecipe(*Def, TypeInfo);
+ simplifySingleDefRecipe(Def, TypeInfo);
}
}
>From da5ff536f1201e5e699a4ca768dab08fd3dac78c Mon Sep 17 00:00:00 2001
From: Mel Chen <mel.chen at sifive.com>
Date: Thu, 30 Oct 2025 01:23:43 -0700
Subject: [PATCH 3/3] Revert the rename change
---
llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 3922c3f40e5bf..6d270113839e5 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -1058,8 +1058,7 @@ static VPValue *tryToFoldLiveIns(VPSingleDefRecipe &R,
}
/// Try to simplify VPSingleDefRecipe \p Def.
-static void simplifySingleDefRecipe(VPSingleDefRecipe *Def,
- VPTypeAnalysis &TypeInfo) {
+static void simplifyRecipe(VPSingleDefRecipe *Def, VPTypeAnalysis &TypeInfo) {
VPlan *Plan = Def->getParent()->getPlan();
// Simplification of live-in IR values for SingleDef recipes using
@@ -1360,7 +1359,7 @@ void VPlanTransforms::simplifyRecipes(VPlan &Plan) {
for (VPBasicBlock *VPBB : VPBlockUtils::blocksOnly<VPBasicBlock>(RPOT)) {
for (VPRecipeBase &R : make_early_inc_range(*VPBB))
if (auto *Def = dyn_cast<VPSingleDefRecipe>(&R))
- simplifySingleDefRecipe(Def, TypeInfo);
+ simplifyRecipe(Def, TypeInfo);
}
}
More information about the llvm-commits
mailing list