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

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 3 18:11:53 PST 2017


Adam Nemet <anemet at apple.com> writes:
> 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.

I can probably wait for you to get that in to land this if you think
you'll get to it in the next week or so. Duncan pointed out offline that
manufacturing the DebugLoc like this is kind of expensive, so I might
try to rework the DiagnosticInfo stuff to store the line info directly
instead of relying on a DebugLoc before finishing this.

>> 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