[llvm] b11d31e - [llvm-mca] Fix JSON format for multiple regions

Marcos Horro via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 9 09:08:56 PDT 2021


Author: Marcos Horro
Date: 2021-07-09T18:04:16+02:00
New Revision: b11d31eb73a37f46a669e064b1aed77aff9f783a

URL: https://github.com/llvm/llvm-project/commit/b11d31eb73a37f46a669e064b1aed77aff9f783a
DIFF: https://github.com/llvm/llvm-project/commit/b11d31eb73a37f46a669e064b1aed77aff9f783a.diff

LOG: [llvm-mca] Fix JSON format for multiple regions

Instead of printing each region individually when using JSON format,
this patch creates a JSON object which is updated with the values of
each region, printing them at the end. New test is added for JSON output
with multiple regions.

Bug: https://bugs.llvm.org/show_bug.cgi?id=51008

Reviewed By: andreadb

Differential Revision: https://reviews.llvm.org/D105618

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

Modified: 
    llvm/test/tools/llvm-mca/JSON/X86/views.s
    llvm/tools/llvm-mca/PipelinePrinter.cpp
    llvm/tools/llvm-mca/PipelinePrinter.h
    llvm/tools/llvm-mca/Views/InstructionView.cpp
    llvm/tools/llvm-mca/Views/InstructionView.h
    llvm/tools/llvm-mca/llvm-mca.cpp

Removed: 
    


