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

Adam Nemet via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 6 10:09:40 PST 2017


> On Feb 3, 2017, at 6:11 PM, Justin Bogner <mail at justinbogner.com> wrote:
> 
> 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.

Sure I should be able to do it this week.

Matthias, fyi, since we were talking about implementing something like what Justin is doing in this patch.

Adam

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