1 //===---------------------- RetireStage.cpp ---------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 /// This file defines the retire stage of an instruction pipeline.
11 /// The RetireStage represents the process logic that interacts with the
12 /// simulated RetireControlUnit hardware.
14 //===----------------------------------------------------------------------===//
16 #include "llvm/MCA/Stages/RetireStage.h"
17 #include "llvm/MCA/HWEventListener.h"
18 #include "llvm/Support/Debug.h"
20 #define DEBUG_TYPE "llvm-mca"
25 llvm::Error
RetireStage::cycleStart() {
27 return llvm::ErrorSuccess();
29 const unsigned MaxRetirePerCycle
= RCU
.getMaxRetirePerCycle();
30 unsigned NumRetired
= 0;
31 while (!RCU
.isEmpty()) {
32 if (MaxRetirePerCycle
!= 0 && NumRetired
== MaxRetirePerCycle
)
34 const RetireControlUnit::RUToken
&Current
= RCU
.getCurrentToken();
35 if (!Current
.Executed
)
37 notifyInstructionRetired(Current
.IR
);
38 RCU
.consumeCurrentToken();
42 return llvm::ErrorSuccess();
45 llvm::Error
RetireStage::execute(InstRef
&IR
) {
46 RCU
.onInstructionExecuted(IR
.getInstruction()->getRCUTokenID());
47 return llvm::ErrorSuccess();
50 void RetireStage::notifyInstructionRetired(const InstRef
&IR
) const {
51 LLVM_DEBUG(llvm::dbgs() << "[E] Instruction Retired: #" << IR
<< '\n');
52 llvm::SmallVector
<unsigned, 4> FreedRegs(PRF
.getNumRegisterFiles());
53 const Instruction
&Inst
= *IR
.getInstruction();
55 for (const WriteState
&WS
: Inst
.getDefs())
56 PRF
.removeRegisterWrite(WS
, FreedRegs
);
57 notifyEvent
<HWInstructionEvent
>(HWInstructionRetiredEvent(IR
, FreedRegs
));