################################################################################
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
new file mode 100644
index 0000000000000..51521b1128517
--- /dev/null
+++ b/llvm/test/tools/llvm-mca/JSON/X86/views-multiple-region.s
@@ -0,0 +1,288 @@
+# NOTE: Assertions have been autogenerated by utils/update_mca_test_checks.py
+# 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: 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
+
+# LLVM-MCA-BEGIN foo
+add %eax, %eax
+# LLVM-MCA-BEGIN bar
+add %ebx, %ebx
+add %ecx, %ecx
+# LLVM-MCA-END bar
+add %edx, %edx
+# LLVM-MCA-END foo
+
+# CHECK:      {
+# CHECK-NEXT:   "Resources": {
+# CHECK-NEXT:     "CPUName": "haswell",
+# CHECK-NEXT:     "Resources": [
+# CHECK-NEXT:       "HWDivider",
+# CHECK-NEXT:       "HWFPDivider",
+# CHECK-NEXT:       "HWPort0",
+# CHECK-NEXT:       "HWPort1",
+# CHECK-NEXT:       "HWPort2",
+# CHECK-NEXT:       "HWPort3",
+# CHECK-NEXT:       "HWPort4",
+# CHECK-NEXT:       "HWPort5",
+# CHECK-NEXT:       "HWPort6",
+# CHECK-NEXT:       "HWPort7"
+# CHECK-NEXT:     ]
+# CHECK-NEXT:   },
+# CHECK-NEXT:   "bar": {
+# CHECK-NEXT:     "DispatchStatistics": {
+# CHECK-NEXT:       "GROUP": 0,
+# CHECK-NEXT:       "LQ": 0,
+# CHECK-NEXT:       "RAT": 0,
+# CHECK-NEXT:       "RCU": 0,
+# CHECK-NEXT:       "SCHEDQ": 41,
+# CHECK-NEXT:       "SQ": 0,
+# CHECK-NEXT:       "USH": 0
+# CHECK-NEXT:     },
+# CHECK-NEXT:     "InstructionInfoView": {
+# CHECK-NEXT:       "InstructionList": [
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "Instruction": 0,
+# CHECK-NEXT:           "Latency": 1,
+# CHECK-NEXT:           "NumMicroOpcodes": 1,
+# CHECK-NEXT:           "RThroughput": 0.25,
+# CHECK-NEXT:           "hasUnmodeledSideEffects": false,
+# CHECK-NEXT:           "mayLoad": false,
+# CHECK-NEXT:           "mayStore": false
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "Instruction": 1,
+# CHECK-NEXT:           "Latency": 1,
+# CHECK-NEXT:           "NumMicroOpcodes": 1,
+# CHECK-NEXT:           "RThroughput": 0.25,
+# CHECK-NEXT:           "hasUnmodeledSideEffects": false,
+# CHECK-NEXT:           "mayLoad": false,
+# CHECK-NEXT:           "mayStore": false
+# CHECK-NEXT:         }
+# CHECK-NEXT:       ]
+# CHECK-NEXT:     },
+# CHECK-NEXT:     "Instructions": [
+# CHECK-NEXT:       "addl\t%ebx, %ebx",
+# CHECK-NEXT:       "addl\t%ecx, %ecx"
+# CHECK-NEXT:     ],
+# CHECK-NEXT:     "ResourcePressureView": {
+# CHECK-NEXT:       "ResourcePressureInfo": [
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 0,
+# CHECK-NEXT:           "ResourceIndex": 3,
+# CHECK-NEXT:           "ResourceUsage": 0.5
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 0,
+# CHECK-NEXT:           "ResourceIndex": 8,
+# CHECK-NEXT:           "ResourceUsage": 0.5
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 1,
+# CHECK-NEXT:           "ResourceIndex": 2,
+# CHECK-NEXT:           "ResourceUsage": 0.5
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 1,
+# CHECK-NEXT:           "ResourceIndex": 7,
+# CHECK-NEXT:           "ResourceUsage": 0.5
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 2,
+# CHECK-NEXT:           "ResourceIndex": 2,
+# CHECK-NEXT:           "ResourceUsage": 0.5
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 2,
+# CHECK-NEXT:           "ResourceIndex": 3,
+# CHECK-NEXT:           "ResourceUsage": 0.5
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 2,
+# CHECK-NEXT:           "ResourceIndex": 7,
+# CHECK-NEXT:           "ResourceUsage": 0.5
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 2,
+# CHECK-NEXT:           "ResourceIndex": 8,
+# CHECK-NEXT:           "ResourceUsage": 0.5
+# CHECK-NEXT:         }
+# CHECK-NEXT:       ]
+# CHECK-NEXT:     },
+# CHECK-NEXT:     "SummaryView": {
+# CHECK-NEXT:       "BlockRThroughput": 0.5,
+# CHECK-NEXT:       "DispatchWidth": 4,
+# CHECK-NEXT:       "IPC": 1.941747572815534,
+# CHECK-NEXT:       "Instructions": 200,
+# CHECK-NEXT:       "Iterations": 100,
+# CHECK-NEXT:       "TotalCycles": 103,
+# CHECK-NEXT:       "TotaluOps": 200,
+# CHECK-NEXT:       "uOpsPerCycle": 1.941747572815534
+# CHECK-NEXT:     },
+# CHECK-NEXT:     "TimelineView": {
+# CHECK-NEXT:       "TimelineInfo": [
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "CycleDispatched": 0,
+# CHECK-NEXT:           "CycleExecuted": 2,
+# CHECK-NEXT:           "CycleIssued": 1,
+# CHECK-NEXT:           "CycleReady": 0,
+# CHECK-NEXT:           "CycleRetired": 3
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "CycleDispatched": 0,
+# CHECK-NEXT:           "CycleExecuted": 2,
+# CHECK-NEXT:           "CycleIssued": 1,
+# CHECK-NEXT:           "CycleReady": 0,
+# CHECK-NEXT:           "CycleRetired": 3
+# CHECK-NEXT:         }
+# CHECK-NEXT:       ]
+# CHECK-NEXT:     }
+# CHECK-NEXT:   },
+# CHECK-NEXT:   "foo": {
+# CHECK-NEXT:     "DispatchStatistics": {
+# CHECK-NEXT:       "GROUP": 0,
+# CHECK-NEXT:       "LQ": 0,
+# CHECK-NEXT:       "RAT": 0,
+# CHECK-NEXT:       "RCU": 0,
+# CHECK-NEXT:       "SCHEDQ": 0,
+# CHECK-NEXT:       "SQ": 0,
+# CHECK-NEXT:       "USH": 0
+# CHECK-NEXT:     },
+# CHECK-NEXT:     "InstructionInfoView": {
+# CHECK-NEXT:       "InstructionList": [
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "Instruction": 0,
+# CHECK-NEXT:           "Latency": 1,
+# CHECK-NEXT:           "NumMicroOpcodes": 1,
+# CHECK-NEXT:           "RThroughput": 0.25,
+# CHECK-NEXT:           "hasUnmodeledSideEffects": false,
+# CHECK-NEXT:           "mayLoad": false,
+# CHECK-NEXT:           "mayStore": false
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "Instruction": 1,
+# CHECK-NEXT:           "Latency": 1,
+# CHECK-NEXT:           "NumMicroOpcodes": 1,
+# CHECK-NEXT:           "RThroughput": 0.25,
+# CHECK-NEXT:           "hasUnmodeledSideEffects": false,
+# CHECK-NEXT:           "mayLoad": false,
+# CHECK-NEXT:           "mayStore": false
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "Instruction": 2,
+# CHECK-NEXT:           "Latency": 1,
+# CHECK-NEXT:           "NumMicroOpcodes": 1,
+# CHECK-NEXT:           "RThroughput": 0.25,
+# CHECK-NEXT:           "hasUnmodeledSideEffects": false,
+# CHECK-NEXT:           "mayLoad": false,
+# CHECK-NEXT:           "mayStore": false
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "Instruction": 3,
+# CHECK-NEXT:           "Latency": 1,
+# CHECK-NEXT:           "NumMicroOpcodes": 1,
+# CHECK-NEXT:           "RThroughput": 0.25,
+# CHECK-NEXT:           "hasUnmodeledSideEffects": false,
+# CHECK-NEXT:           "mayLoad": false,
+# CHECK-NEXT:           "mayStore": false
+# CHECK-NEXT:         }
+# CHECK-NEXT:       ]
+# CHECK-NEXT:     },
+# CHECK-NEXT:     "Instructions": [
+# CHECK-NEXT:       "addl\t%eax, %eax",
+# CHECK-NEXT:       "addl\t%ebx, %ebx",
+# CHECK-NEXT:       "addl\t%ecx, %ecx",
+# CHECK-NEXT:       "addl\t%edx, %edx"
+# CHECK-NEXT:     ],
+# CHECK-NEXT:     "ResourcePressureView": {
+# CHECK-NEXT:       "ResourcePressureInfo": [
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 0,
+# CHECK-NEXT:           "ResourceIndex": 8,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 1,
+# CHECK-NEXT:           "ResourceIndex": 7,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 2,
+# CHECK-NEXT:           "ResourceIndex": 3,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 3,
+# CHECK-NEXT:           "ResourceIndex": 2,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 4,
+# CHECK-NEXT:           "ResourceIndex": 2,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 4,
+# CHECK-NEXT:           "ResourceIndex": 3,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 4,
+# CHECK-NEXT:           "ResourceIndex": 7,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 4,
+# CHECK-NEXT:           "ResourceIndex": 8,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         }
+# CHECK-NEXT:       ]
+# CHECK-NEXT:     },
+# CHECK-NEXT:     "SummaryView": {
+# CHECK-NEXT:       "BlockRThroughput": 1,
+# CHECK-NEXT:       "DispatchWidth": 4,
+# CHECK-NEXT:       "IPC": 3.883495145631068,
+# CHECK-NEXT:       "Instructions": 400,
+# CHECK-NEXT:       "Iterations": 100,
+# CHECK-NEXT:       "TotalCycles": 103,
+# CHECK-NEXT:       "TotaluOps": 400,
+# CHECK-NEXT:       "uOpsPerCycle": 3.883495145631068
+# CHECK-NEXT:     },
+# CHECK-NEXT:     "TimelineView": {
+# CHECK-NEXT:       "TimelineInfo": [
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "CycleDispatched": 0,
+# CHECK-NEXT:           "CycleExecuted": 2,
+# CHECK-NEXT:           "CycleIssued": 1,
+# CHECK-NEXT:           "CycleReady": 0,
+# CHECK-NEXT:           "CycleRetired": 3
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "CycleDispatched": 0,
+# CHECK-NEXT:           "CycleExecuted": 2,
+# CHECK-NEXT:           "CycleIssued": 1,
+# CHECK-NEXT:           "CycleReady": 0,
+# CHECK-NEXT:           "CycleRetired": 3
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "CycleDispatched": 0,
+# CHECK-NEXT:           "CycleExecuted": 2,
+# CHECK-NEXT:           "CycleIssued": 1,
+# CHECK-NEXT:           "CycleReady": 0,
+# CHECK-NEXT:           "CycleRetired": 3
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "CycleDispatched": 0,
+# CHECK-NEXT:           "CycleExecuted": 2,
+# CHECK-NEXT:           "CycleIssued": 1,
+# CHECK-NEXT:           "CycleReady": 0,
+# CHECK-NEXT:           "CycleRetired": 3
+# CHECK-NEXT:         }
+# CHECK-NEXT:       ]
+# CHECK-NEXT:     }
+# CHECK-NEXT:   }
+# CHECK-NEXT: }

