Output optimization remarks in YAML

Description

Output optimization remarks in YAML

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

Details

Committed
anemetSep 27 2016, 9:15 AM
Differential Revision
D24587: Output optimization remarks in YAML
Parents
rL282498: Sort headers
Branches
Unknown
Tags
Unknown