diff options
| author | Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> | 2018-03-08 16:08:43 +0000 | 
|---|---|---|
| committer | Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> | 2018-03-08 16:08:43 +0000 | 
| commit | 8af3fe81eb94e71c4921ac246feaa76c47ecbf39 (patch) | |
| tree | 7284415a8ba7bdbcfd4eb4c8c2584e9b74ca2fa4 /llvm/tools/llvm-mca/BackendPrinter.cpp | |
| parent | b312b1396069203bb1cfd64a5c4c903b05d3cd6a (diff) | |
| download | llvm-8af3fe81eb94e71c4921ac246feaa76c47ecbf39.zip llvm-8af3fe81eb94e71c4921ac246feaa76c47ecbf39.tar.gz llvm-8af3fe81eb94e71c4921ac246feaa76c47ecbf39.tar.bz2  | |
[llvm-mca] Unify the API for the various views. NFCI
This allows the customization of the performance report.
Users can specify their own custom sequence of views.
Each view contributes a portion of the performance report generated by the
BackendPrinter.
Internally, class BackendPrinter keeps a sequence of views; views are printed
out in sequence when method 'printReport()' is called. 
This patch addresses one of the two review comments from Clement in D43951.
llvm-svn: 327018
Diffstat (limited to 'llvm/tools/llvm-mca/BackendPrinter.cpp')
| -rw-r--r-- | llvm/tools/llvm-mca/BackendPrinter.cpp | 136 | 
1 files changed, 12 insertions, 124 deletions
diff --git a/llvm/tools/llvm-mca/BackendPrinter.cpp b/llvm/tools/llvm-mca/BackendPrinter.cpp index 521ef04..d98082a 100644 --- a/llvm/tools/llvm-mca/BackendPrinter.cpp +++ b/llvm/tools/llvm-mca/BackendPrinter.cpp @@ -13,25 +13,15 @@  //===----------------------------------------------------------------------===//  #include "BackendPrinter.h" +#include "View.h"  #include "llvm/CodeGen/TargetSchedule.h"  namespace mca {  using namespace llvm; -std::unique_ptr<ToolOutputFile> -BackendPrinter::getOutputStream(std::string OutputFile) { -  if (OutputFile == "") -    OutputFile = "-"; -  std::error_code EC; -  auto Out = llvm::make_unique<ToolOutputFile>(OutputFile, EC, sys::fs::F_None); -  if (!EC) -    return Out; -  errs() << EC.message() << '\n'; -  return nullptr; -} - -void BackendPrinter::printGeneralStatistics(unsigned Iterations, +void BackendPrinter::printGeneralStatistics(raw_ostream &OS, +                                            unsigned Iterations,                                              unsigned Cycles,                                              unsigned Instructions,                                              unsigned DispatchWidth) const { @@ -46,67 +36,10 @@ void BackendPrinter::printGeneralStatistics(unsigned Iterations,    TempStream << "\nDispatch Width: " << DispatchWidth;    TempStream << "\nIPC:            " << format("%.2f", IPC) << '\n';    TempStream.flush(); -  File->os() << Buffer; -} - -void BackendPrinter::printRATStatistics(unsigned TotalMappings, -                                        unsigned MaxUsedMappings) const { -  std::string Buffer; -  raw_string_ostream TempStream(Buffer); -  TempStream << "\n\nRegister Alias Table:"; -  TempStream << "\nTotal number of mappings created: " << TotalMappings; -  TempStream << "\nMax number of mappings used:      " << MaxUsedMappings -             << '\n'; -  TempStream.flush(); -  File->os() << Buffer; -} - -void BackendPrinter::printDispatchStalls(unsigned RATStalls, unsigned RCUStalls, -                                         unsigned SCHEDQStalls, -                                         unsigned LDQStalls, unsigned STQStalls, -                                         unsigned DGStalls) const { -  std::string Buffer; -  raw_string_ostream TempStream(Buffer); -  TempStream << "\n\nDynamic Dispatch Stall Cycles:\n"; -  TempStream << "RAT     - Register unavailable:                      " -             << RATStalls; -  TempStream << "\nRCU     - Retire tokens unavailable:                 " -             << RCUStalls; -  TempStream << "\nSCHEDQ  - Scheduler full:                            " -             << SCHEDQStalls; -  TempStream << "\nLQ      - Load queue full:                           " -             << LDQStalls; -  TempStream << "\nSQ      - Store queue full:                          " -             << STQStalls; -  TempStream << "\nGROUP   - Static restrictions on the dispatch group: " -             << DGStalls; -  TempStream << '\n'; -  TempStream.flush(); -  File->os() << Buffer; -} - -void BackendPrinter::printSchedulerUsage( -    const MCSchedModel &SM, const ArrayRef<BufferUsageEntry> &Usage) const { -  std::string Buffer; -  raw_string_ostream TempStream(Buffer); -  TempStream << "\n\nScheduler's queue usage:\n"; -  const ArrayRef<uint64_t> ResourceMasks = B.getProcResourceMasks(); -  for (unsigned I = 0, E = SM.getNumProcResourceKinds(); I < E; ++I) { -    const MCProcResourceDesc &ProcResource = *SM.getProcResource(I); -    if (!ProcResource.BufferSize) -      continue; - -    for (const BufferUsageEntry &Entry : Usage) -      if (ResourceMasks[I] == Entry.first) -        TempStream << ProcResource.Name << ",  " << Entry.second << '/' -                   << ProcResource.BufferSize << '\n'; -  } - -  TempStream.flush(); -  File->os() << Buffer; +  OS << Buffer;  } -void BackendPrinter::printInstructionInfo() const { +void BackendPrinter::printInstructionInfo(raw_ostream &OS) const {    std::string Buffer;    raw_string_ostream TempStream(Buffer); @@ -143,67 +76,22 @@ void BackendPrinter::printInstructionInfo() const {      TempStream << (ID.MayLoad ? " *     " : "       ");      TempStream << (ID.MayStore ? " *     " : "       ");      TempStream << (ID.HasSideEffects ? " * " : "   "); -    MCIP->printInst(&Inst, TempStream, "", B.getSTI()); +    MCIP.printInst(&Inst, TempStream, "", B.getSTI());      TempStream << '\n';    }    TempStream.flush(); -  File->os() << Buffer; +  OS << Buffer;  } -void BackendPrinter::printReport() const { -  assert(isFileValid()); +void BackendPrinter::printReport(llvm::raw_ostream &OS) const {    unsigned Cycles = B.getNumCycles(); -  printGeneralStatistics(B.getNumIterations(), Cycles, B.getNumInstructions(), +  printGeneralStatistics(OS, B.getNumIterations(), Cycles, B.getNumInstructions(),                           B.getDispatchWidth()); -  printInstructionInfo(); +  printInstructionInfo(OS); -  if (EnableVerboseOutput) { -    printDispatchStalls(B.getNumRATStalls(), B.getNumRCUStalls(), -                        B.getNumSQStalls(), B.getNumLDQStalls(), -                        B.getNumSTQStalls(), B.getNumDispatchGroupStalls()); -    printRATStatistics(B.getTotalRegisterMappingsCreated(), -                       B.getMaxUsedRegisterMappings()); -    BS->printHistograms(File->os()); - -    std::vector<BufferUsageEntry> Usage; -    B.getBuffersUsage(Usage); -    printSchedulerUsage(B.getSchedModel(), Usage); -  } - -  if (RPV) -    RPV->printResourcePressure(getOStream(), Cycles); - -  if (TV) { -    TV->printTimeline(getOStream()); -    TV->printAverageWaitTimes(getOStream()); -  } -} - -void BackendPrinter::addResourcePressureView() { -  if (!RPV) { -    RPV = llvm::make_unique<ResourcePressureView>( -        B.getSTI(), *MCIP, B.getSourceMgr(), B.getProcResourceMasks()); -    B.addEventListener(RPV.get()); -  } -} - -void BackendPrinter::addTimelineView(unsigned MaxIterations, -                                     unsigned MaxCycles) { -  if (!TV) { -    TV = llvm::make_unique<TimelineView>(B.getSTI(), *MCIP, B.getSourceMgr(), -                                         MaxIterations, MaxCycles); -    B.addEventListener(TV.get()); -  } -} - -void BackendPrinter::initialize(std::string OutputFileName) { -  File = getOutputStream(OutputFileName); -  MCIP->setPrintImmHex(false); -  if (EnableVerboseOutput) { -    BS = llvm::make_unique<BackendStatistics>(); -    B.addEventListener(BS.get()); -  } +  for (const auto &V : Views) +    V->printView(OS);  }  } // namespace mca.  | 