diff  --git a/llvm/test/tools/llvm-mca/JSON/X86/views.s b/llvm/test/tools/llvm-mca/JSON/X86/views.s
index ed5d9c2da0cf5..ff82e342e354f 100644
--- a/llvm/test/tools/llvm-mca/JSON/X86/views.s
+++ b/llvm/test/tools/llvm-mca/JSON/X86/views.s
@@ -14,162 +14,162 @@ add %ecx, %ecx
 add %edx, %edx
 
 # CHECK:      {
-# CHECK-NEXT:   "DispatchStatistics": {
-# CHECK-NEXT:     "GROUP": 0,
-# CHECK-NEXT:     "LQ": 0,
-# CHECK-NEXT:     "RAT": 0,
-# CHECK-NEXT:     "RCU": 0,
-# CHECK-NEXT:     "SCHEDQ": 0,
-# CHECK-NEXT:     "SQ": 0,
-# CHECK-NEXT:     "USH": 0
-# CHECK-NEXT:   },
-# CHECK-NEXT:   "InstructionInfoView": {
-# CHECK-NEXT:     "InstructionList": [
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "Instruction": 0,
-# CHECK-NEXT:         "Latency": 1,
-# CHECK-NEXT:         "NumMicroOpcodes": 1,
-# CHECK-NEXT:         "RThroughput": 0.25,
-# CHECK-NEXT:         "hasUnmodeledSideEffects": false,
-# CHECK-NEXT:         "mayLoad": false,
-# CHECK-NEXT:         "mayStore": false
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "Instruction": 1,
-# CHECK-NEXT:         "Latency": 1,
-# CHECK-NEXT:         "NumMicroOpcodes": 1,
-# CHECK-NEXT:         "RThroughput": 0.25,
-# CHECK-NEXT:         "hasUnmodeledSideEffects": false,
-# CHECK-NEXT:         "mayLoad": false,
-# CHECK-NEXT:         "mayStore": false
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "Instruction": 2,
-# CHECK-NEXT:         "Latency": 1,
-# CHECK-NEXT:         "NumMicroOpcodes": 1,
-# CHECK-NEXT:         "RThroughput": 0.25,
-# CHECK-NEXT:         "hasUnmodeledSideEffects": false,
-# CHECK-NEXT:         "mayLoad": false,
-# CHECK-NEXT:         "mayStore": false
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "Instruction": 3,
-# CHECK-NEXT:         "Latency": 1,
-# CHECK-NEXT:         "NumMicroOpcodes": 1,
-# CHECK-NEXT:         "RThroughput": 0.25,
-# CHECK-NEXT:         "hasUnmodeledSideEffects": false,
-# CHECK-NEXT:         "mayLoad": false,
-# CHECK-NEXT:         "mayStore": false
-# CHECK-NEXT:       }
+# CHECK-NEXT:   "Resources": {
+# CHECK-NEXT:     "CPUName": "haswell",
+# CHECK-NEXT:     "Resources": [
+# CHECK-NEXT:       "HWDivider",
+# CHECK-NEXT:       "HWFPDivider",
+# CHECK-NEXT:       "HWPort0",
+# CHECK-NEXT:       "HWPort1",
+# CHECK-NEXT:       "HWPort2",
+# CHECK-NEXT:       "HWPort3",
+# CHECK-NEXT:       "HWPort4",
+# CHECK-NEXT:       "HWPort5",
+# CHECK-NEXT:       "HWPort6",
+# CHECK-NEXT:       "HWPort7"
 # CHECK-NEXT:     ]
 # CHECK-NEXT:   },
