[llvm] ed220e1 - [VPlan][NFC] Implement `VPWidenMemoryRecipe::computeCost()`. (#105614)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 3 18:46:06 PDT 2024
Author: Elvis Wang
Date: 2024-09-04T09:46:02+08:00
New Revision: ed220e15718498d0f854f1044ddcbfee00739aa7
URL: https://github.com/llvm/llvm-project/commit/ed220e15718498d0f854f1044ddcbfee00739aa7
DIFF: https://github.com/llvm/llvm-project/commit/ed220e15718498d0f854f1044ddcbfee00739aa7.diff
LOG: [VPlan][NFC] Implement `VPWidenMemoryRecipe::computeCost()`. (#105614)
In this patch, we implement the `computeCost()` function in
`VPWidenMemoryRecipe`.
Added:
Modified:
llvm/lib/Transforms/Vectorize/VPlan.h
llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index bd71dbffa929e7..9ad98a5371d814 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -2539,6 +2539,10 @@ class VPWidenMemoryRecipe : public VPRecipeBase {
llvm_unreachable("VPWidenMemoryRecipe should not be instantiated.");
}
+ /// Return the cost of this VPWidenMemoryRecipe.
+ InstructionCost computeCost(ElementCount VF,
+ VPCostContext &Ctx) const override;
+
Instruction &getIngredient() const { return Ingredient; }
};
diff --git a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
index 69c76edd0f554f..49ed733107da95 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanRecipes.cpp
@@ -272,6 +272,12 @@ static Instruction *getInstructionForCost(const VPRecipeBase *R) {
return dyn_cast_or_null<Instruction>(S->getUnderlyingValue());
if (auto *IG = dyn_cast<VPInterleaveRecipe>(R))
return IG->getInsertPos();
+ // Currently the legacy cost model only calculates the instruction cost with
+ // underlying instruction. Removing the WidenMem here will prevent
+ // force-target-instruction-cost overwriting the cost of recipe with
+ // underlying instruction which is inconsistent with the legacy model.
+ // TODO: Remove WidenMem from this function when we don't need to compare to
+ // the legacy model.
if (auto *WidenMem = dyn_cast<VPWidenMemoryRecipe>(R))
return &WidenMem->getIngredient();
return nullptr;
@@ -2132,6 +2138,46 @@ void VPPredInstPHIRecipe::print(raw_ostream &O, const Twine &Indent,
}
#endif
+InstructionCost VPWidenMemoryRecipe::computeCost(ElementCount VF,
+ VPCostContext &Ctx) const {
+ Type *Ty = ToVectorTy(getLoadStoreType(&Ingredient), VF);
+ const Align Alignment =
+ getLoadStoreAlignment(const_cast<Instruction *>(&Ingredient));
+ unsigned AS =
+ getLoadStoreAddressSpace(const_cast<Instruction *>(&Ingredient));
+ TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput;
+
+ if (!Consecutive) {
+ // TODO: Using the original IR may not be accurate.
+ // Currently, ARM will use the underlying IR to calculate gather/scatter
+ // instruction cost.
+ const Value *Ptr = getLoadStorePointerOperand(&Ingredient);
+ assert(!Reverse &&
+ "Inconsecutive memory access should not have the order.");
+ return Ctx.TTI.getAddressComputationCost(Ty) +
+ Ctx.TTI.getGatherScatterOpCost(Ingredient.getOpcode(), Ty, Ptr,
+ IsMasked, Alignment, CostKind,
+ &Ingredient);
+ }
+
+ InstructionCost Cost = 0;
+ if (IsMasked) {
+ Cost += Ctx.TTI.getMaskedMemoryOpCost(Ingredient.getOpcode(), Ty, Alignment,
+ AS, CostKind);
+ } else {
+ TTI::OperandValueInfo OpInfo =
+ Ctx.TTI.getOperandInfo(Ingredient.getOperand(0));
+ Cost += Ctx.TTI.getMemoryOpCost(Ingredient.getOpcode(), Ty, Alignment, AS,
+ CostKind, OpInfo, &Ingredient);
+ }
+ if (!Reverse)
+ return Cost;
+
+ return Cost += Ctx.TTI.getShuffleCost(TargetTransformInfo::SK_Reverse,
+ cast<VectorType>(Ty), std::nullopt,
+ CostKind, 0);
+}
+
void VPWidenLoadRecipe::execute(VPTransformState &State) {
auto *LI = cast<LoadInst>(&Ingredient);
More information about the llvm-commits
mailing list