RetireStage.cpp revision 360784
1//===---------------------- RetireStage.cpp ---------------------*- C++ -*-===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8/// \file
9///
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.
13///
14//===----------------------------------------------------------------------===//
15
16#include "llvm/MCA/Stages/RetireStage.h"
17#include "llvm/MCA/HWEventListener.h"
18#include "llvm/Support/Debug.h"
19
20#define DEBUG_TYPE "llvm-mca"
21
22namespace llvm {
23namespace mca {
24
25llvm::Error RetireStage::cycleStart() {
26  if (RCU.isEmpty())
27    return llvm::ErrorSuccess();
28
29  const unsigned MaxRetirePerCycle = RCU.getMaxRetirePerCycle();
30  unsigned NumRetired = 0;
31  while (!RCU.isEmpty()) {
32    if (MaxRetirePerCycle != 0 && NumRetired == MaxRetirePerCycle)
33      break;
34    const RetireControlUnit::RUToken &Current = RCU.getCurrentToken();
35    if (!Current.Executed)
36      break;
37    notifyInstructionRetired(Current.IR);
38    RCU.consumeCurrentToken();
39    NumRetired++;
40  }
41
42  return llvm::ErrorSuccess();
43}
44
45llvm::Error RetireStage::execute(InstRef &IR) {
46  RCU.onInstructionExecuted(IR.getInstruction()->getRCUTokenID());
47  return llvm::ErrorSuccess();
48}
49
50void 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();
54
55  // Release the load/store queue entries.
56  if (Inst.isMemOp())
57    LSU.onInstructionRetired(IR);
58
59  for (const WriteState &WS : Inst.getDefs())
60    PRF.removeRegisterWrite(WS, FreedRegs);
61  notifyEvent<HWInstructionEvent>(HWInstructionRetiredEvent(IR, FreedRegs));
62}
63
64} // namespace mca
65} // namespace llvm
66