-# CHECK-NEXT:   "Instructions and CPU resources": {
+# CHECK-NEXT:   "main": {
+# CHECK-NEXT:     "DispatchStatistics": {
+# CHECK-NEXT:       "GROUP": 0,
+# CHECK-NEXT:       "LQ": 0,
+# CHECK-NEXT:       "RAT": 0,
+# CHECK-NEXT:       "RCU": 0,
+# CHECK-NEXT:       "SCHEDQ": 0,
+# CHECK-NEXT:       "SQ": 0,
+# CHECK-NEXT:       "USH": 0
+# CHECK-NEXT:     },
+# CHECK-NEXT:     "InstructionInfoView": {
+# CHECK-NEXT:       "InstructionList": [
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "Instruction": 0,
+# CHECK-NEXT:           "Latency": 1,
+# CHECK-NEXT:           "NumMicroOpcodes": 1,
+# CHECK-NEXT:           "RThroughput": 0.25,
+# CHECK-NEXT:           "hasUnmodeledSideEffects": false,
+# CHECK-NEXT:           "mayLoad": false,
+# CHECK-NEXT:           "mayStore": false
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "Instruction": 1,
+# CHECK-NEXT:           "Latency": 1,
+# CHECK-NEXT:           "NumMicroOpcodes": 1,
+# CHECK-NEXT:           "RThroughput": 0.25,
+# CHECK-NEXT:           "hasUnmodeledSideEffects": false,
+# CHECK-NEXT:           "mayLoad": false,
+# CHECK-NEXT:           "mayStore": false
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "Instruction": 2,
+# CHECK-NEXT:           "Latency": 1,
+# CHECK-NEXT:           "NumMicroOpcodes": 1,
+# CHECK-NEXT:           "RThroughput": 0.25,
+# CHECK-NEXT:           "hasUnmodeledSideEffects": false,
+# CHECK-NEXT:           "mayLoad": false,
+# CHECK-NEXT:           "mayStore": false
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "Instruction": 3,
+# CHECK-NEXT:           "Latency": 1,
+# CHECK-NEXT:           "NumMicroOpcodes": 1,
+# CHECK-NEXT:           "RThroughput": 0.25,
+# CHECK-NEXT:           "hasUnmodeledSideEffects": false,
+# CHECK-NEXT:           "mayLoad": false,
+# CHECK-NEXT:           "mayStore": false
+# CHECK-NEXT:         }
+# CHECK-NEXT:       ]
+# CHECK-NEXT:     },
 # CHECK-NEXT:     "Instructions": [
 # CHECK-NEXT:       "addl\t%eax, %eax",
 # CHECK-NEXT:       "addl\t%ebx, %ebx",
 # CHECK-NEXT:       "addl\t%ecx, %ecx",
 # CHECK-NEXT:       "addl\t%edx, %edx"
 # CHECK-NEXT:     ],
