[llvm] f586de8 - [VPlan] Remove PredInst2Recipe, use VP operands instead. (NFC)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 16 10:41:36 PDT 2021
Author: Florian Hahn
Date: 2021-03-16T17:40:35Z
New Revision: f586de8459ce897faf532fdd49fd4aa81747589e
URL: https://github.com/llvm/llvm-project/commit/f586de8459ce897faf532fdd49fd4aa81747589e
DIFF: https://github.com/llvm/llvm-project/commit/f586de8459ce897faf532fdd49fd4aa81747589e.diff
LOG: [VPlan] Remove PredInst2Recipe, use VP operands instead. (NFC)
Instead of maintaining a separate map from predicated instructions to
recipes, we can instead directly look at the VP operands. If the operand
comes from a predicated instruction, the operand will be a
VPPredInstPHIRecipe with a VPReplicateRecipe as its operand.
Added:
Modified:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h
llvm/lib/Transforms/Vectorize/VPlan.h
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index c92b00078c7e..f6f51e78bb27 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -8534,7 +8534,6 @@ VPWidenRecipe *VPRecipeBuilder::tryToWiden(Instruction *I, VPlan &Plan) const {
VPBasicBlock *VPRecipeBuilder::handleReplication(
Instruction *I, VFRange &Range, VPBasicBlock *VPBB,
- DenseMap<Instruction *, VPReplicateRecipe *> &PredInst2Recipe,
VPlanPtr &Plan) {
bool IsUniform = LoopVectorizationPlanner::getDecisionAndClampRange(
[&](ElementCount VF) { return CM.isUniformAfterVectorization(I, VF); },
@@ -8552,10 +8551,16 @@ VPBasicBlock *VPRecipeBuilder::handleReplication(
// Find if I uses a predicated instruction. If so, it will use its scalar
// value. Avoid hoisting the insert-element which packs the scalar value into
// a vector value, as that happens iff all users use the vector value.
- for (auto &Op : I->operands())
- if (auto *PredInst = dyn_cast<Instruction>(Op))
- if (PredInst2Recipe.find(PredInst) != PredInst2Recipe.end())
- PredInst2Recipe[PredInst]->setAlsoPack(false);
+ for (VPValue *Op : Recipe->operands()) {
+ auto *PredR = dyn_cast_or_null<VPPredInstPHIRecipe>(Op->getDef());
+ if (!PredR)
+ continue;
+ auto *RepR =
+ cast_or_null<VPReplicateRecipe>(PredR->getOperand(0)->getDef());
+ assert(RepR->isPredicated() &&
+ "expected Replicate recipe to be predicated");
+ RepR->setAlsoPack(false);
+ }
// Finalize the recipe for Instr, first if it is not predicated.
if (!IsPredicated) {
@@ -8567,7 +8572,6 @@ VPBasicBlock *VPRecipeBuilder::handleReplication(
assert(VPBB->getSuccessors().empty() &&
"VPBB has successors when handling predicated replication.");
// Record predicated instructions for above packing optimizations.
- PredInst2Recipe[I] = Recipe;
VPBlockBase *Region = createReplicateRegion(I, Recipe, Plan);
VPBlockUtils::insertBlockAfter(Region, VPBB);
auto *RegSucc = new VPBasicBlock();
@@ -8695,11 +8699,6 @@ VPlanPtr LoopVectorizationPlanner::buildVPlanWithVPRecipes(
VFRange &Range, SmallPtrSetImpl<Instruction *> &DeadInstructions,
const DenseMap<Instruction *, Instruction *> &SinkAfter) {
- // Hold a mapping from predicated instructions to their recipes, in order to
- // fix their AlsoPack behavior if a user is determined to replicate and use a
- // scalar instead of vector value.
- DenseMap<Instruction *, VPReplicateRecipe *> PredInst2Recipe;
-
SmallPtrSet<const InterleaveGroup<Instruction> *, 1> InterleaveGroups;
VPRecipeBuilder RecipeBuilder(OrigLoop, TLI, Legal, CM, PSE, Builder);
@@ -8803,8 +8802,8 @@ VPlanPtr LoopVectorizationPlanner::buildVPlanWithVPRecipes(
// Otherwise, if all widening options failed, Instruction is to be
// replicated. This may create a successor for VPBB.
- VPBasicBlock *NextVPBB = RecipeBuilder.handleReplication(
- Instr, Range, VPBB, PredInst2Recipe, Plan);
+ VPBasicBlock *NextVPBB =
+ RecipeBuilder.handleReplication(Instr, Range, VPBB, Plan);
if (NextVPBB != VPBB) {
VPBB = NextVPBB;
VPBB->setName(BB->hasName() ? BB->getName() + "." + Twine(VPBBsForBB++)
diff --git a/llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h b/llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h
index 985bf8579ab4..89c7b127d3ba 100644
--- a/llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h
+++ b/llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h
@@ -162,7 +162,6 @@ class VPRecipeBuilder {
/// \p Range.Start to \p Range.End.
VPBasicBlock *handleReplication(
Instruction *I, VFRange &Range, VPBasicBlock *VPBB,
- DenseMap<Instruction *, VPReplicateRecipe *> &PredInst2Recipe,
VPlanPtr &Plan);
};
} // end namespace llvm
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index 5a23c6839982..9b5d5d7e77be 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -1221,6 +1221,8 @@ class VPReplicateRecipe : public VPRecipeBase, public VPValue {
bool isUniform() const { return IsUniform; }
bool isPacked() const { return AlsoPack; }
+
+ bool isPredicated() const { return IsPredicated; }
};
/// A recipe for generating conditional branches on the bits of a mask.
More information about the llvm-commits
mailing list