diff options
| author | Adam Nemet <anemet@apple.com> | 2017-01-26 00:39:51 +0000 | 
|---|---|---|
| committer | Adam Nemet <anemet@apple.com> | 2017-01-26 00:39:51 +0000 | 
| commit | 916923e689527e99bb6c1675c95a7ce9c0d53713 (patch) | |
| tree | 1519e7ded320e2a820e26a0932094b6e345fc27a /llvm | |
| parent | 309b3bfa6ad048378b38762b7cdd69e9cb92fad3 (diff) | |
| download | bcm5719-llvm-916923e689527e99bb6c1675c95a7ce9c0d53713.tar.gz bcm5719-llvm-916923e689527e99bb6c1675c95a7ce9c0d53713.zip  | |
[llc] Add -pass-remarks-output
This is the opt/llc counterpart of -fsave-optimization-record to output
optimization remarks in a YAML file.
llvm-svn: 293121
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Analysis/OptimizationDiagnosticInfo.cpp | 16 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AArch64/arm64-spill-remarks.ll | 42 | ||||
| -rw-r--r-- | llvm/tools/llc/llc.cpp | 21 | 
3 files changed, 74 insertions, 5 deletions
diff --git a/llvm/lib/Analysis/OptimizationDiagnosticInfo.cpp b/llvm/lib/Analysis/OptimizationDiagnosticInfo.cpp index 17ee0e4b671..a104a786afd 100644 --- a/llvm/lib/Analysis/OptimizationDiagnosticInfo.cpp +++ b/llvm/lib/Analysis/OptimizationDiagnosticInfo.cpp @@ -71,13 +71,19 @@ void MappingTraits<DiagnosticInfoOptimizationBase *>::mapping(      IO &io, DiagnosticInfoOptimizationBase *&OptDiag) {    assert(io.outputting() && "input not yet implemented"); -  if (io.mapTag("!Passed", OptDiag->getKind() == DK_OptimizationRemark)) +  if (io.mapTag("!Passed", +                (OptDiag->getKind() == DK_OptimizationRemark || +                 OptDiag->getKind() == DK_MachineOptimizationRemark)))      ; -  else if (io.mapTag("!Missed", -                     OptDiag->getKind() == DK_OptimizationRemarkMissed)) +  else if (io.mapTag( +               "!Missed", +               (OptDiag->getKind() == DK_OptimizationRemarkMissed || +                OptDiag->getKind() == DK_MachineOptimizationRemarkMissed)))      ; -  else if (io.mapTag("!Analysis", -                     OptDiag->getKind() == DK_OptimizationRemarkAnalysis)) +  else if (io.mapTag( +               "!Analysis", +               (OptDiag->getKind() == DK_OptimizationRemarkAnalysis || +                OptDiag->getKind() == DK_MachineOptimizationRemarkAnalysis)))      ;    else if (io.mapTag("!AnalysisFPCommute",                       OptDiag->getKind() == diff --git a/llvm/test/CodeGen/AArch64/arm64-spill-remarks.ll b/llvm/test/CodeGen/AArch64/arm64-spill-remarks.ll index f15192e910b..bc9340352d7 100644 --- a/llvm/test/CodeGen/AArch64/arm64-spill-remarks.ll +++ b/llvm/test/CodeGen/AArch64/arm64-spill-remarks.ll @@ -1,6 +1,8 @@  ; RUN: llc < %s -mtriple=arm64-apple-ios7.0 -aarch64-neon-syntax=apple -pass-remarks-missed=regalloc 2>&1 | FileCheck -check-prefix=REMARK %s  ; RUN: llc < %s -mtriple=arm64-apple-ios7.0 -aarch64-neon-syntax=apple -pass-remarks-missed=regalloc -pass-remarks-with-hotness 2>&1 | FileCheck -check-prefix=HOTNESS %s  ; RUN: llc < %s -mtriple=arm64-apple-ios7.0 -aarch64-neon-syntax=apple 2>&1 | FileCheck -check-prefix=NO_REMARK %s +; RUN: llc < %s -mtriple=arm64-apple-ios7.0 -aarch64-neon-syntax=apple -pass-remarks-output=%t.yaml -pass-remarks-with-hotness 2>&1 | FileCheck -check-prefix=NO_REMARK %s +; RUN: cat %t.yaml | FileCheck -check-prefix=YAML %s  ; This has two nested loops, each with one value that has to be spilled and  ; then reloaded. @@ -21,6 +23,46 @@  ; NO_REMARK-NOT: remark +; YAML: --- !Missed +; YAML: Pass:            regalloc +; YAML: Name:            LoopSpillReload +; YAML: DebugLoc:        { File: /tmp/kk.c, Line: 3, Column: 20 } +; YAML: Function:        fpr128 +; YAML: Hotness:         300 +; YAML: Args: +; YAML:   - NumSpills:       '1' +; YAML:   - String:          ' spills ' +; YAML:   - NumReloads:      '1' +; YAML:   - String:          ' reloads ' +; YAML:   - String:          generated in loop +; YAML: ... +; YAML: --- !Missed +; YAML: Pass:            regalloc +; YAML: Name:            LoopSpillReload +; YAML: DebugLoc:        { File: /tmp/kk.c, Line: 2, Column: 20 } +; YAML: Function:        fpr128 +; YAML: Hotness:         30000 +; YAML: Args: +; YAML:   - NumSpills:       '1' +; YAML:   - String:          ' spills ' +; YAML:   - NumReloads:      '1' +; YAML:   - String:          ' reloads ' +; YAML:   - String:          generated in loop +; YAML: ... +; YAML: --- !Missed +; YAML: Pass:            regalloc +; YAML: Name:            LoopSpillReload +; YAML: DebugLoc:        { File: /tmp/kk.c, Line: 1, Column: 20 } +; YAML: Function:        fpr128 +; YAML: Hotness:         300 +; YAML: Args: +; YAML:   - NumSpills:       '2' +; YAML:   - String:          ' spills ' +; YAML:   - NumReloads:      '2' +; YAML:   - String:          ' reloads ' +; YAML:   - String:          generated in loop +; YAML: ... +  define void @fpr128(<4 x float>* %p) nounwind ssp !prof !11 {  entry:    br label %loop, !dbg !8 diff --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp index 1f1d214b68b..597504c08fb 100644 --- a/llvm/tools/llc/llc.cpp +++ b/llvm/tools/llc/llc.cpp @@ -141,6 +141,11 @@ static cl::opt<bool> PassRemarksWithHotness(      cl::desc("With PGO, include profile count in optimization remarks"),      cl::Hidden); +static cl::opt<std::string> +    RemarksFilename("pass-remarks-output", +                    cl::desc("YAML output filename for pass remarks"), +                    cl::value_desc("filename")); +  namespace {  static ManagedStatic<std::vector<std::string>> RunPassNames; @@ -292,11 +297,27 @@ int main(int argc, char **argv) {    if (PassRemarksWithHotness)      Context.setDiagnosticHotnessRequested(true); +  std::unique_ptr<tool_output_file> YamlFile; +  if (RemarksFilename != "") { +    std::error_code EC; +    YamlFile = llvm::make_unique<tool_output_file>(RemarksFilename, EC, +                                                   sys::fs::F_None); +    if (EC) { +      errs() << EC.message() << '\n'; +      return 1; +    } +    Context.setDiagnosticsOutputFile( +        llvm::make_unique<yaml::Output>(YamlFile->os())); +  } +    // Compile the module TimeCompilations times to give better compile time    // metrics.    for (unsigned I = TimeCompilations; I; --I)      if (int RetVal = compileModule(argv, Context))        return RetVal; + +  if (YamlFile) +    YamlFile->keep();    return 0;  }  | 