-# CHECK-NEXT:     "Resources": {
-# CHECK-NEXT:       "CPUName": "haswell",
-# CHECK-NEXT:       "Resources": [
-# CHECK-NEXT:         "HWDivider",
-# CHECK-NEXT:         "HWFPDivider",
-# CHECK-NEXT:         "HWPort0",
-# CHECK-NEXT:         "HWPort1",
-# CHECK-NEXT:         "HWPort2",
-# CHECK-NEXT:         "HWPort3",
-# CHECK-NEXT:         "HWPort4",
-# CHECK-NEXT:         "HWPort5",
-# CHECK-NEXT:         "HWPort6",
-# CHECK-NEXT:         "HWPort7"
+# CHECK-NEXT:     "ResourcePressureView": {
+# CHECK-NEXT:       "ResourcePressureInfo": [
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 0,
+# CHECK-NEXT:           "ResourceIndex": 8,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 1,
+# CHECK-NEXT:           "ResourceIndex": 7,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 2,
+# CHECK-NEXT:           "ResourceIndex": 3,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 3,
+# CHECK-NEXT:           "ResourceIndex": 2,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 4,
+# CHECK-NEXT:           "ResourceIndex": 2,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 4,
+# CHECK-NEXT:           "ResourceIndex": 3,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 4,
+# CHECK-NEXT:           "ResourceIndex": 7,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "InstructionIndex": 4,
+# CHECK-NEXT:           "ResourceIndex": 8,
+# CHECK-NEXT:           "ResourceUsage": 1
+# CHECK-NEXT:         }
+# CHECK-NEXT:       ]
+# CHECK-NEXT:     },
+# CHECK-NEXT:     "SummaryView": {
+# CHECK-NEXT:       "BlockRThroughput": 1,
+# CHECK-NEXT:       "DispatchWidth": 4,
+# CHECK-NEXT:       "IPC": 3.883495145631068,
+# CHECK-NEXT:       "Instructions": 400,
+# CHECK-NEXT:       "Iterations": 100,
+# CHECK-NEXT:       "TotalCycles": 103,
+# CHECK-NEXT:       "TotaluOps": 400,
+# CHECK-NEXT:       "uOpsPerCycle": 3.883495145631068
+# CHECK-NEXT:     },
+# CHECK-NEXT:     "TimelineView": {
+# CHECK-NEXT:       "TimelineInfo": [
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "CycleDispatched": 0,
+# CHECK-NEXT:           "CycleExecuted": 2,
+# CHECK-NEXT:           "CycleIssued": 1,
+# CHECK-NEXT:           "CycleReady": 0,
+# CHECK-NEXT:           "CycleRetired": 3
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "CycleDispatched": 0,
+# CHECK-NEXT:           "CycleExecuted": 2,
+# CHECK-NEXT:           "CycleIssued": 1,
+# CHECK-NEXT:           "CycleReady": 0,
+# CHECK-NEXT:           "CycleRetired": 3
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "CycleDispatched": 0,
+# CHECK-NEXT:           "CycleExecuted": 2,
+# CHECK-NEXT:           "CycleIssued": 1,
+# CHECK-NEXT:           "CycleReady": 0,
+# CHECK-NEXT:           "CycleRetired": 3
+# CHECK-NEXT:         },
+# CHECK-NEXT:         {
+# CHECK-NEXT:           "CycleDispatched": 0,
+# CHECK-NEXT:           "CycleExecuted": 2,
+# CHECK-NEXT:           "CycleIssued": 1,
+# CHECK-NEXT:           "CycleReady": 0,
+# CHECK-NEXT:           "CycleRetired": 3
+# CHECK-NEXT:         }
 # CHECK-NEXT:       ]
 # CHECK-NEXT:     }
