Skip to content
  • Adam Nemet's avatar
    Output optimization remarks in YAML · a62b7e1a
    Adam Nemet authored
    (Re-committed after moving the template specialization under the yaml
    namespace.  GCC was complaining about this.)
    
    This allows various presentation of this data using an external tool.
    This was first recommended here[1].
    
    As an example, consider this module:
    
      1 int foo();
      2 int bar();
      3
      4 int baz() {
      5   return foo() + bar();
      6 }
    
    The inliner generates these missed-optimization remarks today (the
    hotness information is pulled from PGO):
    
      remark: /tmp/s.c:5:10: foo will not be inlined into baz (hotness: 30)
      remark: /tmp/s.c:5:18: bar will not be inlined into baz (hotness: 30)
    
    Now with -pass-remarks-output=<yaml-file>, we generate this YAML file:
    
      --- !Missed
      Pass:            inline
      Name:            NotInlined
      DebugLoc:        { File: /tmp/s.c, Line: 5, Column: 10 }
      Function:        baz
      Hotness:         30
      Args:
        - Callee: foo
        - String:  will not be inlined into
        - Caller: baz
      ...
      --- !Missed
      Pass:            inline
      Name:            NotInlined
      DebugLoc:        { File: /tmp/s.c, Line: 5, Column: 18 }
      Function:        baz
      Hotness:         30
      Args:
        - Callee: bar
        - String:  will not be inlined into
        - Caller: baz
      ...
    
    This is a summary of the high-level decisions:
    
    * There is a new streaming interface to emit optimization remarks.
    E.g. for the inliner remark above:
    
       ORE.emit(DiagnosticInfoOptimizationRemarkMissed(
                    DEBUG_TYPE, "NotInlined", &I)
                << NV("Callee", Callee) << " will not be inlined into "
                << NV("Caller", CS.getCaller()) << setIsVerbose());
    
    NV stands for named value and allows the YAML client to process a remark
    using its name (NotInlined) and the named arguments (Callee and Caller)
    without parsing the text of the message.
    
    Subsequent patches will update ORE users to use the new streaming API.
    
    * I am using YAML I/O for writing the YAML file.  YAML I/O requires you
    to specify reading and writing at once but reading is highly non-trivial
    for some of the more complex LLVM types.  Since it's not clear that we
    (ever) want to use LLVM to parse this YAML file, the code supports and
    asserts that we're writing only.
    
    On the other hand, I did experiment that the class hierarchy starting at
    DiagnosticInfoOptimizationBase can be mapped back from YAML generated
    here (see D24479).
    
    * The YAML stream is stored in the LLVM context.
    
    * In the example, we can probably further specify the IR value used,
    i.e. print "Function" rather than "Value".
    
    * As before hotness is computed in the analysis pass instead of
    DiganosticInfo.  This avoids the layering problem since BFI is in
    Analysis while DiagnosticInfo is in IR.
    
    [1] https://reviews.llvm.org/D19678#419445
    
    Differential Revision: https://reviews.llvm.org/D24587
    
    llvm-svn: 282539
    a62b7e1a
Loading