Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Summary: This class maintains the same logic as the original RetireControlUnit. This is just an intermediate patch to make the RCU a Stage. Future patches will remove the dependency on the DispatchStage, and then more properly populate the pre/execute/post Stage interface. Reviewers: andreadb, RKSimon, courbet Reviewed By: andreadb, courbet Subscribers: javed.absar, mgorny, tschuett, gbedwell, llvm-commits Differential Revision: https://reviews.llvm.org/D47244 llvm-svn: 333292
- Loading branch information
Matt Davis
authored and
Matt Davis
committed
May 25, 2018
1 parent
cb48efd
commit 5b79ffc
Showing
11 changed files
with
175 additions
and
82 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
//===---------------------- RetireStage.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 retire stage of an instruction pipeline. | ||
/// The RetireStage represents the process logic that interacts with the | ||
/// simulated RetireControlUnit hardware. | ||
/// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "RetireStage.h" | ||
#include "Backend.h" | ||
#include "HWEventListener.h" | ||
#include "llvm/Support/Debug.h" | ||
|
||
using namespace llvm; | ||
|
||
#define DEBUG_TYPE "llvm-mca" | ||
|
||
namespace mca { | ||
|
||
void RetireStage::preExecute(const InstRef &IR) { | ||
if (RCU.isEmpty()) | ||
return; | ||
|
||
const unsigned MaxRetirePerCycle = RCU.getMaxRetirePerCycle(); | ||
unsigned NumRetired = 0; | ||
while (!RCU.isEmpty()) { | ||
if (MaxRetirePerCycle != 0 && NumRetired == MaxRetirePerCycle) | ||
break; | ||
const RetireControlUnit::RUToken &Current = RCU.peekCurrentToken(); | ||
if (!Current.Executed) | ||
break; | ||
RCU.consumeCurrentToken(); | ||
notifyInstructionRetired(Current.IR); | ||
NumRetired++; | ||
} | ||
} | ||
|
||
void RetireStage::notifyInstructionRetired(const InstRef &IR) { | ||
LLVM_DEBUG(dbgs() << "[E] Instruction Retired: " << IR << '\n'); | ||
SmallVector<unsigned, 4> FreedRegs(PRF.getNumRegisterFiles()); | ||
const InstrDesc &Desc = IR.getInstruction()->getDesc(); | ||
|
||
for (const std::unique_ptr<WriteState> &WS : IR.getInstruction()->getDefs()) | ||
PRF.removeRegisterWrite(*WS.get(), FreedRegs, !Desc.isZeroLatency()); | ||
Owner->notifyInstructionEvent(HWInstructionRetiredEvent(IR, FreedRegs)); | ||
} | ||
|
||
} // namespace mca |
Oops, something went wrong.