-# CHECK-NEXT:   },
-# CHECK-NEXT:   "ResourcePressureView": {
-# CHECK-NEXT:     "ResourcePressureInfo": [
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "InstructionIndex": 0,
-# CHECK-NEXT:         "ResourceIndex": 8,
-# CHECK-NEXT:         "ResourceUsage": 1
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "InstructionIndex": 1,
-# CHECK-NEXT:         "ResourceIndex": 7,
-# CHECK-NEXT:         "ResourceUsage": 1
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "InstructionIndex": 2,
-# CHECK-NEXT:         "ResourceIndex": 3,
-# CHECK-NEXT:         "ResourceUsage": 1
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "InstructionIndex": 3,
-# CHECK-NEXT:         "ResourceIndex": 2,
-# CHECK-NEXT:         "ResourceUsage": 1
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "InstructionIndex": 4,
-# CHECK-NEXT:         "ResourceIndex": 2,
-# CHECK-NEXT:         "ResourceUsage": 1
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "InstructionIndex": 4,
-# CHECK-NEXT:         "ResourceIndex": 3,
-# CHECK-NEXT:         "ResourceUsage": 1
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "InstructionIndex": 4,
-# CHECK-NEXT:         "ResourceIndex": 7,
-# CHECK-NEXT:         "ResourceUsage": 1
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "InstructionIndex": 4,
-# CHECK-NEXT:         "ResourceIndex": 8,
-# CHECK-NEXT:         "ResourceUsage": 1
-# CHECK-NEXT:       }
-# CHECK-NEXT:     ]
-# CHECK-NEXT:   },
-# CHECK-NEXT:   "SummaryView": {
-# CHECK-NEXT:     "BlockRThroughput": 1,
-# CHECK-NEXT:     "DispatchWidth": 4,
-# CHECK-NEXT:     "IPC": 3.883495145631068,
-# CHECK-NEXT:     "Instructions": 400,
-# CHECK-NEXT:     "Iterations": 100,
-# CHECK-NEXT:     "TotalCycles": 103,
-# CHECK-NEXT:     "TotaluOps": 400,
-# CHECK-NEXT:     "uOpsPerCycle": 3.883495145631068
-# CHECK-NEXT:   },
-# CHECK-NEXT:   "TimelineView": {
-# CHECK-NEXT:     "TimelineInfo": [
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "CycleDispatched": 0,
-# CHECK-NEXT:         "CycleExecuted": 2,
-# CHECK-NEXT:         "CycleIssued": 1,
-# CHECK-NEXT:         "CycleReady": 0,
-# CHECK-NEXT:         "CycleRetired": 3
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "CycleDispatched": 0,
-# CHECK-NEXT:         "CycleExecuted": 2,
-# CHECK-NEXT:         "CycleIssued": 1,
-# CHECK-NEXT:         "CycleReady": 0,
-# CHECK-NEXT:         "CycleRetired": 3
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "CycleDispatched": 0,
-# CHECK-NEXT:         "CycleExecuted": 2,
-# CHECK-NEXT:         "CycleIssued": 1,
-# CHECK-NEXT:         "CycleReady": 0,
-# CHECK-NEXT:         "CycleRetired": 3
-# CHECK-NEXT:       },
-# CHECK-NEXT:       {
-# CHECK-NEXT:         "CycleDispatched": 0,
-# CHECK-NEXT:         "CycleExecuted": 2,
-# CHECK-NEXT:         "CycleIssued": 1,
-# CHECK-NEXT:         "CycleReady": 0,
-# CHECK-NEXT:         "CycleRetired": 3
-# CHECK-NEXT:       }
-# CHECK-NEXT:     ]
 # CHECK-NEXT:   }
 # CHECK-NEXT: }

diff  --git a/llvm/tools/llvm-mca/PipelinePrinter.cpp b/llvm/tools/llvm-mca/PipelinePrinter.cpp
index 8ca689fefc51d..0bae7f1f7a6da 100644
--- a/llvm/tools/llvm-mca/PipelinePrinter.cpp
+++ b/llvm/tools/llvm-mca/PipelinePrinter.cpp
@@ -17,19 +17,21 @@
 namespace llvm {
 namespace mca {
 
-void PipelinePrinter::printReport(llvm::raw_ostream &OS) const {
+json::Object PipelinePrinter::getJSONReportRegion() const {
   json::Object JO;
   for (const auto &V : Views) {
-    if ((OutputKind == View::OK_JSON)) {
-      if (V->isSerializable()) {
-        JO.try_emplace(V->getNameAsString().str(), V->toJSON());
-      }
-    } else {
-      V->printView(OS);
+    if (V->isSerializable()) {
+      JO.try_emplace(V->getNameAsString().str(), V->toJSON());
     }
   }
-  if (OutputKind == View::OK_JSON)
-    OS << formatv("{0:2}", json::Value(std::move(JO))) << "\n";
+  return JO;
+}
+
+void PipelinePrinter::printReport(llvm::raw_ostream &OS) const {
+  json::Object JO;
+  for (const auto &V : Views) {
+    V->printView(OS);
+  }
 }
 } // namespace mca.
 } // namespace llvm

diff  --git a/llvm/tools/llvm-mca/PipelinePrinter.h b/llvm/tools/llvm-mca/PipelinePrinter.h
index ae18140d32b77..23d55133c0cc7 100644
--- a/llvm/tools/llvm-mca/PipelinePrinter.h
+++ b/llvm/tools/llvm-mca/PipelinePrinter.h
@@ -48,6 +48,7 @@ class PipelinePrinter {
   }
 
   void printReport(llvm::raw_ostream &OS) const;
+  json::Object getJSONReportRegion() const;
 };
 } // namespace mca
 } // namespace llvm

diff  --git a/llvm/tools/llvm-mca/Views/InstructionView.cpp b/llvm/tools/llvm-mca/Views/InstructionView.cpp
index 7f7a5b7cdbbbd..176cdba734bcd 100644
--- a/llvm/tools/llvm-mca/Views/InstructionView.cpp
+++ b/llvm/tools/llvm-mca/Views/InstructionView.cpp
@@ -28,14 +28,15 @@ StringRef InstructionView::printInstructionString(const llvm::MCInst &MCI) const
 }
 
 json::Value InstructionView::toJSON() const {
-  json::Object JO;
   json::Array SourceInfo;
   for (const auto &MCI : getSource()) {
     StringRef Instruction = printInstructionString(MCI);
     SourceInfo.push_back(Instruction.str());
   }
-  JO.try_emplace("Instructions", std::move(SourceInfo));
+  return SourceInfo;
+}
 
+json::Object InstructionView::getJSONResources() const {
   json::Array Resources;
   const MCSchedModel &SM = STI.getSchedModel();
   for (unsigned I = 1, E = SM.getNumProcResourceKinds(); I < E; ++I) {
@@ -52,9 +53,7 @@ json::Value InstructionView::toJSON() const {
       Resources.push_back(ResNameStream.str());
     }
   }
-  JO.try_emplace("Resources", json::Object({{"CPUName", MCPU}, {"Resources", std::move(Resources)}}));
-
-  return JO;
+  return json::Object({{"CPUName", MCPU}, {"Resources", std::move(Resources)}});
 }
 } // namespace mca
 } // namespace llvm

