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). _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits