[llvm] [VPlan] Implement VPWidenCastRecipe::computeCost(). (NFCI) (PR #111339)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 20 21:13:30 PDT 2024
================
@@ -1462,6 +1462,56 @@ void VPWidenCastRecipe::execute(VPTransformState &State) {
State.addMetadata(Cast, cast_or_null<Instruction>(getUnderlyingValue()));
}
+InstructionCost VPWidenCastRecipe::computeCost(ElementCount VF,
+ VPCostContext &Ctx) const {
+ // Computes the CastContextHint from a recipes that may access memory.
+ auto ComputeCCH = [&](const VPRecipeBase *R) -> TTI::CastContextHint {
+ if (VF.isScalar())
+ return TTI::CastContextHint::Normal;
+ if (isa<VPInterleaveRecipe>(R))
+ return TTI::CastContextHint::Interleave;
+ if (const auto *ReplicateRecipe = dyn_cast<VPReplicateRecipe>(R))
+ return ReplicateRecipe->isPredicated() ? TTI::CastContextHint::Masked
+ : TTI::CastContextHint::Normal;
+ const auto *WidenMemoryRecipe = dyn_cast<VPWidenMemoryRecipe>(R);
+ if (WidenMemoryRecipe == nullptr)
+ return TTI::CastContextHint::None;
+ if (!WidenMemoryRecipe->isConsecutive())
+ return TTI::CastContextHint::GatherScatter;
+ if (WidenMemoryRecipe->isReverse())
+ return TTI::CastContextHint::Reversed;
+ if (WidenMemoryRecipe->isMasked())
+ return TTI::CastContextHint::Masked;
+ return TTI::CastContextHint::Normal;
+ };
+
+ TTI::CastContextHint CCH = TTI::CastContextHint::None;
+ // For Trunc, the context is the only user, which must be a
+ // VPWidenStoreRecipe, a VPInterleaveRecipe ,or a VPReplicateRecipe.
+ if ((Opcode == Instruction::Trunc || Opcode == Instruction::FPTrunc) &&
+ !hasMoreThanOneUniqueUser() && getNumUsers() > 0) {
+ if (auto *StoreRecipe = dyn_cast<VPRecipeBase>(*user_begin()))
+ CCH = ComputeCCH(StoreRecipe);
+ }
+ // For Z/Sext, the context is the operand, which must be a VPWidenLoadRecipe,
+ // a VPInterleaveRecipe, a VPReplicateRecipe or a live-in value.
+ else if (Opcode == Instruction::ZExt || Opcode == Instruction::SExt ||
+ Opcode == Instruction::FPExt) {
+ if (getOperand(0)->isLiveIn())
----------------
fhahn wrote:
Simpler to store getOperand(0) in a variable, avoiding the repeated calls?
https://github.com/llvm/llvm-project/pull/111339
More information about the llvm-commits
mailing list