[llvm-branch-commits] [llvm] e42e526 - [VPlan] Make VPWidenMemoryInstructionRecipe a VPDef.
Florian Hahn via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Dec 14 06:23:42 PST 2020
Author: Florian Hahn
Date: 2020-12-14T14:13:59Z
New Revision: e42e5263bd5dd8fb8dd95d5081231f7cf4b82b6f
URL: https://github.com/llvm/llvm-project/commit/e42e5263bd5dd8fb8dd95d5081231f7cf4b82b6f
DIFF: https://github.com/llvm/llvm-project/commit/e42e5263bd5dd8fb8dd95d5081231f7cf4b82b6f.diff
LOG: [VPlan] Make VPWidenMemoryInstructionRecipe a VPDef.
This patch updates VPWidenMemoryInstructionRecipe to use VPDef
to manage the value it produces instead of inheriting from VPValue.
Reviewed By: gilr
Differential Revision: https://reviews.llvm.org/D90563
Added:
Modified:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/lib/Transforms/Vectorize/VPlan.cpp
llvm/lib/Transforms/Vectorize/VPlan.h
llvm/lib/Transforms/Vectorize/VPlanValue.h
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 663ea50c4c02..c96637762658 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -8827,11 +8827,10 @@ void VPPredInstPHIRecipe::execute(VPTransformState &State) {
}
void VPWidenMemoryInstructionRecipe::execute(VPTransformState &State) {
- Instruction *Instr = getUnderlyingInstr();
- VPValue *StoredValue = isa<StoreInst>(Instr) ? getStoredValue() : nullptr;
- State.ILV->vectorizeMemoryInstruction(Instr, State,
- StoredValue ? nullptr : this, getAddr(),
- StoredValue, getMask());
+ VPValue *StoredValue = isStore() ? getStoredValue() : nullptr;
+ State.ILV->vectorizeMemoryInstruction(&Ingredient, State,
+ StoredValue ? nullptr : toVPValue(),
+ getAddr(), StoredValue, getMask());
}
// Determine how to lower the scalar epilogue, which depends on 1) optimising
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.cpp b/llvm/lib/Transforms/Vectorize/VPlan.cpp
index 516c149bd280..516a07998854 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlan.cpp
@@ -124,8 +124,12 @@ VPValue *VPRecipeBase::toVPValue() {
return V;
if (auto *V = dyn_cast<VPReductionRecipe>(this))
return V;
- if (auto *V = dyn_cast<VPWidenMemoryInstructionRecipe>(this))
- return V;
+ if (auto *V = dyn_cast<VPWidenMemoryInstructionRecipe>(this)) {
+ if (!V->isStore())
+ return V->getVPValue();
+ else
+ return nullptr;
+ }
if (auto *V = dyn_cast<VPWidenCallRecipe>(this))
return V;
if (auto *V = dyn_cast<VPWidenSelectRecipe>(this))
@@ -144,8 +148,12 @@ const VPValue *VPRecipeBase::toVPValue() const {
return V;
if (auto *V = dyn_cast<VPReductionRecipe>(this))
return V;
- if (auto *V = dyn_cast<VPWidenMemoryInstructionRecipe>(this))
- return V;
+ if (auto *V = dyn_cast<VPWidenMemoryInstructionRecipe>(this)) {
+ if (!V->isStore())
+ return V->getVPValue();
+ else
+ return nullptr;
+ }
if (auto *V = dyn_cast<VPWidenCallRecipe>(this))
return V;
if (auto *V = dyn_cast<VPWidenSelectRecipe>(this))
@@ -993,10 +1001,10 @@ void VPWidenMemoryInstructionRecipe::print(raw_ostream &O, const Twine &Indent,
O << "\"WIDEN ";
if (!isStore()) {
- printAsOperand(O, SlotTracker);
+ getVPValue()->printAsOperand(O, SlotTracker);
O << " = ";
}
- O << Instruction::getOpcodeName(getUnderlyingInstr()->getOpcode()) << " ";
+ O << Instruction::getOpcodeName(Ingredient.getOpcode()) << " ";
printOperands(O, SlotTracker);
}
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index d24f19e6bffa..1d85e9243a59 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -1265,8 +1265,9 @@ class VPPredInstPHIRecipe : public VPRecipeBase, public VPUser {
/// TODO: We currently execute only per-part unless a specific instance is
/// provided.
class VPWidenMemoryInstructionRecipe : public VPRecipeBase,
- public VPValue,
+ public VPDef,
public VPUser {
+ Instruction &Ingredient;
void setMask(VPValue *Mask) {
if (!Mask)
@@ -1280,16 +1281,16 @@ class VPWidenMemoryInstructionRecipe : public VPRecipeBase,
public:
VPWidenMemoryInstructionRecipe(LoadInst &Load, VPValue *Addr, VPValue *Mask)
- : VPRecipeBase(VPWidenMemoryInstructionSC),
- VPValue(VPValue::VPVMemoryInstructionSC, &Load), VPUser({Addr}) {
+ : VPRecipeBase(VPWidenMemoryInstructionSC), VPUser({Addr}),
+ Ingredient(Load) {
+ new VPValue(VPValue::VPVMemoryInstructionSC, &Load, this);
setMask(Mask);
}
VPWidenMemoryInstructionRecipe(StoreInst &Store, VPValue *Addr,
VPValue *StoredValue, VPValue *Mask)
- : VPRecipeBase(VPWidenMemoryInstructionSC),
- VPValue(VPValue::VPVMemoryInstructionSC, &Store),
- VPUser({Addr, StoredValue}) {
+ : VPRecipeBase(VPWidenMemoryInstructionSC), VPUser({Addr, StoredValue}),
+ Ingredient(Store) {
setMask(Mask);
}
@@ -1311,7 +1312,7 @@ class VPWidenMemoryInstructionRecipe : public VPRecipeBase,
}
/// Returns true if this recipe is a store.
- bool isStore() const { return isa<StoreInst>(getUnderlyingInstr()); }
+ bool isStore() const { return isa<StoreInst>(Ingredient); }
/// Return the address accessed by this recipe.
VPValue *getStoredValue() const {
diff --git a/llvm/lib/Transforms/Vectorize/VPlanValue.h b/llvm/lib/Transforms/Vectorize/VPlanValue.h
index b1f2439882f7..609a56d3fa23 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanValue.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanValue.h
@@ -36,6 +36,7 @@ class VPSlotTracker;
class VPUser;
class VPRecipeBase;
class VPPredInstPHIRecipe;
+class VPWidenMemoryInstructionRecipe;
// This is the base class of the VPlan Def/Use graph, used for modeling the data
// flow into, within and out of the VPlan. VPValues can stand for live-ins
@@ -50,6 +51,7 @@ class VPValue {
friend class VPSlotTracker;
friend class VPRecipeBase;
friend class VPPredInstPHIRecipe;
+ friend class VPWidenMemoryInstructionRecipe;
const unsigned char SubclassID; ///< Subclass identifier (for isa/dyn_cast).
More information about the llvm-branch-commits
mailing list