[PATCH] OptDiag: Summarize the instruction count in asm-printer

Adam Nemet via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 3 11:39:15 PST 2017


LGTM too but can you please put this behind a command-line flag for now?  I need to add the capability to MachineORE to use MachineBFI lazily.  Otherwise we would populate BFI in AsmPrinter now even if hotness is not requested.

> On Feb 3, 2017, at 11:32 AM, Ahmed Bougacha <ahmed.bougacha at gmail.com> wrote:
> 
> LGTM, but +Adam for the ORE stuff.
> 
> On Fri, Feb 3, 2017 at 10:58 AM, Justin Bogner via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>> This teaches the AsmPrinter to remark on the number of instructions in
>> each emitted function.
>> 
>> Okay to commit?
>> 
>> commit 124e69d48f506369da86eb0a0ffe46d99a673b06
>> Author: Justin Bogner <jbogner at apple.com>
>> Date:   Thu Feb 2 18:09:59 2017 -0800
>>    OptDiag: Summarize the instruction count in asm-printer
>> 
>>    Add an optimization remark to asm-printer that summarizes the number
>>    of instructions emitted per function.
>> diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h
>> index 4daca0347b7..4b6788c69ee 100644
>> --- a/include/llvm/CodeGen/AsmPrinter.h
>> +++ b/include/llvm/CodeGen/AsmPrinter.h
>> @@ -46,6 +46,7 @@ class MachineLoop;
>> class MachineConstantPoolValue;
>> class MachineJumpTableInfo;
>> class MachineModuleInfo;
>> +class MachineOptimizationRemarkEmitter;
>> class MCAsmInfo;
>> class MCCFIInstruction;
>> class MCContext;
>> @@ -89,6 +90,9 @@ public:
>>   /// This is a pointer to the current MachineModuleInfo.
>>   MachineModuleInfo *MMI;
>> 
>> +  /// Optimization remark emitter.
>> +  MachineOptimizationRemarkEmitter *ORE;
>> +
>>   /// The symbol for the current function. This is recalculated at the beginning
>>   /// of each call to runOnMachineFunction().
>>   ///
>> diff --git a/include/llvm/CodeGen/MachineFunction.h b/include/llvm/CodeGen/MachineFunction.h
>> index 0c21b325463..d135be6ec32 100644
>> --- a/include/llvm/CodeGen/MachineFunction.h
>> +++ b/include/llvm/CodeGen/MachineFunction.h
>> @@ -498,6 +498,13 @@ public:
>>   /// it are renumbered.
>>   void RenumberBlocks(MachineBasicBlock *MBBFrom = nullptr);
>> 
>> +  /// Return a debug location for the start of this function.
>> +  ///
>> +  /// This creates an artificial DebugLoc based on the line information in the
>> +  /// function's DISubprogram, such that it's suitable to represent the location
>> +  /// of the function itself.
>> +  DebugLoc getStartLoc() const;
>> +
>>   /// print - Print out the MachineFunction in a format suitable for debugging
>>   /// to the specified stream.
>>   ///
>> diff --git a/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h b/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h
>> index fd48347d51a..345e70ecbf4 100644
>> --- a/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h
>> +++ b/include/llvm/CodeGen/MachineOptimizationRemarkEmitter.h
>> @@ -29,7 +29,7 @@ class DiagnosticInfoMIROptimization : public DiagnosticInfoOptimizationBase {
>> public:
>>   DiagnosticInfoMIROptimization(enum DiagnosticKind Kind, const char *PassName,
>>                                 StringRef RemarkName, const DebugLoc &DLoc,
>> -                                MachineBasicBlock *MBB)
>> +                                const MachineBasicBlock *MBB)
> 
> Looks good regardless of the AsmPrinter changes.
> 
>>       : DiagnosticInfoOptimizationBase(Kind, DS_Remark, PassName, RemarkName,
>>                                        *MBB->getParent()->getFunction(), DLoc),
>>         MBB(MBB) {}
>> @@ -42,7 +42,7 @@ public:
>>   const MachineBasicBlock *getBlock() const { return MBB; }
>> 
>> private:
>> -  MachineBasicBlock *MBB;
>> +  const MachineBasicBlock *MBB;
>> };
>> 
>> /// Diagnostic information for applied optimization remarks.
>> @@ -54,7 +54,7 @@ public:
>>   /// DLoc is the debug location and \p MBB is the block that the optimization
>>   /// operates in.
>>   MachineOptimizationRemark(const char *PassName, StringRef RemarkName,
>> -                            const DebugLoc &DLoc, MachineBasicBlock *MBB)
>> +                            const DebugLoc &DLoc, const MachineBasicBlock *MBB)
>>       : DiagnosticInfoMIROptimization(DK_MachineOptimizationRemark, PassName,
>>                                       RemarkName, DLoc, MBB) {}
>> 
>> @@ -77,7 +77,8 @@ public:
>>   /// remark.  \p DLoc is the debug location and \p MBB is the block that the
>>   /// optimization operates in.
>>   MachineOptimizationRemarkMissed(const char *PassName, StringRef RemarkName,
>> -                                  const DebugLoc &DLoc, MachineBasicBlock *MBB)
>> +                                  const DebugLoc &DLoc,
>> +                                  const MachineBasicBlock *MBB)
>>       : DiagnosticInfoMIROptimization(DK_MachineOptimizationRemarkMissed,
>>                                       PassName, RemarkName, DLoc, MBB) {}
>> 
>> @@ -101,7 +102,7 @@ public:
>>   /// optimization operates in.
>>   MachineOptimizationRemarkAnalysis(const char *PassName, StringRef RemarkName,
>>                                     const DebugLoc &DLoc,
>> -                                    MachineBasicBlock *MBB)
>> +                                    const MachineBasicBlock *MBB)
>>       : DiagnosticInfoMIROptimization(DK_MachineOptimizationRemarkAnalysis,
>>                                       PassName, RemarkName, DLoc, MBB) {}
>> 
>> diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>> index 0f6ca02b2a8..f8e3c327d22 100644
>> --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>> +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>> @@ -27,6 +27,7 @@
>> #include "llvm/CodeGen/MachineJumpTableInfo.h"
>> #include "llvm/CodeGen/MachineLoopInfo.h"
>> #include "llvm/CodeGen/MachineModuleInfoImpls.h"
>> +#include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
>> #include "llvm/IR/DataLayout.h"
>> #include "llvm/IR/DebugInfo.h"
>> #include "llvm/IR/Mangler.h"
>> @@ -111,6 +112,7 @@ AsmPrinter::AsmPrinter(TargetMachine &tm, std::unique_ptr<MCStreamer> Streamer)
>>       isCFIMoveForDebugging(false), LastMI(nullptr), LastFn(0), Counter(~0U) {
>>   DD = nullptr;
>>   MMI = nullptr;
>> +  ORE = nullptr;
>>   LI = nullptr;
>>   MF = nullptr;
>>   CurExceptionSym = CurrentFnSym = CurrentFnSymForSize = nullptr;
>> @@ -171,6 +173,7 @@ void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
>>   AU.setPreservesAll();
>>   MachineFunctionPass::getAnalysisUsage(AU);
>>   AU.addRequired<MachineModuleInfo>();
>> +  AU.addRequired<MachineOptimizationRemarkEmitterPass>();
>>   AU.addRequired<GCModuleInfo>();
>>   if (isVerbose())
>>     AU.addRequired<MachineLoopInfo>();
>> @@ -883,6 +886,7 @@ void AsmPrinter::EmitFunctionBody() {
>> 
>>   // Print out code for the function.
>>   bool HasAnyRealCode = false;
>> +  int NumInstsInFunction = 0;
>>   for (auto &MBB : *MF) {
>>     // Print a label for the basic block.
>>     EmitBasicBlockStart(MBB);
>> @@ -892,7 +896,7 @@ void AsmPrinter::EmitFunctionBody() {
>>       if (!MI.isPosition() && !MI.isImplicitDef() && !MI.isKill() &&
>>           !MI.isDebugValue()) {
>>         HasAnyRealCode = true;
>> -        ++EmittedInsts;
>> +        ++NumInstsInFunction;
>>       }
>> 
>>       if (ShouldPrintDebugScopes) {
>> @@ -953,6 +957,13 @@ void AsmPrinter::EmitFunctionBody() {
>>     EmitBasicBlockEnd(MBB);
>>   }
>> 
>> +  EmittedInsts += NumInstsInFunction;
>> +  MachineOptimizationRemarkAnalysis R(DEBUG_TYPE, "InstructionCount",
>> +                                      MF->getStartLoc(), &MF->front());
>> +  R << ore::NV("NumInstructions", NumInstsInFunction)
>> +    << " instructions in function";
> 
> Nit: singular if 1?
> 
>> +  ORE->emit(R);
>> +
>>   // If the function is empty and the object file uses .subsections_via_symbols,
>>   // then we need to emit *something* to the function body to prevent the
>>   // labels from collapsing together.  Just emit a noop.
>> @@ -1311,6 +1322,7 @@ void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
>>       CurrentFnSymForSize = CurrentFnBegin;
>>   }
>> 
>> +  ORE = &getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE();
>>   if (isVerbose())
>>     LI = &getAnalysis<MachineLoopInfo>();
>> }
>> diff --git a/lib/CodeGen/MachineFunction.cpp b/lib/CodeGen/MachineFunction.cpp
>> index 831e7d859bb..8ca5d108ded 100644
>> --- a/lib/CodeGen/MachineFunction.cpp
>> +++ b/lib/CodeGen/MachineFunction.cpp
>> @@ -412,6 +412,12 @@ const char *MachineFunction::createExternalSymbolName(StringRef Name) {
>>   return Dest;
>> }
>> 
>> +DebugLoc MachineFunction::getStartLoc() const {
>> +  if (DISubprogram *DIS = getFunction()->getSubprogram())
>> +    return DILocation::get(getFunction()->getContext(), DIS->getLine(), 0, DIS);
>> +  return DebugLoc();
>> +}
>> +
>> #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
>> LLVM_DUMP_METHOD void MachineFunction::dump() const {
>>   print(dbgs());
>> diff --git a/test/CodeGen/AArch64/arm64-summary-remarks.ll b/test/CodeGen/AArch64/arm64-summary-remarks.ll
>> new file mode 100644
>> index 00000000000..dc3350d5b35
>> --- /dev/null
>> +++ b/test/CodeGen/AArch64/arm64-summary-remarks.ll
>> @@ -0,0 +1,15 @@
>> +; RUN: llc < %s -mtriple=arm64-apple-ios7.0 -pass-remarks-analysis=asm-printer 2>&1 | FileCheck %s
>> +
>> +; CHECK: arm64-summary-remarks.ll:5:0: 1 instructions in function
>> +
>> +define void @empty_func() nounwind ssp !dbg !3 {
>> +  ret void
>> +}
>> +
>> +!llvm.dbg.cu = !{!0}
>> +!llvm.module.flags = !{!2}
>> +
>> +!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1)
>> +!1 = !DIFile(filename: "arm64-summary-remarks.ll", directory: "")
>> +!2 = !{i32 2, !"Debug Info Version", i32 3}
>> +!3 = distinct !DISubprogram(name: "empty_func", scope: !1, file: !1, line: 5, unit: !0)
> 
> 
> -Ahmed



More information about the llvm-commits mailing list