xref: /llvm-project/llvm/tools/llvm-mca/PipelinePrinter.cpp (revision fe01014faa336d25543561fc65201dea7f424347)
1dea343d2SMatt Davis //===--------------------- PipelinePrinter.cpp ------------------*- C++ -*-===//
2dea343d2SMatt Davis //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6dea343d2SMatt Davis //
7dea343d2SMatt Davis //===----------------------------------------------------------------------===//
8dea343d2SMatt Davis /// \file
9dea343d2SMatt Davis ///
10dea343d2SMatt Davis /// This file implements the PipelinePrinter interface.
11dea343d2SMatt Davis ///
12dea343d2SMatt Davis //===----------------------------------------------------------------------===//
13dea343d2SMatt Davis 
14dea343d2SMatt Davis #include "PipelinePrinter.h"
1510cb0362SAndrea Di Biagio #include "CodeRegion.h"
1610cb0362SAndrea Di Biagio #include "Views/InstructionView.h"
17dea343d2SMatt Davis 
185a8fd657SFangrui Song namespace llvm {
19dea343d2SMatt Davis namespace mca {
20dea343d2SMatt Davis 
printRegionHeader(llvm::raw_ostream & OS) const2110cb0362SAndrea Di Biagio void PipelinePrinter::printRegionHeader(llvm::raw_ostream &OS) const {
2210cb0362SAndrea Di Biagio   StringRef RegionName;
2310cb0362SAndrea Di Biagio   if (!Region.getDescription().empty())
2410cb0362SAndrea Di Biagio     RegionName = Region.getDescription();
2510cb0362SAndrea Di Biagio 
2610cb0362SAndrea Di Biagio   OS << "\n[" << RegionIdx << "] Code Region";
2710cb0362SAndrea Di Biagio   if (!RegionName.empty())
2810cb0362SAndrea Di Biagio     OS << " - " << RegionName;
2910cb0362SAndrea Di Biagio   OS << "\n\n";
3010cb0362SAndrea Di Biagio }
3110cb0362SAndrea Di Biagio 
getJSONReportRegion() const32b11d31ebSMarcos Horro json::Object PipelinePrinter::getJSONReportRegion() const {
33aa13e4feSMarcos Horro   json::Object JO;
3410cb0362SAndrea Di Biagio 
354fe0fcd1SAndrea Di Biagio   StringRef RegionName = "";
364fe0fcd1SAndrea Di Biagio   if (!Region.getDescription().empty())
374fe0fcd1SAndrea Di Biagio     RegionName = Region.getDescription();
384fe0fcd1SAndrea Di Biagio 
394fe0fcd1SAndrea Di Biagio   JO.try_emplace("Name", RegionName);
4010cb0362SAndrea Di Biagio   for (const auto &V : Views)
4110cb0362SAndrea Di Biagio     if (V->isSerializable())
42aa13e4feSMarcos Horro       JO.try_emplace(V->getNameAsString().str(), V->toJSON());
4310cb0362SAndrea Di Biagio 
44b11d31ebSMarcos Horro   return JO;
45b11d31ebSMarcos Horro }
46b11d31ebSMarcos Horro 
getJSONSimulationParameters() const47*77f2f0f9SMarcos Horro json::Object PipelinePrinter::getJSONSimulationParameters() const {
48*77f2f0f9SMarcos Horro   json::Object SimParameters({{"-mcpu", STI.getCPU()},
49*77f2f0f9SMarcos Horro                               {"-mtriple", STI.getTargetTriple().getTriple()},
50*77f2f0f9SMarcos Horro                               {"-march", STI.getTargetTriple().getArchName()}});
51*77f2f0f9SMarcos Horro 
52*77f2f0f9SMarcos Horro   const MCSchedModel &SM = STI.getSchedModel();
53*77f2f0f9SMarcos Horro   if (!SM.isOutOfOrder())
54*77f2f0f9SMarcos Horro     return SimParameters;
55*77f2f0f9SMarcos Horro 
56*77f2f0f9SMarcos Horro   if (PO.RegisterFileSize)
57*77f2f0f9SMarcos Horro     SimParameters.try_emplace("-register-file-size", PO.RegisterFileSize);
58*77f2f0f9SMarcos Horro 
59*77f2f0f9SMarcos Horro   if (!PO.AssumeNoAlias)
60*77f2f0f9SMarcos Horro     SimParameters.try_emplace("-noalias", PO.AssumeNoAlias);
61*77f2f0f9SMarcos Horro 
62*77f2f0f9SMarcos Horro   if (PO.DecodersThroughput)
63*77f2f0f9SMarcos Horro     SimParameters.try_emplace("-decoder-throughput", PO.DecodersThroughput);
64*77f2f0f9SMarcos Horro 
65*77f2f0f9SMarcos Horro   if (PO.MicroOpQueueSize)
66*77f2f0f9SMarcos Horro     SimParameters.try_emplace("-micro-op-queue-size", PO.MicroOpQueueSize);
67*77f2f0f9SMarcos Horro 
68*77f2f0f9SMarcos Horro   if (PO.DispatchWidth)
69*77f2f0f9SMarcos Horro     SimParameters.try_emplace("-dispatch", PO.DispatchWidth);
70*77f2f0f9SMarcos Horro 
71*77f2f0f9SMarcos Horro   if (PO.LoadQueueSize)
72*77f2f0f9SMarcos Horro     SimParameters.try_emplace("-lqueue", PO.LoadQueueSize);
73*77f2f0f9SMarcos Horro 
74*77f2f0f9SMarcos Horro   if (PO.StoreQueueSize)
75*77f2f0f9SMarcos Horro     SimParameters.try_emplace("-squeue", PO.StoreQueueSize);
76*77f2f0f9SMarcos Horro 
77*77f2f0f9SMarcos Horro   return SimParameters;
78*77f2f0f9SMarcos Horro }
79*77f2f0f9SMarcos Horro 
getJSONTargetInfo() const80d919bca8SAndrea Di Biagio json::Object PipelinePrinter::getJSONTargetInfo() const {
81d919bca8SAndrea Di Biagio   json::Array Resources;
82d919bca8SAndrea Di Biagio   const MCSchedModel &SM = STI.getSchedModel();
83d919bca8SAndrea Di Biagio   StringRef MCPU = STI.getCPU();
84d919bca8SAndrea Di Biagio 
85d919bca8SAndrea Di Biagio   for (unsigned I = 1, E = SM.getNumProcResourceKinds(); I < E; ++I) {
86d919bca8SAndrea Di Biagio     const MCProcResourceDesc &ProcResource = *SM.getProcResource(I);
87d919bca8SAndrea Di Biagio     unsigned NumUnits = ProcResource.NumUnits;
88d919bca8SAndrea Di Biagio     if (ProcResource.SubUnitsIdxBegin || !NumUnits)
89d919bca8SAndrea Di Biagio       continue;
90d919bca8SAndrea Di Biagio 
91d919bca8SAndrea Di Biagio     for (unsigned J = 0; J < NumUnits; ++J) {
92d919bca8SAndrea Di Biagio       std::string ResourceName = ProcResource.Name;
93d919bca8SAndrea Di Biagio       if (NumUnits > 1) {
94d919bca8SAndrea Di Biagio         ResourceName += ".";
95d919bca8SAndrea Di Biagio         ResourceName += J;
96d919bca8SAndrea Di Biagio       }
97d919bca8SAndrea Di Biagio 
98d919bca8SAndrea Di Biagio       Resources.push_back(ResourceName);
99d919bca8SAndrea Di Biagio     }
100d919bca8SAndrea Di Biagio   }
101d919bca8SAndrea Di Biagio 
102d919bca8SAndrea Di Biagio   return json::Object({{"CPUName", MCPU}, {"Resources", std::move(Resources)}});
103d919bca8SAndrea Di Biagio }
104d919bca8SAndrea Di Biagio 
printReport(json::Object & JO) const10510cb0362SAndrea Di Biagio void PipelinePrinter::printReport(json::Object &JO) const {
1064fe0fcd1SAndrea Di Biagio   if (!RegionIdx) {
107*77f2f0f9SMarcos Horro     JO.try_emplace("TargetInfo", getJSONTargetInfo());
108*77f2f0f9SMarcos Horro     JO.try_emplace("SimulationParameters", getJSONSimulationParameters());
1094fe0fcd1SAndrea Di Biagio     // Construct an array of regions.
1104fe0fcd1SAndrea Di Biagio     JO.try_emplace("CodeRegions", json::Array());
1114fe0fcd1SAndrea Di Biagio   }
11210cb0362SAndrea Di Biagio 
1134fe0fcd1SAndrea Di Biagio   json::Array *Regions = JO.getArray("CodeRegions");
1144fe0fcd1SAndrea Di Biagio   assert(Regions && "This array must exist!");
1154fe0fcd1SAndrea Di Biagio   Regions->push_back(getJSONReportRegion());
11610cb0362SAndrea Di Biagio }
11710cb0362SAndrea Di Biagio 
printReport(llvm::raw_ostream & OS) const118b11d31ebSMarcos Horro void PipelinePrinter::printReport(llvm::raw_ostream &OS) const {
11910cb0362SAndrea Di Biagio   // Don't print the header of this region if it is the default region, and if
12010cb0362SAndrea Di Biagio   // it doesn't have an end location.
12110cb0362SAndrea Di Biagio   if (Region.startLoc().isValid() || Region.endLoc().isValid())
12210cb0362SAndrea Di Biagio     printRegionHeader(OS);
12310cb0362SAndrea Di Biagio 
12410cb0362SAndrea Di Biagio   for (const auto &V : Views)
125aa13e4feSMarcos Horro     V->printView(OS);
126aa13e4feSMarcos Horro }
12710cb0362SAndrea Di Biagio 
12810cb0362SAndrea Di Biagio } // namespace mca
1295a8fd657SFangrui Song } // namespace llvm
130