diff --git a/llvm/test/tools/llvm-mca/JSON/X86/instruction-tables-multiple-anonymous-regions.s b/llvm/test/tools/llvm-mca/JSON/X86/instruction-tables-multiple-anonymous-regions.s --- a/llvm/test/tools/llvm-mca/JSON/X86/instruction-tables-multiple-anonymous-regions.s +++ b/llvm/test/tools/llvm-mca/JSON/X86/instruction-tables-multiple-anonymous-regions.s @@ -238,6 +238,11 @@ # CHECK-NEXT: } # CHECK-NEXT: } # CHECK-NEXT: ], +# CHECK-NEXT: "SimulationParameters": { +# CHECK-NEXT: "-march": "x86_64", +# CHECK-NEXT: "-mcpu": "haswell", +# CHECK-NEXT: "-mtriple": "x86_64-unknown-unknown" +# CHECK-NEXT: }, # CHECK-NEXT: "TargetInfo": { # CHECK-NEXT: "CPUName": "haswell", # CHECK-NEXT: "Resources": [ diff --git a/llvm/test/tools/llvm-mca/JSON/X86/instruction-tables-multiple-regions.s b/llvm/test/tools/llvm-mca/JSON/X86/instruction-tables-multiple-regions.s --- a/llvm/test/tools/llvm-mca/JSON/X86/instruction-tables-multiple-regions.s +++ b/llvm/test/tools/llvm-mca/JSON/X86/instruction-tables-multiple-regions.s @@ -263,6 +263,11 @@ # CHECK-NEXT: } # CHECK-NEXT: } # CHECK-NEXT: ], +# CHECK-NEXT: "SimulationParameters": { +# CHECK-NEXT: "-march": "x86_64", +# CHECK-NEXT: "-mcpu": "haswell", +# CHECK-NEXT: "-mtriple": "x86_64-unknown-unknown" +# CHECK-NEXT: }, # CHECK-NEXT: "TargetInfo": { # CHECK-NEXT: "CPUName": "haswell", # CHECK-NEXT: "Resources": [ diff --git a/llvm/test/tools/llvm-mca/JSON/X86/views.s b/llvm/test/tools/llvm-mca/JSON/X86/views-custom-parameters.s copy from llvm/test/tools/llvm-mca/JSON/X86/views.s copy to llvm/test/tools/llvm-mca/JSON/X86/views-custom-parameters.s --- a/llvm/test/tools/llvm-mca/JSON/X86/views.s +++ b/llvm/test/tools/llvm-mca/JSON/X86/views-custom-parameters.s @@ -2,8 +2,8 @@ # Verify that we create proper JSON for the MCA views TimelineView, ResourcePressureview, # InstructionInfoView and SummaryView. -# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=haswell --json --timeline-max-iterations=1 --timeline --all-stats --all-views < %s | FileCheck %s -# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=haswell --json --timeline-max-iterations=1 --timeline --all-stats --all-views -o %t.json < %s +# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=haswell -lqueue=12 -squeue=12 --json --timeline-max-iterations=1 --timeline --all-stats --all-views < %s | FileCheck %s +# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=haswell -lqueue=12 -squeue=12 --json --timeline-max-iterations=1 --timeline --all-stats --all-views -o %t.json < %s # RUN: cat %t.json \ # RUN: | %python -c 'import json, sys; json.dump(json.loads(sys.stdin.read()), sys.stdout, sort_keys=True, indent=2)' \ # RUN: | FileCheck %s @@ -160,6 +160,13 @@ # CHECK-NEXT: } # CHECK-NEXT: } # CHECK-NEXT: ], +# CHECK-NEXT: "SimulationParameters": { +# CHECK-NEXT: "-lqueue": 12, +# CHECK-NEXT: "-march": "x86_64", +# CHECK-NEXT: "-mcpu": "haswell", +# CHECK-NEXT: "-mtriple": "x86_64-unknown-unknown", +# CHECK-NEXT: "-squeue": 12 +# CHECK-NEXT: }, # CHECK-NEXT: "TargetInfo": { # CHECK-NEXT: "CPUName": "haswell", # CHECK-NEXT: "Resources": [ diff --git a/llvm/test/tools/llvm-mca/JSON/X86/views-multiple-anonymous-regions.s b/llvm/test/tools/llvm-mca/JSON/X86/views-multiple-anonymous-regions.s --- a/llvm/test/tools/llvm-mca/JSON/X86/views-multiple-anonymous-regions.s +++ b/llvm/test/tools/llvm-mca/JSON/X86/views-multiple-anonymous-regions.s @@ -567,6 +567,11 @@ # CHECK-NEXT: } # CHECK-NEXT: } # CHECK-NEXT: ], +# CHECK-NEXT: "SimulationParameters": { +# CHECK-NEXT: "-march": "x86_64", +# CHECK-NEXT: "-mcpu": "haswell", +# CHECK-NEXT: "-mtriple": "x86_64-unknown-unknown" +# CHECK-NEXT: }, # CHECK-NEXT: "TargetInfo": { # CHECK-NEXT: "CPUName": "haswell", # CHECK-NEXT: "Resources": [ diff --git a/llvm/test/tools/llvm-mca/JSON/X86/views-multiple-region.s b/llvm/test/tools/llvm-mca/JSON/X86/views-multiple-region.s --- a/llvm/test/tools/llvm-mca/JSON/X86/views-multiple-region.s +++ b/llvm/test/tools/llvm-mca/JSON/X86/views-multiple-region.s @@ -274,6 +274,11 @@ # CHECK-NEXT: } # CHECK-NEXT: } # CHECK-NEXT: ], +# CHECK-NEXT: "SimulationParameters": { +# CHECK-NEXT: "-march": "x86_64", +# CHECK-NEXT: "-mcpu": "haswell", +# CHECK-NEXT: "-mtriple": "x86_64-unknown-unknown" +# CHECK-NEXT: }, # CHECK-NEXT: "TargetInfo": { # CHECK-NEXT: "CPUName": "haswell", # CHECK-NEXT: "Resources": [ diff --git a/llvm/test/tools/llvm-mca/JSON/X86/views.s b/llvm/test/tools/llvm-mca/JSON/X86/views.s --- a/llvm/test/tools/llvm-mca/JSON/X86/views.s +++ b/llvm/test/tools/llvm-mca/JSON/X86/views.s @@ -160,6 +160,11 @@ # CHECK-NEXT: } # CHECK-NEXT: } # CHECK-NEXT: ], +# CHECK-NEXT: "SimulationParameters": { +# CHECK-NEXT: "-march": "x86_64", +# CHECK-NEXT: "-mcpu": "haswell", +# CHECK-NEXT: "-mtriple": "x86_64-unknown-unknown" +# CHECK-NEXT: }, # CHECK-NEXT: "TargetInfo": { # CHECK-NEXT: "CPUName": "haswell", # CHECK-NEXT: "Resources": [ diff --git a/llvm/tools/llvm-mca/PipelinePrinter.h b/llvm/tools/llvm-mca/PipelinePrinter.h --- a/llvm/tools/llvm-mca/PipelinePrinter.h +++ b/llvm/tools/llvm-mca/PipelinePrinter.h @@ -19,6 +19,7 @@ #include "Views/View.h" #include "llvm/ADT/SmallVector.h" #include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/MCA/Context.h" #include "llvm/MCA/Pipeline.h" #include "llvm/Support/raw_ostream.h" @@ -41,16 +42,18 @@ const CodeRegion &Region; unsigned RegionIdx; const MCSubtargetInfo &STI; + const PipelineOptions &PO; llvm::SmallVector, 8> Views; void printRegionHeader(llvm::raw_ostream &OS) const; json::Object getJSONReportRegion() const; json::Object getJSONTargetInfo() const; + json::Object getJSONSimulationParameters() const; public: PipelinePrinter(Pipeline &Pipe, const CodeRegion &R, unsigned Idx, - const MCSubtargetInfo &STI) - : P(Pipe), Region(R), RegionIdx(Idx), STI(STI), Views() {} + const MCSubtargetInfo &STI, const PipelineOptions &PO) + : P(Pipe), Region(R), RegionIdx(Idx), STI(STI), PO(PO), Views() {} void addView(std::unique_ptr V) { P.addEventListener(V.get()); diff --git a/llvm/tools/llvm-mca/PipelinePrinter.cpp b/llvm/tools/llvm-mca/PipelinePrinter.cpp --- a/llvm/tools/llvm-mca/PipelinePrinter.cpp +++ b/llvm/tools/llvm-mca/PipelinePrinter.cpp @@ -45,6 +45,39 @@ return JO; } +json::Object PipelinePrinter::getJSONSimulationParameters() const { + json::Object SimParameters({{"-mcpu", STI.getCPU()}, + {"-mtriple", STI.getTargetTriple().getTriple()}, + {"-march", STI.getTargetTriple().getArchName()}}); + + const MCSchedModel &SM = STI.getSchedModel(); + if (!SM.isOutOfOrder()) + return SimParameters; + + if (PO.RegisterFileSize) + SimParameters.try_emplace("-register-file-size", PO.RegisterFileSize); + + if (!PO.AssumeNoAlias) + SimParameters.try_emplace("-noalias", PO.AssumeNoAlias); + + if (PO.DecodersThroughput) + SimParameters.try_emplace("-decoder-throughput", PO.DecodersThroughput); + + if (PO.MicroOpQueueSize) + SimParameters.try_emplace("-micro-op-queue-size", PO.MicroOpQueueSize); + + if (PO.DispatchWidth) + SimParameters.try_emplace("-dispatch", PO.DispatchWidth); + + if (PO.LoadQueueSize) + SimParameters.try_emplace("-lqueue", PO.LoadQueueSize); + + if (PO.StoreQueueSize) + SimParameters.try_emplace("-squeue", PO.StoreQueueSize); + + return SimParameters; +} + json::Object PipelinePrinter::getJSONTargetInfo() const { json::Array Resources; const MCSchedModel &SM = STI.getSchedModel(); @@ -71,10 +104,9 @@ } void PipelinePrinter::printReport(json::Object &JO) const { - if (!RegionIdx) - JO.try_emplace("TargetInfo", getJSONTargetInfo()); - if (!RegionIdx) { + JO.try_emplace("TargetInfo", getJSONTargetInfo()); + JO.try_emplace("SimulationParameters", getJSONSimulationParameters()); // Construct an array of regions. JO.try_emplace("CodeRegions", json::Array()); } diff --git a/llvm/tools/llvm-mca/llvm-mca.cpp b/llvm/tools/llvm-mca/llvm-mca.cpp --- a/llvm/tools/llvm-mca/llvm-mca.cpp +++ b/llvm/tools/llvm-mca/llvm-mca.cpp @@ -569,7 +569,7 @@ P->appendStage(std::make_unique(S)); P->appendStage(std::make_unique(SM)); - mca::PipelinePrinter Printer(*P, *Region, RegionIdx, *STI); + mca::PipelinePrinter Printer(*P, *Region, RegionIdx, *STI, PO); if (PrintJson) { Printer.addView( std::make_unique(*STI, *IP, Insts)); @@ -608,7 +608,7 @@ // Create a basic pipeline simulating an out-of-order backend. auto P = MCA.createDefaultPipeline(PO, S, *CB); - mca::PipelinePrinter Printer(*P, *Region, RegionIdx, *STI); + mca::PipelinePrinter Printer(*P, *Region, RegionIdx, *STI, PO); // When we output JSON, we add a view that contains the instructions // and CPU resource information.