[InstCombine] Signed saturation tests. NFC
[llvm-complete.git] / lib / MCA / Stages / RetireStage.cpp
blobf792af748bce9cf4ea2cbc55e84c3b0b0a39a18a
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 //===----------------------------------------------------------------------===//
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"
22 namespace llvm {
23 namespace mca {
25 llvm::Error RetireStage::cycleStart() {
26 if (RCU.isEmpty())
27 return llvm::ErrorSuccess();
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++;
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 // Release the load/store queue entries.
56 if (Inst.isMemOp())
57 LSU.onInstructionRetired(IR);
59 for (const WriteState &WS : Inst.getDefs())
60 PRF.removeRegisterWrite(WS, FreedRegs);
61 notifyEvent<HWInstructionEvent>(HWInstructionRetiredEvent(IR, FreedRegs));
64 } // namespace mca
65 } // namespace llvm