Index: tools/llvm-mca/include/Stages/EntryStage.h =================================================================== --- tools/llvm-mca/include/Stages/EntryStage.h +++ tools/llvm-mca/include/Stages/EntryStage.h @@ -1,4 +1,4 @@ -//===---------------------- FetchStage.h ------------------------*- C++ -*-===// +//===---------------------- EntryStage.h ------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -8,13 +8,14 @@ //===----------------------------------------------------------------------===// /// \file /// -/// This file defines the Fetch stage of an instruction pipeline. Its sole -/// purpose in life is to produce instructions for the rest of the pipeline. +/// This file defines the Entry stage of an instruction pipeline. Its sole +/// purpose in life is to pick instructions in sequence and move them to the +/// next pipeline stage. /// //===----------------------------------------------------------------------===// -#ifndef LLVM_TOOLS_LLVM_MCA_FETCH_STAGE_H -#define LLVM_TOOLS_LLVM_MCA_FETCH_STAGE_H +#ifndef LLVM_TOOLS_LLVM_MCA_ENTRY_STAGE_H +#define LLVM_TOOLS_LLVM_MCA_ENTRY_STAGE_H #include "SourceMgr.h" #include "Stages/Stage.h" @@ -23,7 +24,7 @@ namespace llvm { namespace mca { -class FetchStage final : public Stage { +class EntryStage final : public Stage { InstRef CurrentInstruction; using InstMap = std::map>; InstMap Instructions; @@ -32,11 +33,11 @@ // Updates the program counter, and sets 'CurrentInstruction'. void getNextInstruction(); - FetchStage(const FetchStage &Other) = delete; - FetchStage &operator=(const FetchStage &Other) = delete; + EntryStage(const EntryStage &Other) = delete; + EntryStage &operator=(const EntryStage &Other) = delete; public: - FetchStage(SourceMgr &SM) : CurrentInstruction(), SM(SM) {} + EntryStage(SourceMgr &SM) : CurrentInstruction(), SM(SM) {} bool isAvailable(const InstRef &IR) const override; bool hasWorkToComplete() const override; Index: tools/llvm-mca/include/Stages/FetchStage.h =================================================================== --- tools/llvm-mca/include/Stages/FetchStage.h +++ tools/llvm-mca/include/Stages/FetchStage.h @@ -1,51 +0,0 @@ -//===---------------------- FetchStage.h ------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -/// \file -/// -/// This file defines the Fetch stage of an instruction pipeline. Its sole -/// purpose in life is to produce instructions for the rest of the pipeline. -/// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_TOOLS_LLVM_MCA_FETCH_STAGE_H -#define LLVM_TOOLS_LLVM_MCA_FETCH_STAGE_H - -#include "SourceMgr.h" -#include "Stages/Stage.h" -#include - -namespace llvm { -namespace mca { - -class FetchStage final : public Stage { - InstRef CurrentInstruction; - using InstMap = std::map>; - InstMap Instructions; - SourceMgr &SM; - - // Updates the program counter, and sets 'CurrentInstruction'. - void getNextInstruction(); - - FetchStage(const FetchStage &Other) = delete; - FetchStage &operator=(const FetchStage &Other) = delete; - -public: - FetchStage(SourceMgr &SM) : CurrentInstruction(), SM(SM) {} - - bool isAvailable(const InstRef &IR) const override; - bool hasWorkToComplete() const override; - Error execute(InstRef &IR) override; - Error cycleStart() override; - Error cycleEnd() override; -}; - -} // namespace mca -} // namespace llvm - -#endif // LLVM_TOOLS_LLVM_MCA_FETCH_STAGE_H Index: tools/llvm-mca/lib/CMakeLists.txt =================================================================== --- tools/llvm-mca/lib/CMakeLists.txt +++ tools/llvm-mca/lib/CMakeLists.txt @@ -15,7 +15,7 @@ Pipeline.cpp Stages/DispatchStage.cpp Stages/ExecuteStage.cpp - Stages/FetchStage.cpp + Stages/EntryStage.cpp Stages/InstructionTables.cpp Stages/RetireStage.cpp Stages/Stage.cpp Index: tools/llvm-mca/lib/Context.cpp =================================================================== --- tools/llvm-mca/lib/Context.cpp +++ tools/llvm-mca/lib/Context.cpp @@ -21,7 +21,7 @@ #include "HardwareUnits/Scheduler.h" #include "Stages/DispatchStage.h" #include "Stages/ExecuteStage.h" -#include "Stages/FetchStage.h" +#include "Stages/EntryStage.h" #include "Stages/RetireStage.h" namespace llvm { @@ -40,7 +40,7 @@ auto HWS = llvm::make_unique(SM, LSU.get()); // Create the pipeline stages. - auto Fetch = llvm::make_unique(SrcMgr); + auto Fetch = llvm::make_unique(SrcMgr); auto Dispatch = llvm::make_unique(STI, MRI, Opts.DispatchWidth, *RCU, *PRF); auto Execute = llvm::make_unique(*HWS); Index: tools/llvm-mca/lib/Stages/EntryStage.cpp =================================================================== --- tools/llvm-mca/lib/Stages/EntryStage.cpp +++ tools/llvm-mca/lib/Stages/EntryStage.cpp @@ -1,4 +1,4 @@ -//===---------------------- FetchStage.cpp ----------------------*- C++ -*-===// +//===---------------------- EntryStage.cpp ----------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -13,21 +13,21 @@ /// //===----------------------------------------------------------------------===// -#include "Stages/FetchStage.h" +#include "Stages/EntryStage.h" #include "Instruction.h" namespace llvm { namespace mca { -bool FetchStage::hasWorkToComplete() const { return CurrentInstruction; } +bool EntryStage::hasWorkToComplete() const { return CurrentInstruction; } -bool FetchStage::isAvailable(const InstRef & /* unused */) const { +bool EntryStage::isAvailable(const InstRef & /* unused */) const { if (CurrentInstruction) return checkNextStage(CurrentInstruction); return false; } -void FetchStage::getNextInstruction() { +void EntryStage::getNextInstruction() { assert(!CurrentInstruction && "There is already an instruction to process!"); if (!SM.hasNext()) return; @@ -38,7 +38,7 @@ SM.updateNext(); } -llvm::Error FetchStage::execute(InstRef & /*unused */) { +llvm::Error EntryStage::execute(InstRef & /*unused */) { assert(CurrentInstruction && "There is no instruction to process!"); if (llvm::Error Val = moveToTheNextStage(CurrentInstruction)) return Val; @@ -49,13 +49,13 @@ return llvm::ErrorSuccess(); } -llvm::Error FetchStage::cycleStart() { +llvm::Error EntryStage::cycleStart() { if (!CurrentInstruction) getNextInstruction(); return llvm::ErrorSuccess(); } -llvm::Error FetchStage::cycleEnd() { +llvm::Error EntryStage::cycleEnd() { // Find the first instruction which hasn't been retired. const InstMap::iterator It = llvm::find_if(Instructions, [](const InstMap::value_type &KeyValuePair) { Index: tools/llvm-mca/lib/Stages/FetchStage.cpp =================================================================== --- tools/llvm-mca/lib/Stages/FetchStage.cpp +++ tools/llvm-mca/lib/Stages/FetchStage.cpp @@ -1,73 +0,0 @@ -//===---------------------- FetchStage.cpp ----------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -/// \file -/// -/// This file defines the Fetch stage of an instruction pipeline. Its sole -/// purpose in life is to produce instructions for the rest of the pipeline. -/// -//===----------------------------------------------------------------------===// - -#include "Stages/FetchStage.h" -#include "Instruction.h" - -namespace llvm { -namespace mca { - -bool FetchStage::hasWorkToComplete() const { return CurrentInstruction; } - -bool FetchStage::isAvailable(const InstRef & /* unused */) const { - if (CurrentInstruction) - return checkNextStage(CurrentInstruction); - return false; -} - -void FetchStage::getNextInstruction() { - assert(!CurrentInstruction && "There is already an instruction to process!"); - if (!SM.hasNext()) - return; - SourceRef SR = SM.peekNext(); - std::unique_ptr Inst = llvm::make_unique(SR.second); - CurrentInstruction = InstRef(SR.first, Inst.get()); - Instructions[SR.first] = std::move(Inst); - SM.updateNext(); -} - -llvm::Error FetchStage::execute(InstRef & /*unused */) { - assert(CurrentInstruction && "There is no instruction to process!"); - if (llvm::Error Val = moveToTheNextStage(CurrentInstruction)) - return Val; - - // Move the program counter. - CurrentInstruction.invalidate(); - getNextInstruction(); - return llvm::ErrorSuccess(); -} - -llvm::Error FetchStage::cycleStart() { - if (!CurrentInstruction) - getNextInstruction(); - return llvm::ErrorSuccess(); -} - -llvm::Error FetchStage::cycleEnd() { - // Find the first instruction which hasn't been retired. - const InstMap::iterator It = - llvm::find_if(Instructions, [](const InstMap::value_type &KeyValuePair) { - return !KeyValuePair.second->isRetired(); - }); - - // Erase instructions up to the first that hasn't been retired. - if (It != Instructions.begin()) - Instructions.erase(Instructions.begin(), It); - - return llvm::ErrorSuccess(); -} - -} // namespace mca -} // namespace llvm Index: tools/llvm-mca/llvm-mca.cpp =================================================================== --- tools/llvm-mca/llvm-mca.cpp +++ tools/llvm-mca/llvm-mca.cpp @@ -24,7 +24,7 @@ #include "CodeRegion.h" #include "CodeRegionGenerator.h" #include "PipelinePrinter.h" -#include "Stages/FetchStage.h" +#include "Stages/EntryStage.h" #include "Stages/InstructionTables.h" #include "Views/DispatchStatistics.h" #include "Views/InstructionInfoView.h" @@ -435,7 +435,7 @@ if (PrintInstructionTables) { // Create a pipeline, stages, and a printer. auto P = llvm::make_unique(); - P->appendStage(llvm::make_unique(S)); + P->appendStage(llvm::make_unique(S)); P->appendStage(llvm::make_unique(SM)); mca::PipelinePrinter Printer(*P);