Skip to content

Commit cdf1833

Browse files
authored
[CostModel] Add -cost-kind=all costmodel output (#130490)
In order to make the different cost model kinds easier to test, and to manage the complexity of all the different variants, this patch introduces a -cost-kind=all option that will print the output of all cost model kinds. It feel especially helpful for tests that already have multiple run lines (with / without +fullfp16 for example). It currently produces the output: ``` Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %F16 = fadd half undef, undef ``` The output is collapsed into a single value if all costs are the same. Invalid costs print "Invalid" via the normal InstructionCost printing. Two test files are updated to show some examples with -intrinsic-cost-strategy=type-based-intrinsic-cost and Invalid costs. Once we have something we are happy with I will try to use this to update more tests, as in b021bdb but for more variants.
1 parent f590843 commit cdf1833

File tree

3 files changed

+995
-1165
lines changed

3 files changed

+995
-1165
lines changed

llvm/lib/Analysis/CostModel.cpp

Lines changed: 58 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,25 @@
2828

2929
using namespace llvm;
3030

31-
static cl::opt<TargetTransformInfo::TargetCostKind> CostKind(
31+
enum class OutputCostKind {
32+
RecipThroughput,
33+
Latency,
34+
CodeSize,
35+
SizeAndLatency,
36+
All,
37+
};
38+
39+
static cl::opt<OutputCostKind> CostKind(
3240
"cost-kind", cl::desc("Target cost kind"),
33-
cl::init(TargetTransformInfo::TCK_RecipThroughput),
34-
cl::values(clEnumValN(TargetTransformInfo::TCK_RecipThroughput,
35-
"throughput", "Reciprocal throughput"),
36-
clEnumValN(TargetTransformInfo::TCK_Latency,
37-
"latency", "Instruction latency"),
38-
clEnumValN(TargetTransformInfo::TCK_CodeSize,
39-
"code-size", "Code size"),
40-
clEnumValN(TargetTransformInfo::TCK_SizeAndLatency,
41-
"size-latency", "Code size and latency")));
41+
cl::init(OutputCostKind::RecipThroughput),
42+
cl::values(clEnumValN(OutputCostKind::RecipThroughput, "throughput",
43+
"Reciprocal throughput"),
44+
clEnumValN(OutputCostKind::Latency, "latency",
45+
"Instruction latency"),
46+
clEnumValN(OutputCostKind::CodeSize, "code-size", "Code size"),
47+
clEnumValN(OutputCostKind::SizeAndLatency, "size-latency",
48+
"Code size and latency"),
49+
clEnumValN(OutputCostKind::All, "all", "Print all cost kinds")));
4250

4351
enum class IntrinsicCostStrategy {
4452
InstructionCost,
@@ -79,22 +87,53 @@ static InstructionCost getCost(Instruction &Inst, TTI::TargetCostKind CostKind,
7987
return TTI.getInstructionCost(&Inst, CostKind);
8088
}
8189

90+
static TTI::TargetCostKind
91+
OutputCostKindToTargetCostKind(OutputCostKind CostKind) {
92+
switch (CostKind) {
93+
case OutputCostKind::RecipThroughput:
94+
return TTI::TCK_RecipThroughput;
95+
case OutputCostKind::Latency:
96+
return TTI::TCK_Latency;
97+
case OutputCostKind::CodeSize:
98+
return TTI::TCK_CodeSize;
99+
case OutputCostKind::SizeAndLatency:
100+
return TTI::TCK_SizeAndLatency;
101+
default:
102+
llvm_unreachable("Unexpected OutputCostKind!");
103+
};
104+
}
105+
82106
PreservedAnalyses CostModelPrinterPass::run(Function &F,
83107
FunctionAnalysisManager &AM) {
84108
auto &TTI = AM.getResult<TargetIRAnalysis>(F);
85109
auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
86110
OS << "Printing analysis 'Cost Model Analysis' for function '" << F.getName() << "':\n";
87111
for (BasicBlock &B : F) {
88112
for (Instruction &Inst : B) {
89-
// TODO: Use a pass parameter instead of cl::opt CostKind to determine
90-
// which cost kind to print.
91-
InstructionCost Cost = getCost(Inst, CostKind, TTI, TLI);
92-
if (auto CostVal = Cost.getValue())
93-
OS << "Cost Model: Found an estimated cost of " << *CostVal;
94-
else
95-
OS << "Cost Model: Invalid cost";
96-
97-
OS << " for instruction: " << Inst << "\n";
113+
OS << "Cost Model: ";
114+
if (CostKind == OutputCostKind::All) {
115+
OS << "Found costs of ";
116+
InstructionCost RThru =
117+
getCost(Inst, TTI::TCK_RecipThroughput, TTI, TLI);
118+
InstructionCost CodeSize = getCost(Inst, TTI::TCK_CodeSize, TTI, TLI);
119+
InstructionCost Lat = getCost(Inst, TTI::TCK_Latency, TTI, TLI);
120+
InstructionCost SizeLat =
121+
getCost(Inst, TTI::TCK_SizeAndLatency, TTI, TLI);
122+
if (RThru == CodeSize && RThru == Lat && RThru == SizeLat)
123+
OS << RThru;
124+
else
125+
OS << "RThru:" << RThru << " CodeSize:" << CodeSize << " Lat:" << Lat
126+
<< " SizeLat:" << SizeLat;
127+
OS << " for: " << Inst << "\n";
128+
} else {
129+
InstructionCost Cost =
130+
getCost(Inst, OutputCostKindToTargetCostKind(CostKind), TTI, TLI);
131+
if (auto CostVal = Cost.getValue())
132+
OS << "Found an estimated cost of " << *CostVal;
133+
else
134+
OS << "Invalid cost";
135+
OS << " for instruction: " << Inst << "\n";
136+
}
98137
}
99138
}
100139
return PreservedAnalyses::all();

0 commit comments

Comments
 (0)