[llvm] [VPlan] Port invalid cost remarks to VPlan. (PR #99322)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 25 07:25:28 PDT 2024
================
@@ -4374,33 +4395,57 @@ static void emitInvalidCostRemarks(SmallVector<InstructionVFPair> InvalidCosts,
// Group the instructions together to emit separate remarks for:
// load (vf1, vf2)
// store (vf1)
- auto Tail = ArrayRef<InstructionVFPair>(InvalidCosts);
- auto Subset = ArrayRef<InstructionVFPair>();
+ auto Tail = ArrayRef<RecipeVFPair>(InvalidCosts);
+ auto Subset = ArrayRef<RecipeVFPair>();
do {
if (Subset.empty())
Subset = Tail.take_front(1);
- Instruction *I = Subset.front().first;
+ VPRecipeBase *R = Subset.front().first;
+
+ unsigned Opcode =
+ TypeSwitch<const VPRecipeBase *, unsigned>(R)
+ .Case<VPHeaderPHIRecipe>(
+ [](const auto *R) { return Instruction::PHI; })
+ .Case<VPWidenSelectRecipe>(
+ [](const auto *R) { return Instruction::Select; })
+ .Case<VPWidenStoreRecipe>(
+ [](const auto *R) { return Instruction::Store; })
+ .Case<VPWidenLoadRecipe>(
+ [](const auto *R) { return Instruction::Load; })
+ .Case<VPWidenCallRecipe>(
+ [](const auto *R) { return Instruction::Call; })
+ .Case<VPInstruction, VPWidenRecipe, VPReplicateRecipe,
+ VPWidenCastRecipe>(
+ [](const auto *R) { return R->getOpcode(); })
+ .Case<VPInterleaveRecipe>([](const VPInterleaveRecipe *R) {
+ return R->getStoredValues().empty() ? Instruction::Load
+ : Instruction::Store;
+ });
// If the next instruction is different, or if there are no other pairs,
// emit a remark for the collated subset. e.g.
// [(load, vf1), (load, vf2))]
// to emit:
// remark: invalid costs for 'load' at VF=(vf, vf2)
- if (Subset == Tail || Tail[Subset.size()].first != I) {
+ if (Subset == Tail || Tail[Subset.size()].first != R) {
std::string OutString;
raw_string_ostream OS(OutString);
assert(!Subset.empty() && "Unexpected empty range");
- OS << "Instruction with invalid costs prevented vectorization at VF=(";
+ OS << "Recipe with invalid costs prevented vectorization at VF=(";
for (const auto &Pair : Subset)
OS << (Pair.second == Subset.front().second ? "" : ", ") << Pair.second;
OS << "):";
- if (auto *CI = dyn_cast<CallInst>(I))
- OS << " call to " << CI->getCalledFunction()->getName();
+ if (Opcode == Instruction::Call)
+ OS << " call to "
+ << R->getOperand(R->getNumOperands() - 1)
+ ->getLiveInIRValue()
+ ->getName();
----------------
ayalz wrote:
Better have VPWidenCallRecipe and VPReplicateRecipe-of-a-Call take care of printing themselves via getCalledScalarFunction and underlying.getCalledFunction(), respectively?
https://github.com/llvm/llvm-project/pull/99322
More information about the llvm-commits
mailing list