diff  --git a/llvm/tools/llvm-mca/Views/InstructionView.h b/llvm/tools/llvm-mca/Views/InstructionView.h
index 2a260b97d8fb0..6f092368d6d01 100644
--- a/llvm/tools/llvm-mca/Views/InstructionView.h
+++ b/llvm/tools/llvm-mca/Views/InstructionView.h
@@ -45,7 +45,7 @@ class InstructionView : public View {
   virtual ~InstructionView() = default;
 
   StringRef getNameAsString() const override {
-    return "Instructions and CPU resources";
+    return "Instructions";
   }
   // Return a reference to a string representing a given machine instruction.
   // The result should be used or copied before the next call to
@@ -56,6 +56,7 @@ class InstructionView : public View {
   llvm::MCInstPrinter &getInstPrinter() const { return MCIP; }
   llvm::ArrayRef<llvm::MCInst> getSource() const { return Source; }
   json::Value toJSON() const override;
+  json::Object getJSONResources() const;
   virtual void printViewJSON(llvm::raw_ostream &OS) override {
     json::Value JV = toJSON();
     OS << formatv("{0:2}", JV) << "\n";

diff  --git a/llvm/tools/llvm-mca/llvm-mca.cpp b/llvm/tools/llvm-mca/llvm-mca.cpp
index d35ba0db10de8..2dae2eb50b614 100644
--- a/llvm/tools/llvm-mca/llvm-mca.cpp
+++ b/llvm/tools/llvm-mca/llvm-mca.cpp
@@ -523,6 +523,7 @@ int main(int argc, char **argv) {
       *STI, *MRI, mc::InitMCTargetOptionsFromFlags()));
   assert(MAB && "Unable to create asm backend!");
 
+  json::Object JSONOutput;
   for (const std::unique_ptr<mca::CodeRegion> &Region : Regions) {
     // Skip empty code regions.
     if (Region->empty())
@@ -530,7 +531,8 @@ int main(int argc, char **argv) {
 
     // Don't print the header of this region if it is the default region, and
     // it doesn't have an end location.
-    if (Region->startLoc().isValid() || Region->endLoc().isValid()) {
+    if (!PrintJson &&
+        (Region->startLoc().isValid() || Region->endLoc().isValid())) {
       TOF->os() << "\n[" << RegionIdx++ << "] Code Region";
       StringRef Desc = Region->getDescription();
       if (!Desc.empty())
@@ -590,7 +592,14 @@ int main(int argc, char **argv) {
       if (!runPipeline(*P))
         return 1;
 
-      Printer.printReport(TOF->os());
+      if (PrintJson) {
+        JSONOutput.try_emplace(!Region->getDescription().empty()
+                                   ? Region->getDescription().str()
+                                   : "main",
+                               Printer.getJSONReportRegion());
+      } else {
+        Printer.printReport(TOF->os());
+      }
       continue;
     }
 
@@ -610,9 +619,13 @@ int main(int argc, char **argv) {
 
     // When we output JSON, we add a view that contains the instructions
     // and CPU resource information.
-    if (PrintJson)
-      Printer.addView(
-          std::make_unique<mca::InstructionView>(*STI, *IP, Insts, MCPU));
+    if (PrintJson) {
+      auto IV = std::make_unique<mca::InstructionView>(*STI, *IP, Insts, MCPU);
+      if (JSONOutput.find("Resources") == JSONOutput.end()) {
+        JSONOutput.try_emplace("Resources", IV->getJSONResources());
+      }
+      Printer.addView(std::move(IV));
+    }
 
     if (PrintSummaryView)
       Printer.addView(
@@ -659,12 +672,22 @@ int main(int argc, char **argv) {
     if (!runPipeline(*P))
       return 1;
 
-    Printer.printReport(TOF->os());
+    if (PrintJson) {
+      JSONOutput.try_emplace(!Region->getDescription().empty()
+                                 ? Region->getDescription().str()
+                                 : "main",
+                             Printer.getJSONReportRegion());
+    } else {
+      Printer.printReport(TOF->os());
+    }
 
     // Clear the InstrBuilder internal state in preparation for another round.
     IB.clear();
   }
 
+  if (PrintJson)
+    TOF->os() << formatv("{0:2}", json::Value(std::move(JSONOutput))) << "\n";
+
   TOF->keep();
   return 0;
 }


        


More information about the llvm-commits mailing list