Skip to content

Commit 42386dc

Browse files
authored
[llvm-mca] Add bottle-neck analysis to JSON output. (#90056)
This patch implements the bottle-neck analysis data in the JSON dump mode.
1 parent 0ee0857 commit 42386dc

File tree

7 files changed

+222
-1
lines changed

7 files changed

+222
-1
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mca_test_checks.py
2+
# RUN: llvm-mca -mtriple=x86_64-unknown-unknown -mcpu=haswell --json --timeline-max-iterations=1 --bottleneck-analysis --resource-pressure=false --instruction-info=false < %s | FileCheck %s
3+
vaddps %xmm0, %xmm0, %xmm1
4+
vblendvps %xmm1, (%rdi), %xmm2, %xmm3
5+
6+
# CHECK: {
7+
# CHECK-NEXT: "CodeRegions": [
8+
# CHECK-NEXT: {
9+
# CHECK-NEXT: "BottleneckAnalysis": {
10+
# CHECK-NEXT: "DataDependencyCycles": 0,
11+
# CHECK-NEXT: "DependencyEdge": [
12+
# CHECK-NEXT: {
13+
# CHECK-NEXT: "FromID": 1,
14+
# CHECK-NEXT: "ResourceOrRegID": 128,
15+
# CHECK-NEXT: "ToID": 3,
16+
# CHECK-NEXT: "Type": 3
17+
# CHECK-NEXT: },
18+
# CHECK-NEXT: {
19+
# CHECK-NEXT: "FromID": 3,
20+
# CHECK-NEXT: "ResourceOrRegID": 128,
21+
# CHECK-NEXT: "ToID": 5,
22+
# CHECK-NEXT: "Type": 3
23+
# CHECK-NEXT: }
24+
# CHECK-NEXT: ],
25+
# CHECK-NEXT: "MemoryDependencyCycles": 0,
26+
# CHECK-NEXT: "PressureIncreaseCycles": 56,
27+
# CHECK-NEXT: "RegisterDependencyCycles": 0,
28+
# CHECK-NEXT: "ResourcePressure": [
29+
# CHECK-NEXT: {
30+
# CHECK-NEXT: "HWPort5": 56
31+
# CHECK-NEXT: }
32+
# CHECK-NEXT: ],
33+
# CHECK-NEXT: "ResourcePressureCycles": 56,
34+
# CHECK-NEXT: "TotalCycles": 209
35+
# CHECK-NEXT: },
36+
# CHECK-NEXT: "Instructions": [
37+
# CHECK-NEXT: "vaddps\t%xmm0, %xmm0, %xmm1",
38+
# CHECK-NEXT: "vblendvps\t%xmm1, (%rdi), %xmm2, %xmm3"
39+
# CHECK-NEXT: ],
40+
# CHECK-NEXT: "Name": "",
41+
# CHECK-NEXT: "SummaryView": {
42+
# CHECK-NEXT: "BlockRThroughput": 2,
43+
# CHECK-NEXT: "DispatchWidth": 4,
44+
# CHECK-NEXT: "IPC": 0.9569377990430622,
45+
# CHECK-NEXT: "Instructions": 200,
46+
# CHECK-NEXT: "Iterations": 100,
47+
# CHECK-NEXT: "TotalCycles": 209,
48+
# CHECK-NEXT: "TotaluOps": 400,
49+
# CHECK-NEXT: "uOpsPerCycle": 1.9138755980861244
50+
# CHECK-NEXT: }
51+
# CHECK-NEXT: }
52+
# CHECK-NEXT: ],
53+
# CHECK-NEXT: "SimulationParameters": {
54+
# CHECK-NEXT: "-march": "x86_64",
55+
# CHECK-NEXT: "-mcpu": "haswell",
56+
# CHECK-NEXT: "-mtriple": "x86_64-unknown-unknown"
57+
# CHECK-NEXT: },
58+
# CHECK-NEXT: "TargetInfo": {
59+
# CHECK-NEXT: "CPUName": "haswell",
60+
# CHECK-NEXT: "Resources": [
61+
# CHECK-NEXT: "HWDivider",
62+
# CHECK-NEXT: "HWFPDivider",
63+
# CHECK-NEXT: "HWPort0",
64+
# CHECK-NEXT: "HWPort1",
65+
# CHECK-NEXT: "HWPort2",
66+
# CHECK-NEXT: "HWPort3",
67+
# CHECK-NEXT: "HWPort4",
68+
# CHECK-NEXT: "HWPort5",
69+
# CHECK-NEXT: "HWPort6",
70+
# CHECK-NEXT: "HWPort7"
71+
# CHECK-NEXT: ]
72+
# CHECK-NEXT: }
73+
# CHECK-NEXT: }

llvm/test/tools/llvm-mca/JSON/X86/views-custom-parameters.s

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ add %edx, %edx
1616
# CHECK: {
1717
# CHECK-NEXT: "CodeRegions": [
1818
# CHECK-NEXT: {
19+
# CHECK-NEXT: "BottleneckAnalysis": {
20+
# CHECK-NEXT: "PressureIncreaseCycles": 0
21+
# CHECK-NEXT: },
1922
# CHECK-NEXT: "DispatchStatistics": {
2023
# CHECK-NEXT: "GROUP": 0,
2124
# CHECK-NEXT: "LQ": 0,

llvm/test/tools/llvm-mca/JSON/X86/views-multiple-anonymous-regions.s

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,29 @@ add %edx, %edx
1919
# CHECK: {
2020
# CHECK-NEXT: "CodeRegions": [
2121
# CHECK-NEXT: {
22+
# CHECK-NEXT: "BottleneckAnalysis": {
23+
# CHECK-NEXT: "DataDependencyCycles": 39,
24+
# CHECK-NEXT: "DependencyEdge": [
25+
# CHECK-NEXT: {
26+
# CHECK-NEXT: "FromID": 0,
27+
# CHECK-NEXT: "ResourceOrRegID": 22,
28+
# CHECK-NEXT: "ToID": 1,
29+
# CHECK-NEXT: "Type": 1
30+
# CHECK-NEXT: },
31+
# CHECK-NEXT: {
32+
# CHECK-NEXT: "FromID": 1,
33+
# CHECK-NEXT: "ResourceOrRegID": 22,
34+
# CHECK-NEXT: "ToID": 2,
35+
# CHECK-NEXT: "Type": 1
36+
# CHECK-NEXT: }
37+
# CHECK-NEXT: ],
38+
# CHECK-NEXT: "MemoryDependencyCycles": 0,
39+
# CHECK-NEXT: "PressureIncreaseCycles": 39,
40+
# CHECK-NEXT: "RegisterDependencyCycles": 39,
41+
# CHECK-NEXT: "ResourcePressure": [],
42+
# CHECK-NEXT: "ResourcePressureCycles": 0,
43+
# CHECK-NEXT: "TotalCycles": 103
44+
# CHECK-NEXT: },
2245
# CHECK-NEXT: "DispatchStatistics": {
2346
# CHECK-NEXT: "GROUP": 0,
2447
# CHECK-NEXT: "LQ": 0,
@@ -175,6 +198,29 @@ add %edx, %edx
175198
# CHECK-NEXT: }
176199
# CHECK-NEXT: },
177200
# CHECK-NEXT: {
201+
# CHECK-NEXT: "BottleneckAnalysis": {
202+
# CHECK-NEXT: "DataDependencyCycles": 69,
203+
# CHECK-NEXT: "DependencyEdge": [
204+
# CHECK-NEXT: {
205+
# CHECK-NEXT: "FromID": 0,
206+
# CHECK-NEXT: "ResourceOrRegID": 24,
207+
# CHECK-NEXT: "ToID": 2,
208+
# CHECK-NEXT: "Type": 1
209+
# CHECK-NEXT: },
210+
# CHECK-NEXT: {
211+
# CHECK-NEXT: "FromID": 2,
212+
# CHECK-NEXT: "ResourceOrRegID": 24,
213+
# CHECK-NEXT: "ToID": 4,
214+
# CHECK-NEXT: "Type": 1
215+
# CHECK-NEXT: }
216+
# CHECK-NEXT: ],
217+
# CHECK-NEXT: "MemoryDependencyCycles": 0,
218+
# CHECK-NEXT: "PressureIncreaseCycles": 69,
219+
# CHECK-NEXT: "RegisterDependencyCycles": 69,
220+
# CHECK-NEXT: "ResourcePressure": [],
221+
# CHECK-NEXT: "ResourcePressureCycles": 0,
222+
# CHECK-NEXT: "TotalCycles": 103
223+
# CHECK-NEXT: },
178224
# CHECK-NEXT: "DispatchStatistics": {
179225
# CHECK-NEXT: "GROUP": 0,
180226
# CHECK-NEXT: "LQ": 0,
@@ -411,6 +457,29 @@ add %edx, %edx
411457
# CHECK-NEXT: }
412458
# CHECK-NEXT: },
413459
# CHECK-NEXT: {
460+
# CHECK-NEXT: "BottleneckAnalysis": {
461+
# CHECK-NEXT: "DataDependencyCycles": 39,
462+
# CHECK-NEXT: "DependencyEdge": [
463+
# CHECK-NEXT: {
464+
# CHECK-NEXT: "FromID": 0,
465+
# CHECK-NEXT: "ResourceOrRegID": 27,
466+
# CHECK-NEXT: "ToID": 1,
467+
# CHECK-NEXT: "Type": 1
468+
# CHECK-NEXT: },
469+
# CHECK-NEXT: {
470+
# CHECK-NEXT: "FromID": 1,
471+
# CHECK-NEXT: "ResourceOrRegID": 27,
472+
# CHECK-NEXT: "ToID": 2,
473+
# CHECK-NEXT: "Type": 1
474+
# CHECK-NEXT: }
475+
# CHECK-NEXT: ],
476+
# CHECK-NEXT: "MemoryDependencyCycles": 0,
477+
# CHECK-NEXT: "PressureIncreaseCycles": 39,
478+
# CHECK-NEXT: "RegisterDependencyCycles": 39,
479+
# CHECK-NEXT: "ResourcePressure": [],
480+
# CHECK-NEXT: "ResourcePressureCycles": 0,
481+
# CHECK-NEXT: "TotalCycles": 103
482+
# CHECK-NEXT: },
414483
# CHECK-NEXT: "DispatchStatistics": {
415484
# CHECK-NEXT: "GROUP": 0,
416485
# CHECK-NEXT: "LQ": 0,

llvm/test/tools/llvm-mca/JSON/X86/views-multiple-region.s

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ add %edx, %edx
2020
# CHECK: {
2121
# CHECK-NEXT: "CodeRegions": [
2222
# CHECK-NEXT: {
23+
# CHECK-NEXT: "BottleneckAnalysis": {
24+
# CHECK-NEXT: "PressureIncreaseCycles": 0
25+
# CHECK-NEXT: },
2326
# CHECK-NEXT: "DispatchStatistics": {
2427
# CHECK-NEXT: "GROUP": 0,
2528
# CHECK-NEXT: "LQ": 0,
@@ -164,6 +167,29 @@ add %edx, %edx
164167
# CHECK-NEXT: }
165168
# CHECK-NEXT: },
166169
# CHECK-NEXT: {
170+
# CHECK-NEXT: "BottleneckAnalysis": {
171+
# CHECK-NEXT: "DataDependencyCycles": 69,
172+
# CHECK-NEXT: "DependencyEdge": [
173+
# CHECK-NEXT: {
174+
# CHECK-NEXT: "FromID": 0,
175+
# CHECK-NEXT: "ResourceOrRegID": 24,
176+
# CHECK-NEXT: "ToID": 2,
177+
# CHECK-NEXT: "Type": 1
178+
# CHECK-NEXT: },
179+
# CHECK-NEXT: {
180+
# CHECK-NEXT: "FromID": 2,
181+
# CHECK-NEXT: "ResourceOrRegID": 24,
182+
# CHECK-NEXT: "ToID": 4,
183+
# CHECK-NEXT: "Type": 1
184+
# CHECK-NEXT: }
185+
# CHECK-NEXT: ],
186+
# CHECK-NEXT: "MemoryDependencyCycles": 0,
187+
# CHECK-NEXT: "PressureIncreaseCycles": 69,
188+
# CHECK-NEXT: "RegisterDependencyCycles": 69,
189+
# CHECK-NEXT: "ResourcePressure": [],
190+
# CHECK-NEXT: "ResourcePressureCycles": 0,
191+
# CHECK-NEXT: "TotalCycles": 103
192+
# CHECK-NEXT: },
167193
# CHECK-NEXT: "DispatchStatistics": {
168194
# CHECK-NEXT: "GROUP": 0,
169195
# CHECK-NEXT: "LQ": 0,

llvm/test/tools/llvm-mca/JSON/X86/views.s

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ add %edx, %edx
1616
# CHECK: {
1717
# CHECK-NEXT: "CodeRegions": [
1818
# CHECK-NEXT: {
19+
# CHECK-NEXT: "BottleneckAnalysis": {
20+
# CHECK-NEXT: "PressureIncreaseCycles": 0
21+
# CHECK-NEXT: },
1922
# CHECK-NEXT: "DispatchStatistics": {
2023
# CHECK-NEXT: "GROUP": 0,
2124
# CHECK-NEXT: "LQ": 0,

llvm/tools/llvm-mca/Views/BottleneckAnalysis.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,5 +641,51 @@ void BottleneckAnalysis::printView(raw_ostream &OS) const {
641641
printCriticalSequence(OS);
642642
}
643643

644+
json::Value BottleneckAnalysis::toJSON() const {
645+
if (!SeenStallCycles || !BPI.PressureIncreaseCycles) {
646+
json::Object JO({{"PressureIncreaseCycles", 0}});
647+
return JO;
648+
}
649+
650+
json::Array CriticalSequence;
651+
// get critical sequence
652+
SmallVector<const DependencyEdge *, 16> Seq;
653+
DG.getCriticalSequence(Seq);
654+
if (!Seq.empty()) {
655+
for (const DependencyEdge *&DE : Seq) {
656+
json::Object DEJO({{"FromID", DE->FromIID},
657+
{"ToID", DE->ToIID},
658+
{"Type", static_cast<unsigned>(DE->Dep.Type)},
659+
{"ResourceOrRegID", DE->Dep.ResourceOrRegID}});
660+
CriticalSequence.push_back(std::move(DEJO));
661+
}
662+
}
663+
664+
json::Array ResourcePressure;
665+
if (BPI.PressureIncreaseCycles) {
666+
ArrayRef<unsigned> Distribution = Tracker.getResourcePressureDistribution();
667+
const MCSchedModel &SM = getSubTargetInfo().getSchedModel();
668+
for (unsigned I = 0, E = Distribution.size(); I < E; ++I) {
669+
unsigned ReleaseAtCycles = Distribution[I];
670+
if (ReleaseAtCycles) {
671+
const MCProcResourceDesc &PRDesc = *SM.getProcResource(I);
672+
json::Object RPJO({{PRDesc.Name, ReleaseAtCycles}});
673+
ResourcePressure.push_back(std::move(RPJO));
674+
}
675+
}
676+
}
677+
678+
json::Object JO({{"PressureIncreaseCycles", BPI.PressureIncreaseCycles},
679+
{"ResourcePressureCycles", BPI.ResourcePressureCycles},
680+
{"DataDependencyCycles", BPI.DataDependencyCycles},
681+
{"RegisterDependencyCycles", BPI.RegisterDependencyCycles},
682+
{"MemoryDependencyCycles", BPI.MemoryDependencyCycles},
683+
{"TotalCycles", TotalCycles},
684+
{"DependencyEdge", std::move(CriticalSequence)},
685+
{"ResourcePressure", std::move(ResourcePressure)}});
686+
687+
return JO;
688+
}
689+
644690
} // namespace mca.
645691
} // namespace llvm

llvm/tools/llvm-mca/Views/BottleneckAnalysis.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,8 @@ class BottleneckAnalysis : public InstructionView {
335335

336336
void printView(raw_ostream &OS) const override;
337337
StringRef getNameAsString() const override { return "BottleneckAnalysis"; }
338-
bool isSerializable() const override { return false; }
338+
bool isSerializable() const override { return true; }
339+
json::Value toJSON() const override;
339340

340341
#ifndef NDEBUG
341342
void dump(raw_ostream &OS, MCInstPrinter &MCIP) const { DG.dump(OS, MCIP); }

0 commit comments

Comments
 (0)