diff options
Diffstat (limited to 'contrib/llvm-project/llvm/tools/llvm-mca/PipelinePrinter.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/tools/llvm-mca/PipelinePrinter.cpp | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/tools/llvm-mca/PipelinePrinter.cpp b/contrib/llvm-project/llvm/tools/llvm-mca/PipelinePrinter.cpp new file mode 100644 index 000000000000..9d06c6a19395 --- /dev/null +++ b/contrib/llvm-project/llvm/tools/llvm-mca/PipelinePrinter.cpp @@ -0,0 +1,129 @@ +//===--------------------- PipelinePrinter.cpp ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// \file +/// +/// This file implements the PipelinePrinter interface. +/// +//===----------------------------------------------------------------------===// + +#include "PipelinePrinter.h" +#include "CodeRegion.h" +#include "Views/InstructionView.h" + +namespace llvm { +namespace mca { + +void PipelinePrinter::printRegionHeader(llvm::raw_ostream &OS) const { + StringRef RegionName; + if (!Region.getDescription().empty()) + RegionName = Region.getDescription(); + + OS << "\n[" << RegionIdx << "] Code Region"; + if (!RegionName.empty()) + OS << " - " << RegionName; + OS << "\n\n"; +} + +json::Object PipelinePrinter::getJSONReportRegion() const { + json::Object JO; + + StringRef RegionName = ""; + if (!Region.getDescription().empty()) + RegionName = Region.getDescription(); + + JO.try_emplace("Name", RegionName); + for (const auto &V : Views) + if (V->isSerializable()) + JO.try_emplace(V->getNameAsString().str(), V->toJSON()); + + return JO; +} + +json::Object PipelinePrinter::getJSONSimulationParameters() const { + json::Object SimParameters({{"-mcpu", STI.getCPU()}, + {"-mtriple", STI.getTargetTriple().getTriple()}, + {"-march", STI.getTargetTriple().getArchName()}}); + + const MCSchedModel &SM = STI.getSchedModel(); + if (!SM.isOutOfOrder()) + return SimParameters; + + if (PO.RegisterFileSize) + SimParameters.try_emplace("-register-file-size", PO.RegisterFileSize); + + if (!PO.AssumeNoAlias) + SimParameters.try_emplace("-noalias", PO.AssumeNoAlias); + + if (PO.DecodersThroughput) + SimParameters.try_emplace("-decoder-throughput", PO.DecodersThroughput); + + if (PO.MicroOpQueueSize) + SimParameters.try_emplace("-micro-op-queue-size", PO.MicroOpQueueSize); + + if (PO.DispatchWidth) + SimParameters.try_emplace("-dispatch", PO.DispatchWidth); + + if (PO.LoadQueueSize) + SimParameters.try_emplace("-lqueue", PO.LoadQueueSize); + + if (PO.StoreQueueSize) + SimParameters.try_emplace("-squeue", PO.StoreQueueSize); + + return SimParameters; +} + +json::Object PipelinePrinter::getJSONTargetInfo() const { + json::Array Resources; + const MCSchedModel &SM = STI.getSchedModel(); + StringRef MCPU = STI.getCPU(); + + for (unsigned I = 1, E = SM.getNumProcResourceKinds(); I < E; ++I) { + const MCProcResourceDesc &ProcResource = *SM.getProcResource(I); + unsigned NumUnits = ProcResource.NumUnits; + if (ProcResource.SubUnitsIdxBegin || !NumUnits) + continue; + + for (unsigned J = 0; J < NumUnits; ++J) { + std::string ResourceName = ProcResource.Name; + if (NumUnits > 1) { + ResourceName += "."; + ResourceName += J; + } + + Resources.push_back(ResourceName); + } + } + + return json::Object({{"CPUName", MCPU}, {"Resources", std::move(Resources)}}); +} + +void PipelinePrinter::printReport(json::Object &JO) const { + if (!RegionIdx) { + JO.try_emplace("TargetInfo", getJSONTargetInfo()); + JO.try_emplace("SimulationParameters", getJSONSimulationParameters()); + // Construct an array of regions. + JO.try_emplace("CodeRegions", json::Array()); + } + + json::Array *Regions = JO.getArray("CodeRegions"); + assert(Regions && "This array must exist!"); + Regions->push_back(getJSONReportRegion()); +} + +void PipelinePrinter::printReport(llvm::raw_ostream &OS) const { + // Don't print the header of this region if it is the default region, and if + // it doesn't have an end location. + if (Region.startLoc().isValid() || Region.endLoc().isValid()) + printRegionHeader(OS); + + for (const auto &V : Views) + V->printView(OS); +} + +} // namespace mca +} // namespace llvm |
