summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorAdam Nemet <anemet@apple.com>2017-01-26 00:39:51 +0000
committerAdam Nemet <anemet@apple.com>2017-01-26 00:39:51 +0000
commit916923e689527e99bb6c1675c95a7ce9c0d53713 (patch)
tree1519e7ded320e2a820e26a0932094b6e345fc27a /llvm
parent309b3bfa6ad048378b38762b7cdd69e9cb92fad3 (diff)
downloadbcm5719-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.cpp16
-rw-r--r--llvm/test/CodeGen/AArch64/arm64-spill-remarks.ll42
-rw-r--r--llvm/tools/llc/llc.cpp21
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;
}
OpenPOWER on IntegriCloud