aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-mca
diff options
context:
space:
mode:
authorPhil Camp <phil.camp@sony.com>2024-08-19 17:16:19 +0100
committerGitHub <noreply@github.com>2024-08-19 17:16:19 +0100
commit42386dc46d8217b2dfed8dfc41afeec366ec2015 (patch)
tree02555523106285ef944ae0aeb70ae7e1a1e5f191 /llvm/tools/llvm-mca
parent0ee0857363aadf9ce0f403e7e0da10f0a9d94887 (diff)
downloadllvm-42386dc46d8217b2dfed8dfc41afeec366ec2015.zip
llvm-42386dc46d8217b2dfed8dfc41afeec366ec2015.tar.gz
llvm-42386dc46d8217b2dfed8dfc41afeec366ec2015.tar.bz2
[llvm-mca] Add bottle-neck analysis to JSON output. (#90056)
This patch implements the bottle-neck analysis data in the JSON dump mode.
Diffstat (limited to 'llvm/tools/llvm-mca')
-rw-r--r--llvm/tools/llvm-mca/Views/BottleneckAnalysis.cpp46
-rw-r--r--llvm/tools/llvm-mca/Views/BottleneckAnalysis.h3
2 files changed, 48 insertions, 1 deletions
diff --git a/llvm/tools/llvm-mca/Views/BottleneckAnalysis.cpp b/llvm/tools/llvm-mca/Views/BottleneckAnalysis.cpp
index 409a701..ece5b67 100644
--- a/llvm/tools/llvm-mca/Views/BottleneckAnalysis.cpp
+++ b/llvm/tools/llvm-mca/Views/BottleneckAnalysis.cpp
@@ -641,5 +641,51 @@ void BottleneckAnalysis::printView(raw_ostream &OS) const {
printCriticalSequence(OS);
}
+json::Value BottleneckAnalysis::toJSON() const {
+ if (!SeenStallCycles || !BPI.PressureIncreaseCycles) {
+ json::Object JO({{"PressureIncreaseCycles", 0}});
+ return JO;
+ }
+
+ json::Array CriticalSequence;
+ // get critical sequence
+ SmallVector<const DependencyEdge *, 16> Seq;
+ DG.getCriticalSequence(Seq);
+ if (!Seq.empty()) {
+ for (const DependencyEdge *&DE : Seq) {
+ json::Object DEJO({{"FromID", DE->FromIID},
+ {"ToID", DE->ToIID},
+ {"Type", static_cast<unsigned>(DE->Dep.Type)},
+ {"ResourceOrRegID", DE->Dep.ResourceOrRegID}});
+ CriticalSequence.push_back(std::move(DEJO));
+ }
+ }
+
+ json::Array ResourcePressure;
+ if (BPI.PressureIncreaseCycles) {
+ ArrayRef<unsigned> Distribution = Tracker.getResourcePressureDistribution();
+ const MCSchedModel &SM = getSubTargetInfo().getSchedModel();
+ for (unsigned I = 0, E = Distribution.size(); I < E; ++I) {
+ unsigned ReleaseAtCycles = Distribution[I];
+ if (ReleaseAtCycles) {
+ const MCProcResourceDesc &PRDesc = *SM.getProcResource(I);
+ json::Object RPJO({{PRDesc.Name, ReleaseAtCycles}});
+ ResourcePressure.push_back(std::move(RPJO));
+ }
+ }
+ }
+
+ json::Object JO({{"PressureIncreaseCycles", BPI.PressureIncreaseCycles},
+ {"ResourcePressureCycles", BPI.ResourcePressureCycles},
+ {"DataDependencyCycles", BPI.DataDependencyCycles},
+ {"RegisterDependencyCycles", BPI.RegisterDependencyCycles},
+ {"MemoryDependencyCycles", BPI.MemoryDependencyCycles},
+ {"TotalCycles", TotalCycles},
+ {"DependencyEdge", std::move(CriticalSequence)},
+ {"ResourcePressure", std::move(ResourcePressure)}});
+
+ return JO;
+}
+
} // namespace mca.
} // namespace llvm
diff --git a/llvm/tools/llvm-mca/Views/BottleneckAnalysis.h b/llvm/tools/llvm-mca/Views/BottleneckAnalysis.h
index e709b25..529090c 100644
--- a/llvm/tools/llvm-mca/Views/BottleneckAnalysis.h
+++ b/llvm/tools/llvm-mca/Views/BottleneckAnalysis.h
@@ -335,7 +335,8 @@ public:
void printView(raw_ostream &OS) const override;
StringRef getNameAsString() const override { return "BottleneckAnalysis"; }
- bool isSerializable() const override { return false; }
+ bool isSerializable() const override { return true; }
+ json::Value toJSON() const override;
#ifndef NDEBUG
void dump(raw_ostream &OS, MCInstPrinter &MCIP) const { DG.dump(OS, MCIP); }