diff options
author | Phil Camp <phil.camp@sony.com> | 2024-08-19 17:16:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-19 17:16:19 +0100 |
commit | 42386dc46d8217b2dfed8dfc41afeec366ec2015 (patch) | |
tree | 02555523106285ef944ae0aeb70ae7e1a1e5f191 /llvm/tools/llvm-mca | |
parent | 0ee0857363aadf9ce0f403e7e0da10f0a9d94887 (diff) | |
download | llvm-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.cpp | 46 | ||||
-rw-r--r-- | llvm/tools/llvm-mca/Views/BottleneckAnalysis.h | 3 |
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); } |