From 35622488258b6224a152ec7b310714d5a490af42 Mon Sep 17 00:00:00 2001 From: Andrea Di Biagio Date: Thu, 22 Mar 2018 10:19:20 +0000 Subject: [PATCH] [llvm-mca] Simplify code. NFC llvm-svn: 328187 --- llvm/tools/llvm-mca/HWEventListener.h | 5 ++-- llvm/tools/llvm-mca/InstrBuilder.cpp | 10 +++---- llvm/tools/llvm-mca/Instruction.cpp | 41 ++++++++++++++++------------ llvm/tools/llvm-mca/Instruction.h | 18 ++---------- llvm/tools/llvm-mca/ResourcePressureView.cpp | 24 ++++++++-------- llvm/tools/llvm-mca/ResourcePressureView.h | 10 ++++--- llvm/tools/llvm-mca/Scheduler.cpp | 12 ++++---- llvm/tools/llvm-mca/Support.cpp | 3 +- llvm/tools/llvm-mca/TimelineView.cpp | 2 +- llvm/tools/llvm-mca/TimelineView.h | 6 ++-- llvm/tools/llvm-mca/llvm-mca.cpp | 23 +++++----------- 11 files changed, 69 insertions(+), 85 deletions(-) diff --git a/llvm/tools/llvm-mca/HWEventListener.h b/llvm/tools/llvm-mca/HWEventListener.h index 2c3f7f3..5ef64be 100644 --- a/llvm/tools/llvm-mca/HWEventListener.h +++ b/llvm/tools/llvm-mca/HWEventListener.h @@ -60,8 +60,8 @@ public: class HWInstructionIssuedEvent : public HWInstructionEvent { public: using ResourceRef = std::pair; - HWInstructionIssuedEvent( - unsigned Index, llvm::ArrayRef> UR) + HWInstructionIssuedEvent(unsigned Index, + llvm::ArrayRef> UR) : HWInstructionEvent(HWInstructionEvent::Issued, Index), UsedResources(UR) {} @@ -134,7 +134,6 @@ public: private: virtual void anchor(); }; - } // namespace mca #endif diff --git a/llvm/tools/llvm-mca/InstrBuilder.cpp b/llvm/tools/llvm-mca/InstrBuilder.cpp index 07a21cf..ea54c36 100644 --- a/llvm/tools/llvm-mca/InstrBuilder.cpp +++ b/llvm/tools/llvm-mca/InstrBuilder.cpp @@ -409,10 +409,9 @@ void InstrBuilder::createInstrDescImpl(const MCInst &MCI) { } const InstrDesc &InstrBuilder::getOrCreateInstrDesc(const MCInst &MCI) { - auto it = Descriptors.find(MCI.getOpcode()); - if (it == Descriptors.end()) + if (Descriptors.find_as(MCI.getOpcode()) == Descriptors.end()) createInstrDescImpl(MCI); - return *Descriptors[MCI.getOpcode()].get(); + return *Descriptors[MCI.getOpcode()]; } std::unique_ptr @@ -448,12 +447,11 @@ InstrBuilder::createInstruction(unsigned Idx, const MCInst &MCI) { for (const WriteDescriptor &WD : D.Writes) { unsigned RegID = WD.OpIndex == -1 ? WD.RegisterID : MCI.getOperand(WD.OpIndex).getReg(); - assert((RegID || WD.IsOptionalDef) && "Expected a valid register ID!"); - // Special case where this is a optional definition, and the actual register - // is 0. + // Check if this is a optional definition that references NoReg. if (WD.IsOptionalDef && !RegID) continue; + assert(RegID && "Expected a valid register ID!"); NewIS->getDefs().emplace_back(llvm::make_unique(WD, RegID)); } diff --git a/llvm/tools/llvm-mca/Instruction.cpp b/llvm/tools/llvm-mca/Instruction.cpp index e7f9916..e3b26bd 100644 --- a/llvm/tools/llvm-mca/Instruction.cpp +++ b/llvm/tools/llvm-mca/Instruction.cpp @@ -92,17 +92,13 @@ void WriteState::dump() const { } #endif -bool Instruction::isReady() { - if (Stage == IS_READY) - return true; +void Instruction::dispatch() { + assert(Stage == IS_INVALID); + Stage = IS_AVAILABLE; - assert(Stage == IS_AVAILABLE); - for (const UniqueUse &Use : Uses) - if (!Use.get()->isReady()) - return false; - - setReady(); - return true; + if (std::all_of(Uses.begin(), Uses.end(), + [](const UniqueUse &Use) { return Use->isReady(); })) + Stage = IS_READY; } void Instruction::execute() { @@ -110,6 +106,8 @@ void Instruction::execute() { Stage = IS_EXECUTING; for (UniqueDef &Def : Defs) Def->onInstructionIssued(); + if (!CyclesLeft) + Stage = IS_EXECUTED; } bool Instruction::isZeroLatency() const { @@ -117,18 +115,27 @@ bool Instruction::isZeroLatency() const { } void Instruction::cycleEvent() { + if (isReady()) + return; + if (isDispatched()) { - for (UniqueUse &Use : Uses) + bool IsReady = true; + for (UniqueUse &Use : Uses) { Use->cycleEvent(); + IsReady &= Use->isReady(); + } + + if (IsReady) + Stage = IS_READY; return; } - if (isExecuting()) { - for (UniqueDef &Def : Defs) - Def->cycleEvent(); - CyclesLeft--; - } + + assert(isExecuting() && "Instruction not in-flight?"); + assert(CyclesLeft && "Instruction already executed?"); + for (UniqueDef &Def : Defs) + Def->cycleEvent(); + CyclesLeft--; if (!CyclesLeft) Stage = IS_EXECUTED; } - } // namespace mca diff --git a/llvm/tools/llvm-mca/Instruction.h b/llvm/tools/llvm-mca/Instruction.h index a87420d..7a0591b 100644 --- a/llvm/tools/llvm-mca/Instruction.h +++ b/llvm/tools/llvm-mca/Instruction.h @@ -276,12 +276,6 @@ class Instruction { // One entry per each implicit and explicit register use. VecUses Uses; - // This instruction has already been dispatched, and all operands are ready. - void setReady() { - assert(Stage == IS_AVAILABLE); - Stage = IS_READY; - } - public: Instruction(const InstrDesc &D) : Desc(D), Stage(IS_INVALID), CyclesLeft(-1) {} @@ -301,10 +295,7 @@ public: // Transition to the dispatch stage. // No definition is updated because the instruction is not "executing". - void dispatch() { - assert(Stage == IS_INVALID); - Stage = IS_AVAILABLE; - } + void dispatch(); // Instruction issued. Transition to the IS_EXECUTING state, and update // all the definitions. @@ -316,17 +307,14 @@ public: Stage = IS_EXECUTED; } - // Checks if operands are available. If all operands area ready, - // then this forces a transition from IS_AVAILABLE to IS_READY. - bool isReady(); - bool isDispatched() const { return Stage == IS_AVAILABLE; } + bool isReady() const { return Stage == IS_READY; } bool isExecuting() const { return Stage == IS_EXECUTING; } bool isExecuted() const { return Stage == IS_EXECUTED; } bool isZeroLatency() const; void retire() { - assert(Stage == IS_EXECUTED); + assert(isExecuted() && "Instruction is in an invalid state!"); Stage = IS_RETIRED; } diff --git a/llvm/tools/llvm-mca/ResourcePressureView.cpp b/llvm/tools/llvm-mca/ResourcePressureView.cpp index 18ef495..330de2d 100644 --- a/llvm/tools/llvm-mca/ResourcePressureView.cpp +++ b/llvm/tools/llvm-mca/ResourcePressureView.cpp @@ -30,7 +30,7 @@ void ResourcePressureView::initialize() { if (ProcResource.SubUnitsIdxBegin || !NumUnits) continue; - Resource2VecIndex.insert(std::pair(I, R2VIndex)); + Resource2VecIndex.insert(std::pair(I, R2VIndex)); R2VIndex += ProcResource.NumUnits; } @@ -70,16 +70,14 @@ static void printColumnNames(raw_string_ostream &OS, const MCSchedModel &SM) { OS << " "; else OS << " "; - ResourceIndex++; - continue; - } - - for (unsigned J = 0; J < NumUnits; ++J) { - OS << "[" << ResourceIndex << '.' << J << ']'; - if (ResourceIndex < 10) - OS << " "; - else - OS << ' '; + } else { + for (unsigned J = 0; J < NumUnits; ++J) { + OS << "[" << ResourceIndex << '.' << J << ']'; + if (ResourceIndex < 10) + OS << " "; + else + OS << ' '; + } } ResourceIndex++; } @@ -114,8 +112,8 @@ void ResourcePressureView::printResourcePressurePerIteration( printColumnNames(TempStream, SM); TempStream << '\n'; - for (unsigned I = 0; I < NumResourceUnits; ++I) { - unsigned Usage = ResourceUsage[I + Source.size() * NumResourceUnits]; + for (unsigned I = 0, E = NumResourceUnits; I < E; ++I) { + unsigned Usage = ResourceUsage[I + Source.size() * E]; if (!Usage) { TempStream << " - "; continue; diff --git a/llvm/tools/llvm-mca/ResourcePressureView.h b/llvm/tools/llvm-mca/ResourcePressureView.h index 1b577a2..ee03cd3 100644 --- a/llvm/tools/llvm-mca/ResourcePressureView.h +++ b/llvm/tools/llvm-mca/ResourcePressureView.h @@ -60,6 +60,7 @@ #include "SourceMgr.h" #include "View.h" +#include "llvm/ADT/DenseMap.h" #include "llvm/MC/MCInstPrinter.h" #include "llvm/MC/MCSubtargetInfo.h" #include @@ -75,8 +76,9 @@ class ResourcePressureView : public View { llvm::MCInstPrinter &MCIP; const SourceMgr &Source; - // Map to quickly get a resource descriptor from a mask. - std::map Resource2VecIndex; + // Map to quickly obtain the ResourceUsage column index from a processor + // resource ID. + llvm::DenseMap Resource2VecIndex; // Table of resources used by instructions. std::vector ResourceUsage; @@ -90,9 +92,9 @@ class ResourcePressureView : public View { void initialize(); public: - ResourcePressureView(const llvm::MCSubtargetInfo &ST, + ResourcePressureView(const llvm::MCSubtargetInfo &sti, llvm::MCInstPrinter &Printer, const SourceMgr &SM) - : STI(ST), MCIP(Printer), Source(SM) { + : STI(sti), MCIP(Printer), Source(SM) { initialize(); } diff --git a/llvm/tools/llvm-mca/Scheduler.cpp b/llvm/tools/llvm-mca/Scheduler.cpp index 2a938b8..e722844 100644 --- a/llvm/tools/llvm-mca/Scheduler.cpp +++ b/llvm/tools/llvm-mca/Scheduler.cpp @@ -352,14 +352,16 @@ void Scheduler::issueInstruction(Instruction &IS, unsigned InstrIndex) { // This updates the internal state of each write. IS.execute(); + notifyInstructionIssued(InstrIndex, UsedResources); if (D.MaxLatency) { + assert(IS.isExecuting() && "A zero latency instruction?"); IssuedQueue[InstrIndex] = &IS; - notifyInstructionIssued(InstrIndex, UsedResources); - } else { - // A zero latency instruction which reads and/or updates registers. - notifyInstructionIssued(InstrIndex, UsedResources); - notifyInstructionExecuted(InstrIndex); + return; } + + // A zero latency instruction which reads and/or updates registers. + assert(IS.isExecuted() && "Instruction still executing!"); + notifyInstructionExecuted(InstrIndex); } void Scheduler::issue() { diff --git a/llvm/tools/llvm-mca/Support.cpp b/llvm/tools/llvm-mca/Support.cpp index a0e0f59..e97cc51 100644 --- a/llvm/tools/llvm-mca/Support.cpp +++ b/llvm/tools/llvm-mca/Support.cpp @@ -1,5 +1,4 @@ -//===--------------------- Support.cpp ----------------------------*- C++ -//-*-===// +//===--------------------- Support.cpp --------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // diff --git a/llvm/tools/llvm-mca/TimelineView.cpp b/llvm/tools/llvm-mca/TimelineView.cpp index cb51e9e5..c57cad7 100644 --- a/llvm/tools/llvm-mca/TimelineView.cpp +++ b/llvm/tools/llvm-mca/TimelineView.cpp @@ -1,4 +1,4 @@ -//===--------------------- TimelineView.cpp ---------------*- C++ -*-===// +//===--------------------- TimelineView.cpp ---------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // diff --git a/llvm/tools/llvm-mca/TimelineView.h b/llvm/tools/llvm-mca/TimelineView.h index c7300f8..7d337b8 100644 --- a/llvm/tools/llvm-mca/TimelineView.h +++ b/llvm/tools/llvm-mca/TimelineView.h @@ -1,4 +1,4 @@ -//===--------------------- TimelineView.h ---------------*- C++ -*-===// +//===--------------------- TimelineView.h -----------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -150,6 +150,8 @@ class TimelineView : public View { const unsigned DEFAULT_ITERATIONS = 10; + void initialize(unsigned MaxIterations); + public: TimelineView(const llvm::MCSubtargetInfo &sti, llvm::MCInstPrinter &Printer, const SourceMgr &Sequence, unsigned MaxIterations, @@ -159,8 +161,6 @@ public: initialize(MaxIterations); } - void initialize(unsigned MaxIterations); - // Event handlers. void onCycleBegin(unsigned Cycle) override { CurrentCycle = Cycle; } void onInstructionEvent(const HWInstructionEvent &Event) override; diff --git a/llvm/tools/llvm-mca/llvm-mca.cpp b/llvm/tools/llvm-mca/llvm-mca.cpp index 88d33fa..e9248f1 100644 --- a/llvm/tools/llvm-mca/llvm-mca.cpp +++ b/llvm/tools/llvm-mca/llvm-mca.cpp @@ -198,7 +198,6 @@ public: const InstVec &GetInstructionSequence() const { return Insts; } }; - } // end of anonymous namespace int main(int argc, char **argv) { @@ -324,25 +323,17 @@ int main(int argc, char **argv) { std::unique_ptr Printer = llvm::make_unique(*B); - std::unique_ptr SV = - llvm::make_unique(*STI, *MCII, *S, *IP, Width); - Printer->addView(std::move(SV)); + Printer->addView( + llvm::make_unique(*STI, *MCII, *S, *IP, Width)); - if (PrintModeVerbose) { - std::unique_ptr BS = - llvm::make_unique(*STI); - Printer->addView(std::move(BS)); - } + if (PrintModeVerbose) + Printer->addView(llvm::make_unique(*STI)); - std::unique_ptr RPV = - llvm::make_unique(*STI, *IP, *S); - Printer->addView(std::move(RPV)); + Printer->addView(llvm::make_unique(*STI, *IP, *S)); if (PrintTimelineView) { - std::unique_ptr TV = - llvm::make_unique( - *STI, *IP, *S, TimelineMaxIterations, TimelineMaxCycles); - Printer->addView(std::move(TV)); + Printer->addView(llvm::make_unique( + *STI, *IP, *S, TimelineMaxIterations, TimelineMaxCycles)); } B->run(); -- 2.7.4