2828
2929using namespace llvm ;
3030
31- static cl::opt<TargetTransformInfo::TargetCostKind> CostKind (
31+ enum 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
4351enum class IntrinsicCostStrategy {
4452 InstructionCost,
@@ -63,34 +71,51 @@ static cl::opt<IntrinsicCostStrategy> IntrinsicCost(
6371#define CM_NAME " cost-model"
6472#define DEBUG_TYPE CM_NAME
6573
74+ static InstructionCost getCost (Instruction &Inst, TTI::TargetCostKind CostKind,
75+ TargetTransformInfo &TTI,
76+ TargetLibraryInfo &TLI) {
77+ auto *II = dyn_cast<IntrinsicInst>(&Inst);
78+ if (II && IntrinsicCost != IntrinsicCostStrategy::InstructionCost) {
79+ IntrinsicCostAttributes ICA (
80+ II->getIntrinsicID (), *II, InstructionCost::getInvalid (),
81+ /* TypeBasedOnly=*/ IntrinsicCost ==
82+ IntrinsicCostStrategy::TypeBasedIntrinsicCost,
83+ &TLI);
84+ return TTI.getIntrinsicInstrCost (ICA, CostKind);
85+ }
86+
87+ return TTI.getInstructionCost (&Inst, CostKind);
88+ }
89+
6690PreservedAnalyses CostModelPrinterPass::run (Function &F,
6791 FunctionAnalysisManager &AM) {
6892 auto &TTI = AM.getResult <TargetIRAnalysis>(F);
6993 auto &TLI = AM.getResult <TargetLibraryAnalysis>(F);
7094 OS << " Printing analysis 'Cost Model Analysis' for function '" << F.getName () << " ':\n " ;
7195 for (BasicBlock &B : F) {
7296 for (Instruction &Inst : B) {
73- // TODO: Use a pass parameter instead of cl::opt CostKind to determine
74- // which cost kind to print.
75- InstructionCost Cost;
76- auto *II = dyn_cast<IntrinsicInst>(&Inst);
77- if (II && IntrinsicCost != IntrinsicCostStrategy::InstructionCost) {
78- IntrinsicCostAttributes ICA (
79- II->getIntrinsicID (), *II, InstructionCost::getInvalid (),
80- /* TypeBasedOnly=*/ IntrinsicCost ==
81- IntrinsicCostStrategy::TypeBasedIntrinsicCost,
82- &TLI);
83- Cost = TTI.getIntrinsicInstrCost (ICA, CostKind);
97+ OS << " Cost Model: " ;
98+ if (CostKind == OutputCostKind::All) {
99+ OS << " Found costs of " ;
100+ InstructionCost RThru = getCost (Inst, TTI::TCK_RecipThroughput, TTI, TLI);
101+ InstructionCost CodeSize = getCost (Inst, TTI::TCK_CodeSize, TTI, TLI);
102+ InstructionCost Lat = getCost (Inst, TTI::TCK_Latency, TTI, TLI);
103+ InstructionCost SizeLat = getCost (Inst, TTI::TCK_SizeAndLatency, TTI, TLI);
104+ if (RThru == CodeSize && RThru == Lat && RThru == SizeLat)
105+ OS << RThru;
106+ else
107+ OS << " RThru:" << RThru << " CodeSize:" << CodeSize << " Lat:" << Lat
108+ << " SizeLat:" << SizeLat;
109+ OS << " for: " << Inst << " \n " ;
84110 } else {
85- Cost = TTI.getInstructionCost (&Inst, CostKind);
111+ InstructionCost Cost =
112+ getCost (Inst, (TTI::TargetCostKind)(unsigned )CostKind, TTI, TLI);
113+ if (auto CostVal = Cost.getValue ())
114+ OS << " Found an estimated cost of " << *CostVal;
115+ else
116+ OS << " Invalid cost" ;
117+ OS << " for instruction: " << Inst << " \n " ;
86118 }
87-
88- if (auto CostVal = Cost.getValue ())
89- OS << " Cost Model: Found an estimated cost of " << *CostVal;
90- else
91- OS << " Cost Model: Invalid cost" ;
92-
93- OS << " for instruction: " << Inst << " \n " ;
94119 }
95120 }
96121 return PreservedAnalyses::all ();
0 commit comments