diff --git a/llvm/lib/Analysis/InlineCost.cpp b/llvm/lib/Analysis/InlineCost.cpp --- a/llvm/lib/Analysis/InlineCost.cpp +++ b/llvm/lib/Analysis/InlineCost.cpp @@ -54,8 +54,8 @@ cl::ZeroOrMore, cl::desc("Default amount of inlining to perform")); -static cl::opt PrintDebugInstructionDeltas("print-instruction-deltas", - cl::Hidden, cl::init(false), +static cl::opt PrintDebugInstructionDeltas( + "print-instruction-deltas", cl::Hidden, cl::init(false), cl::desc("Prints deltas of cost and threshold per instruction")); static cl::opt InlineThreshold( @@ -132,10 +132,10 @@ public: // This DenseMap stores the delta change in cost and threshold after // accounting for the given instruction. - DenseMap CostThresholdMap; + DenseMap CostThresholdMap; virtual void emitInstructionAnnot(const Instruction *I, - formatted_raw_ostream &OS); + formatted_raw_ostream &OS); }; class CallAnalyzer : public InstVisitor { @@ -590,7 +590,7 @@ // This function is called to store the initial cost of inlining before // the given instruction was assessed. if (!PrintDebugInstructionDeltas) - return ; + return; Writer.CostThresholdMap[I].CostBefore = Cost; Writer.CostThresholdMap[I].ThresholdBefore = Threshold; } @@ -599,7 +599,7 @@ // This function is called to find new values of cost and threshold after // the instruction has been assessed. if (!PrintDebugInstructionDeltas) - return ; + return; Writer.CostThresholdMap[I].CostAfter = Cost; Writer.CostThresholdMap[I].ThresholdAfter = Threshold; } @@ -727,22 +727,24 @@ disableLoadElimination(); } -void CostAnnotationWriter::emitInstructionAnnot( - const Instruction *I, formatted_raw_ostream &OS) { - // The cost of inlining of the given instruction is printed always. - // The threshold delta is printed only when it is non-zero. It happens - // when we decided to give a bonus at a particular instruction. - assert(CostThresholdMap.count(I) > 0 && - "Expected each instruction to have an instruction annotation"); - const auto &Record = CostThresholdMap[I]; - OS << "; cost before = " << Record.CostBefore - << ", cost after = " << Record.CostAfter - << ", threshold before = " << Record.ThresholdBefore - << ", threshold after = " << Record.ThresholdAfter << ", "; - OS << "cost delta = " << Record.getCostDelta(); - if (Record.hasThresholdChanged()) - OS << ", threshold delta = " << Record.getThresholdDelta(); - OS << "\n"; +void CostAnnotationWriter::emitInstructionAnnot(const Instruction *I, + formatted_raw_ostream &OS) { + // The cost of inlining of the given instruction is printed always. + // The threshold delta is printed only when it is non-zero. It happens + // when we decided to give a bonus at a particular instruction. + if (CostThresholdMap.count(I) == 0) { + OS << "; No analysis for the instruction\n"; + return; + } + const auto &Record = CostThresholdMap[I]; + OS << "; cost before = " << Record.CostBefore + << ", cost after = " << Record.CostAfter + << ", threshold before = " << Record.ThresholdBefore + << ", threshold after = " << Record.ThresholdAfter << ", "; + OS << "cost delta = " << Record.getCostDelta(); + if (Record.hasThresholdChanged()) + OS << ", threshold delta = " << Record.getThresholdDelta(); + OS << "\n"; } /// If 'V' maps to a SROA candidate, disable SROA for it. @@ -804,7 +806,8 @@ else Operands.push_back(*I); return TargetTransformInfo::TCC_Free == - TTI.getUserCost(&GEP, Operands, TargetTransformInfo::TCK_SizeAndLatency); + TTI.getUserCost(&GEP, Operands, + TargetTransformInfo::TCK_SizeAndLatency); } bool CallAnalyzer::visitAlloca(AllocaInst &I) { diff --git a/llvm/test/Transforms/Inline/print-instructions-deltas-unfinished.ll b/llvm/test/Transforms/Inline/print-instructions-deltas-unfinished.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/Inline/print-instructions-deltas-unfinished.ll @@ -0,0 +1,22 @@ +; Require asserts for -debug-only +; REQUIRES: asserts + +; This test ensures that the hadling of instructions which were not analyzed by +; '-print-instruction-deltas' flag due to the early exit was done correctly. + +; RUN: opt < %s -inline -debug-only=inline-cost -disable-output -print-instruction-deltas -inline-threshold=0 2>&1 | FileCheck %s + +; CHECK: No analysis for the instruction +; CHECK: ret void + +declare void @callee1() + +define void @bar() { + call void @callee1() + ret void +} + +define void @foo() { + call void @bar() + ret void +}