From c8168e70a9250161915262d35eaa7a1de57bd2b1 Mon Sep 17 00:00:00 2001 From: Adam Nemet Date: Thu, 26 Jan 2017 00:39:51 +0000 Subject: [PATCH] [llc] Add -pass-remarks-output This is the opt/llc counterpart of -fsave-optimization-record to output optimization remarks in a YAML file. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293121 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/OptimizationDiagnosticInfo.cpp | 16 +++++--- test/CodeGen/AArch64/arm64-spill-remarks.ll | 42 +++++++++++++++++++++ tools/llc/llc.cpp | 21 +++++++++++ 3 files changed, 74 insertions(+), 5 deletions(-) diff --git a/lib/Analysis/OptimizationDiagnosticInfo.cpp b/lib/Analysis/OptimizationDiagnosticInfo.cpp index 17ee0e4b671..a104a786afd 100644 --- a/lib/Analysis/OptimizationDiagnosticInfo.cpp +++ b/lib/Analysis/OptimizationDiagnosticInfo.cpp @@ -71,13 +71,19 @@ void MappingTraits::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/test/CodeGen/AArch64/arm64-spill-remarks.ll b/test/CodeGen/AArch64/arm64-spill-remarks.ll index f15192e910b..bc9340352d7 100644 --- a/test/CodeGen/AArch64/arm64-spill-remarks.ll +++ b/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/tools/llc/llc.cpp b/tools/llc/llc.cpp index 1f1d214b68b..597504c08fb 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -141,6 +141,11 @@ static cl::opt PassRemarksWithHotness( cl::desc("With PGO, include profile count in optimization remarks"), cl::Hidden); +static cl::opt + RemarksFilename("pass-remarks-output", + cl::desc("YAML output filename for pass remarks"), + cl::value_desc("filename")); + namespace { static ManagedStatic> RunPassNames; @@ -292,11 +297,27 @@ int main(int argc, char **argv) { if (PassRemarksWithHotness) Context.setDiagnosticHotnessRequested(true); + std::unique_ptr YamlFile; + if (RemarksFilename != "") { + std::error_code EC; + YamlFile = llvm::make_unique(RemarksFilename, EC, + sys::fs::F_None); + if (EC) { + errs() << EC.message() << '\n'; + return 1; + } + Context.setDiagnosticsOutputFile( + llvm::make_unique(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; } -- 2.40.0