Index: llvm/trunk/tools/llvm-mca/DispatchStage.h =================================================================== --- llvm/trunk/tools/llvm-mca/DispatchStage.h +++ llvm/trunk/tools/llvm-mca/DispatchStage.h @@ -64,7 +64,6 @@ void dispatch(InstRef IR); void updateRAWDependencies(ReadState &RS, const llvm::MCSubtargetInfo &STI); - void notifyStallEvent(const HWStallEvent &Event); void notifyInstructionDispatched(const InstRef &IR, llvm::ArrayRef UsedPhysRegs); Index: llvm/trunk/tools/llvm-mca/DispatchStage.cpp =================================================================== --- llvm/trunk/tools/llvm-mca/DispatchStage.cpp +++ llvm/trunk/tools/llvm-mca/DispatchStage.cpp @@ -30,12 +30,7 @@ void DispatchStage::notifyInstructionDispatched(const InstRef &IR, ArrayRef UsedRegs) { LLVM_DEBUG(dbgs() << "[E] Instruction Dispatched: " << IR << '\n'); - notifyInstructionEvent(HWInstructionDispatchedEvent(IR, UsedRegs)); -} - -void DispatchStage::notifyStallEvent(const HWStallEvent &Event) { - for (HWEventListener *Listener : getListeners()) - Listener->onStallEvent(Event); + notifyEvent(HWInstructionDispatchedEvent(IR, UsedRegs)); } bool DispatchStage::checkPRF(const InstRef &IR) { @@ -47,7 +42,8 @@ const unsigned RegisterMask = PRF.isAvailable(RegDefs); // A mask with all zeroes means: register files are available. if (RegisterMask) { - notifyStallEvent(HWStallEvent(HWStallEvent::RegisterFileStall, IR)); + notifyEvent( + HWStallEvent(HWStallEvent::RegisterFileStall, IR)); return false; } @@ -58,7 +54,8 @@ const unsigned NumMicroOps = IR.getInstruction()->getDesc().NumMicroOps; if (RCU.isAvailable(NumMicroOps)) return true; - notifyStallEvent(HWStallEvent(HWStallEvent::RetireControlUnitStall, IR)); + notifyEvent( + HWStallEvent(HWStallEvent::RetireControlUnitStall, IR)); return false; } @@ -66,7 +63,7 @@ HWStallEvent::GenericEventType Event; const bool Ready = SC.canBeDispatched(IR, Event); if (!Ready) - notifyStallEvent(HWStallEvent(Event, IR)); + notifyEvent(HWStallEvent(Event, IR)); return Ready; } Index: llvm/trunk/tools/llvm-mca/DispatchStatistics.h =================================================================== --- llvm/trunk/tools/llvm-mca/DispatchStatistics.h +++ llvm/trunk/tools/llvm-mca/DispatchStatistics.h @@ -66,14 +66,14 @@ : NumDispatched(0), NumCycles(0), HWStalls(HWStallEvent::LastGenericEvent) {} - void onInstructionEvent(const HWInstructionEvent &Event) override; + void onEvent(const HWStallEvent &Event) override; + + void onEvent(const HWInstructionEvent &Event) override; void onCycleBegin() override { NumCycles++; } void onCycleEnd() override { updateHistograms(); } - void onStallEvent(const HWStallEvent &Event) override; - void printView(llvm::raw_ostream &OS) const override { printDispatchStalls(OS); printDispatchHistogram(OS); Index: llvm/trunk/tools/llvm-mca/DispatchStatistics.cpp =================================================================== --- llvm/trunk/tools/llvm-mca/DispatchStatistics.cpp +++ llvm/trunk/tools/llvm-mca/DispatchStatistics.cpp @@ -20,12 +20,12 @@ namespace mca { -void DispatchStatistics::onStallEvent(const HWStallEvent &Event) { +void DispatchStatistics::onEvent(const HWStallEvent &Event) { if (Event.Type < HWStallEvent::LastGenericEvent) HWStalls[Event.Type]++; } -void DispatchStatistics::onInstructionEvent(const HWInstructionEvent &Event) { +void DispatchStatistics::onEvent(const HWInstructionEvent &Event) { if (Event.Type == HWInstructionEvent::Dispatched) ++NumDispatched; } Index: llvm/trunk/tools/llvm-mca/ExecuteStage.cpp =================================================================== --- llvm/trunk/tools/llvm-mca/ExecuteStage.cpp +++ llvm/trunk/tools/llvm-mca/ExecuteStage.cpp @@ -154,13 +154,15 @@ void ExecuteStage::notifyInstructionExecuted(const InstRef &IR) { HWS.onInstructionExecuted(IR); LLVM_DEBUG(dbgs() << "[E] Instruction Executed: " << IR << '\n'); - notifyInstructionEvent(HWInstructionEvent(HWInstructionEvent::Executed, IR)); + notifyEvent( + HWInstructionEvent(HWInstructionEvent::Executed, IR)); RCU.onInstructionExecuted(IR.getInstruction()->getRCUTokenID()); } void ExecuteStage::notifyInstructionReady(const InstRef &IR) { LLVM_DEBUG(dbgs() << "[E] Instruction Ready: " << IR << '\n'); - notifyInstructionEvent(HWInstructionEvent(HWInstructionEvent::Ready, IR)); + notifyEvent( + HWInstructionEvent(HWInstructionEvent::Ready, IR)); } void ExecuteStage::notifyResourceAvailable(const ResourceRef &RR) { @@ -180,7 +182,7 @@ dbgs() << " cycles: " << Resource.second << '\n'; } }); - notifyInstructionEvent(HWInstructionIssuedEvent(IR, Used)); + notifyEvent(HWInstructionIssuedEvent(IR, Used)); } void ExecuteStage::notifyReservedBuffers(ArrayRef Buffers) { Index: llvm/trunk/tools/llvm-mca/HWEventListener.h =================================================================== --- llvm/trunk/tools/llvm-mca/HWEventListener.h +++ llvm/trunk/tools/llvm-mca/HWEventListener.h @@ -120,8 +120,8 @@ virtual void onCycleBegin() {} virtual void onCycleEnd() {} - virtual void onInstructionEvent(const HWInstructionEvent &Event) {} - virtual void onStallEvent(const HWStallEvent &Event) {} + virtual void onEvent(const HWInstructionEvent &Event) {} + virtual void onEvent(const HWStallEvent &Event) {} using ResourceRef = std::pair; virtual void onResourceAvailable(const ResourceRef &RRef) {} Index: llvm/trunk/tools/llvm-mca/InstructionTables.cpp =================================================================== --- llvm/trunk/tools/llvm-mca/InstructionTables.cpp +++ llvm/trunk/tools/llvm-mca/InstructionTables.cpp @@ -39,9 +39,8 @@ if (!Resource.second.size()) continue; double Cycles = static_cast(Resource.second.size()); - unsigned Index = - std::distance(Masks.begin(), std::find(Masks.begin(), Masks.end(), - Resource.first)); + unsigned Index = std::distance( + Masks.begin(), std::find(Masks.begin(), Masks.end(), Resource.first)); const MCProcResourceDesc &ProcResource = *SM.getProcResource(Index); unsigned NumUnits = ProcResource.NumUnits; if (!ProcResource.SubUnitsIdxBegin) { @@ -73,7 +72,7 @@ InstRef IR(SR.first, Inst.get()); HWInstructionIssuedEvent Event(IR, UsedResources); for (std::unique_ptr &Listener : Views) - Listener->onInstructionEvent(Event); + Listener->onEvent(Event); S.updateNext(); } } Index: llvm/trunk/tools/llvm-mca/RegisterFileStatistics.h =================================================================== --- llvm/trunk/tools/llvm-mca/RegisterFileStatistics.h +++ llvm/trunk/tools/llvm-mca/RegisterFileStatistics.h @@ -58,7 +58,7 @@ initializeRegisterFileInfo(); } - void onInstructionEvent(const HWInstructionEvent &Event) override; + void onEvent(const HWInstructionEvent &Event) override; void printView(llvm::raw_ostream &OS) const override; }; Index: llvm/trunk/tools/llvm-mca/RegisterFileStatistics.cpp =================================================================== --- llvm/trunk/tools/llvm-mca/RegisterFileStatistics.cpp +++ llvm/trunk/tools/llvm-mca/RegisterFileStatistics.cpp @@ -39,8 +39,7 @@ std::fill(RegisterFiles.begin(), RegisterFiles.end(), Empty); } -void RegisterFileStatistics::onInstructionEvent( - const HWInstructionEvent &Event) { +void RegisterFileStatistics::onEvent(const HWInstructionEvent &Event) { switch (Event.Type) { default: break; Index: llvm/trunk/tools/llvm-mca/ResourcePressureView.h =================================================================== --- llvm/trunk/tools/llvm-mca/ResourcePressureView.h +++ llvm/trunk/tools/llvm-mca/ResourcePressureView.h @@ -96,7 +96,7 @@ initialize(); } - void onInstructionEvent(const HWInstructionEvent &Event) override; + void onEvent(const HWInstructionEvent &Event) override; void printView(llvm::raw_ostream &OS) const override { unsigned Executions = Source.getNumIterations(); Index: llvm/trunk/tools/llvm-mca/ResourcePressureView.cpp =================================================================== --- llvm/trunk/tools/llvm-mca/ResourcePressureView.cpp +++ llvm/trunk/tools/llvm-mca/ResourcePressureView.cpp @@ -40,7 +40,7 @@ std::fill(ResourceUsage.begin(), ResourceUsage.end(), 0.0); } -void ResourcePressureView::onInstructionEvent(const HWInstructionEvent &Event) { +void ResourcePressureView::onEvent(const HWInstructionEvent &Event) { // We're only interested in Issue events. if (Event.Type != HWInstructionEvent::Issued) return; Index: llvm/trunk/tools/llvm-mca/RetireControlUnitStatistics.h =================================================================== --- llvm/trunk/tools/llvm-mca/RetireControlUnitStatistics.h +++ llvm/trunk/tools/llvm-mca/RetireControlUnitStatistics.h @@ -47,7 +47,7 @@ public: RetireControlUnitStatistics() : NumRetired(0), NumCycles(0) {} - void onInstructionEvent(const HWInstructionEvent &Event) override; + void onEvent(const HWInstructionEvent &Event) override; void onCycleBegin() override { NumCycles++; } Index: llvm/trunk/tools/llvm-mca/RetireControlUnitStatistics.cpp =================================================================== --- llvm/trunk/tools/llvm-mca/RetireControlUnitStatistics.cpp +++ llvm/trunk/tools/llvm-mca/RetireControlUnitStatistics.cpp @@ -19,8 +19,7 @@ namespace mca { -void RetireControlUnitStatistics::onInstructionEvent( - const HWInstructionEvent &Event) { +void RetireControlUnitStatistics::onEvent(const HWInstructionEvent &Event) { if (Event.Type == HWInstructionEvent::Retired) ++NumRetired; } Index: llvm/trunk/tools/llvm-mca/RetireStage.cpp =================================================================== --- llvm/trunk/tools/llvm-mca/RetireStage.cpp +++ llvm/trunk/tools/llvm-mca/RetireStage.cpp @@ -49,7 +49,7 @@ for (const std::unique_ptr &WS : IR.getInstruction()->getDefs()) PRF.removeRegisterWrite(*WS.get(), FreedRegs, !Desc.isZeroLatency()); - notifyInstructionEvent(HWInstructionRetiredEvent(IR, FreedRegs)); + notifyEvent(HWInstructionRetiredEvent(IR, FreedRegs)); } } // namespace mca Index: llvm/trunk/tools/llvm-mca/SchedulerStatistics.h =================================================================== --- llvm/trunk/tools/llvm-mca/SchedulerStatistics.h +++ llvm/trunk/tools/llvm-mca/SchedulerStatistics.h @@ -65,9 +65,9 @@ public: SchedulerStatistics(const llvm::MCSubtargetInfo &STI) - : SM(STI.getSchedModel()), NumIssued(0), NumCycles(0) { } + : SM(STI.getSchedModel()), NumIssued(0), NumCycles(0) {} - void onInstructionEvent(const HWInstructionEvent &Event) override; + void onEvent(const HWInstructionEvent &Event) override; void onCycleBegin() override { NumCycles++; } Index: llvm/trunk/tools/llvm-mca/SchedulerStatistics.cpp =================================================================== --- llvm/trunk/tools/llvm-mca/SchedulerStatistics.cpp +++ llvm/trunk/tools/llvm-mca/SchedulerStatistics.cpp @@ -19,7 +19,7 @@ namespace mca { -void SchedulerStatistics::onInstructionEvent(const HWInstructionEvent &Event) { +void SchedulerStatistics::onEvent(const HWInstructionEvent &Event) { if (Event.Type == HWInstructionEvent::Issued) ++NumIssued; } Index: llvm/trunk/tools/llvm-mca/Stage.h =================================================================== --- llvm/trunk/tools/llvm-mca/Stage.h +++ llvm/trunk/tools/llvm-mca/Stage.h @@ -55,7 +55,11 @@ /// Add a listener to receive callbacks during the execution of this stage. void addListener(HWEventListener *Listener); - virtual void notifyInstructionEvent(const HWInstructionEvent &Event); + /// Notify listeners of a particular hardware event. + template void notifyEvent(const EventT &Event) { + for (HWEventListener *Listener : Listeners) + Listener->onEvent(Event); + } }; } // namespace mca Index: llvm/trunk/tools/llvm-mca/Stage.cpp =================================================================== --- llvm/trunk/tools/llvm-mca/Stage.cpp +++ llvm/trunk/tools/llvm-mca/Stage.cpp @@ -24,9 +24,4 @@ Listeners.insert(Listener); } -void Stage::notifyInstructionEvent(const HWInstructionEvent &Event) { - for (HWEventListener *Listener : Listeners) - Listener->onInstructionEvent(Event); -} - } // namespace mca Index: llvm/trunk/tools/llvm-mca/SummaryView.h =================================================================== --- llvm/trunk/tools/llvm-mca/SummaryView.h +++ llvm/trunk/tools/llvm-mca/SummaryView.h @@ -67,7 +67,7 @@ void onCycleEnd() override { ++TotalCycles; } - void onInstructionEvent(const HWInstructionEvent &Event) override; + void onEvent(const HWInstructionEvent &Event) override; void printView(llvm::raw_ostream &OS) const override; }; Index: llvm/trunk/tools/llvm-mca/SummaryView.cpp =================================================================== --- llvm/trunk/tools/llvm-mca/SummaryView.cpp +++ llvm/trunk/tools/llvm-mca/SummaryView.cpp @@ -32,7 +32,7 @@ computeProcResourceMasks(SM, ProcResourceMasks); } -void SummaryView::onInstructionEvent(const HWInstructionEvent &Event) { +void SummaryView::onEvent(const HWInstructionEvent &Event) { // We are only interested in the "instruction dispatched" events generated by // the dispatch stage for instructions that are part of iteration #0. if (Event.Type != HWInstructionEvent::Dispatched) Index: llvm/trunk/tools/llvm-mca/TimelineView.h =================================================================== --- llvm/trunk/tools/llvm-mca/TimelineView.h +++ llvm/trunk/tools/llvm-mca/TimelineView.h @@ -174,7 +174,7 @@ // Event handlers. void onCycleEnd() override { ++CurrentCycle; } - void onInstructionEvent(const HWInstructionEvent &Event) override; + void onEvent(const HWInstructionEvent &Event) override; // print functionalities. void printTimeline(llvm::raw_ostream &OS) const; Index: llvm/trunk/tools/llvm-mca/TimelineView.cpp =================================================================== --- llvm/trunk/tools/llvm-mca/TimelineView.cpp +++ llvm/trunk/tools/llvm-mca/TimelineView.cpp @@ -34,7 +34,7 @@ std::fill(WaitTime.begin(), WaitTime.end(), NullWTEntry); } -void TimelineView::onInstructionEvent(const HWInstructionEvent &Event) { +void TimelineView::onEvent(const HWInstructionEvent &Event) { const unsigned Index = Event.IR.getSourceIndex(); if (CurrentCycle >= MaxCycle || Index >= Timeline.size()) return;