@@ -32,26 +32,22 @@ using namespace llvm;
32
32
#define DEBUG_TYPE " reg-scavenging"
33
33
34
34
void RegScavenger::setRegUsed (unsigned Reg, LaneBitmask LaneMask) {
35
- for (MCRegUnitMaskIterator RUI (Reg, TRI); RUI.isValid (); ++RUI) {
36
- LaneBitmask UnitMask = (*RUI).second ;
37
- if (UnitMask.none () || (LaneMask & UnitMask).any ())
38
- RegUnitsAvailable.reset ((*RUI).first );
39
- }
35
+ LiveUnits.addRegMasked (Reg, LaneMask);
40
36
}
41
37
42
38
void RegScavenger::init (MachineBasicBlock &MBB) {
43
39
MachineFunction &MF = *MBB.getParent ();
44
40
TII = MF.getSubtarget ().getInstrInfo ();
45
41
TRI = MF.getSubtarget ().getRegisterInfo ();
46
42
MRI = &MF.getRegInfo ();
43
+ LiveUnits.init (*TRI);
47
44
48
45
assert ((NumRegUnits == 0 || NumRegUnits == TRI->getNumRegUnits ()) &&
49
46
" Target changed?" );
50
47
51
48
// Self-initialize.
52
49
if (!this ->MBB ) {
53
50
NumRegUnits = TRI->getNumRegUnits ();
54
- RegUnitsAvailable.resize (NumRegUnits);
55
51
KillRegUnits.resize (NumRegUnits);
56
52
DefRegUnits.resize (NumRegUnits);
57
53
TmpRegUnits.resize (NumRegUnits);
@@ -64,32 +60,17 @@ void RegScavenger::init(MachineBasicBlock &MBB) {
64
60
I->Restore = nullptr ;
65
61
}
66
62
67
- // All register units start out unused.
68
- RegUnitsAvailable.set ();
69
-
70
- // Pristine CSRs are not available.
71
- BitVector PR = MF.getFrameInfo ().getPristineRegs (MF);
72
- for (int I = PR.find_first (); I>0 ; I = PR.find_next (I))
73
- setRegUsed (I);
74
-
75
63
Tracking = false ;
76
64
}
77
65
78
- void RegScavenger::setLiveInsUsed (const MachineBasicBlock &MBB) {
79
- for (const auto &LI : MBB.liveins ())
80
- setRegUsed (LI.PhysReg , LI.LaneMask );
81
- }
82
-
83
66
void RegScavenger::enterBasicBlock (MachineBasicBlock &MBB) {
84
67
init (MBB);
85
- setLiveInsUsed (MBB);
68
+ LiveUnits. addLiveIns (MBB);
86
69
}
87
70
88
71
void RegScavenger::enterBasicBlockEnd (MachineBasicBlock &MBB) {
89
72
init (MBB);
90
- // Merge live-ins of successors to get live-outs.
91
- for (const MachineBasicBlock *Succ : MBB.successors ())
92
- setLiveInsUsed (*Succ);
73
+ LiveUnits.addLiveOuts (MBB);
93
74
94
75
// Move internal iterator at the last instruction of the block.
95
76
if (MBB.begin () != MBB.end ()) {
@@ -263,36 +244,7 @@ void RegScavenger::backward() {
263
244
assert (Tracking && " Must be tracking to determine kills and defs" );
264
245
265
246
const MachineInstr &MI = *MBBI;
266
- // Defined or clobbered registers are available now.
267
- for (const MachineOperand &MO : MI.operands ()) {
268
- if (MO.isRegMask ()) {
269
- for (unsigned RU = 0 , RUEnd = TRI->getNumRegUnits (); RU != RUEnd;
270
- ++RU) {
271
- for (MCRegUnitRootIterator RURI (RU, TRI); RURI.isValid (); ++RURI) {
272
- if (MO.clobbersPhysReg (*RURI)) {
273
- RegUnitsAvailable.set (RU);
274
- break ;
275
- }
276
- }
277
- }
278
- } else if (MO.isReg () && MO.isDef ()) {
279
- unsigned Reg = MO.getReg ();
280
- if (!Reg || TargetRegisterInfo::isVirtualRegister (Reg) ||
281
- isReserved (Reg))
282
- continue ;
283
- addRegUnits (RegUnitsAvailable, Reg);
284
- }
285
- }
286
- // Mark read registers as unavailable.
287
- for (const MachineOperand &MO : MI.uses ()) {
288
- if (MO.isReg () && MO.readsReg ()) {
289
- unsigned Reg = MO.getReg ();
290
- if (!Reg || TargetRegisterInfo::isVirtualRegister (Reg) ||
291
- isReserved (Reg))
292
- continue ;
293
- removeRegUnits (RegUnitsAvailable, Reg);
294
- }
295
- }
247
+ LiveUnits.stepBackward (MI);
296
248
297
249
if (MBBI == MBB->begin ()) {
298
250
MBBI = MachineBasicBlock::iterator (nullptr );
@@ -302,12 +254,9 @@ void RegScavenger::backward() {
302
254
}
303
255
304
256
bool RegScavenger::isRegUsed (unsigned Reg, bool includeReserved) const {
305
- if (includeReserved && isReserved (Reg))
306
- return true ;
307
- for (MCRegUnitIterator RUI (Reg, TRI); RUI.isValid (); ++RUI)
308
- if (!RegUnitsAvailable.test (*RUI))
309
- return true ;
310
- return false ;
257
+ if (isReserved (Reg))
258
+ return includeReserved;
259
+ return !LiveUnits.available (Reg);
311
260
}
312
261
313
262
unsigned RegScavenger::FindUnusedReg (const TargetRegisterClass *RC) const {
0 commit comments