File indexing completed on 2026-05-10 08:43:34
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #ifndef LLVM_CODEGEN_REGISTERSCAVENGING_H
0018 #define LLVM_CODEGEN_REGISTERSCAVENGING_H
0019
0020 #include "llvm/ADT/BitVector.h"
0021 #include "llvm/ADT/SmallVector.h"
0022 #include "llvm/CodeGen/LiveRegUnits.h"
0023 #include "llvm/CodeGen/MachineBasicBlock.h"
0024 #include "llvm/CodeGen/MachineRegisterInfo.h"
0025 #include "llvm/MC/LaneBitmask.h"
0026
0027 namespace llvm {
0028
0029 class MachineInstr;
0030 class TargetInstrInfo;
0031 class TargetRegisterClass;
0032 class TargetRegisterInfo;
0033
0034 class RegScavenger {
0035 const TargetRegisterInfo *TRI = nullptr;
0036 const TargetInstrInfo *TII = nullptr;
0037 MachineRegisterInfo *MRI = nullptr;
0038 MachineBasicBlock *MBB = nullptr;
0039 MachineBasicBlock::iterator MBBI;
0040
0041
0042 struct ScavengedInfo {
0043 ScavengedInfo(int FI = -1) : FrameIndex(FI) {}
0044
0045
0046 int FrameIndex;
0047
0048
0049
0050 Register Reg;
0051
0052
0053 const MachineInstr *Restore = nullptr;
0054 };
0055
0056
0057 SmallVector<ScavengedInfo, 2> Scavenged;
0058
0059 LiveRegUnits LiveUnits;
0060
0061 public:
0062 RegScavenger() = default;
0063
0064
0065
0066
0067
0068
0069
0070 void assignRegToScavengingIndex(int FI, Register Reg,
0071 MachineInstr *Restore = nullptr) {
0072 for (ScavengedInfo &Slot : Scavenged) {
0073 if (Slot.FrameIndex == FI) {
0074 assert(!Slot.Reg || Slot.Reg == Reg);
0075 Slot.Reg = Reg;
0076 Slot.Restore = Restore;
0077 return;
0078 }
0079 }
0080
0081 llvm_unreachable("did not find scavenging index");
0082 }
0083
0084
0085 void enterBasicBlock(MachineBasicBlock &MBB);
0086
0087
0088
0089 void enterBasicBlockEnd(MachineBasicBlock &MBB);
0090
0091
0092
0093 void backward();
0094
0095
0096 void backward(MachineBasicBlock::iterator I) {
0097 while (MBBI != I)
0098 backward();
0099 }
0100
0101
0102 bool isRegUsed(Register Reg, bool includeReserved = true) const;
0103
0104
0105 BitVector getRegsAvailable(const TargetRegisterClass *RC);
0106
0107
0108
0109 Register FindUnusedReg(const TargetRegisterClass *RC) const;
0110
0111
0112 void addScavengingFrameIndex(int FI) {
0113 Scavenged.push_back(ScavengedInfo(FI));
0114 }
0115
0116
0117 bool isScavengingFrameIndex(int FI) const {
0118 for (const ScavengedInfo &SI : Scavenged)
0119 if (SI.FrameIndex == FI)
0120 return true;
0121
0122 return false;
0123 }
0124
0125
0126 void getScavengingFrameIndices(SmallVectorImpl<int> &A) const {
0127 for (const ScavengedInfo &I : Scavenged)
0128 if (I.FrameIndex >= 0)
0129 A.push_back(I.FrameIndex);
0130 }
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141 Register scavengeRegisterBackwards(const TargetRegisterClass &RC,
0142 MachineBasicBlock::iterator To,
0143 bool RestoreAfter, int SPAdj,
0144 bool AllowSpill = true);
0145
0146
0147 void setRegUsed(Register Reg, LaneBitmask LaneMask = LaneBitmask::getAll());
0148
0149 private:
0150
0151 bool isReserved(Register Reg) const { return MRI->isReserved(Reg); }
0152
0153
0154 void init(MachineBasicBlock &MBB);
0155
0156
0157
0158 ScavengedInfo &spill(Register Reg, const TargetRegisterClass &RC, int SPAdj,
0159 MachineBasicBlock::iterator Before,
0160 MachineBasicBlock::iterator &UseMI);
0161 };
0162
0163
0164
0165 void scavengeFrameVirtualRegs(MachineFunction &MF, RegScavenger &RS);
0166
0167 }
0168
0169 #endif