@@ -32,18 +32,15 @@ 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 == 0 || (LaneMask & UnitMask) != 0 )
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?" );
@@ -56,7 +53,6 @@ void RegScavenger::init(MachineBasicBlock &MBB) {
56
53
// Self-initialize.
57
54
if (!this ->MBB ) {
58
55
NumRegUnits = TRI->getNumRegUnits ();
59
- RegUnitsAvailable.resize (NumRegUnits);
60
56
KillRegUnits.resize (NumRegUnits);
61
57
DefRegUnits.resize (NumRegUnits);
62
58
TmpRegUnits.resize (NumRegUnits);
@@ -69,32 +65,17 @@ void RegScavenger::init(MachineBasicBlock &MBB) {
69
65
I->Restore = nullptr ;
70
66
}
71
67
72
- // All register units start out unused.
73
- RegUnitsAvailable.set ();
74
-
75
- // Pristine CSRs are not available.
76
- BitVector PR = MF.getFrameInfo ().getPristineRegs (MF);
77
- for (int I = PR.find_first (); I>0 ; I = PR.find_next (I))
78
- setRegUsed (I);
79
-
80
68
Tracking = false ;
81
69
}
82
70
83
- void RegScavenger::setLiveInsUsed (const MachineBasicBlock &MBB) {
84
- for (const auto &LI : MBB.liveins ())
85
- setRegUsed (LI.PhysReg , LI.LaneMask );
86
- }
87
-
88
71
void RegScavenger::enterBasicBlock (MachineBasicBlock &MBB) {
89
72
init (MBB);
90
- setLiveInsUsed (MBB);
73
+ LiveUnits. addLiveIns (MBB);
91
74
}
92
75
93
76
void RegScavenger::enterBasicBlockEnd (MachineBasicBlock &MBB) {
94
77
init (MBB);
95
- // Merge live-ins of successors to get live-outs.
96
- for (const MachineBasicBlock *Succ : MBB.successors ())
97
- setLiveInsUsed (*Succ);
78
+ LiveUnits.addLiveOuts (MBB);
98
79
99
80
// Move internal iterator at the last instruction of the block.
100
81
if (MBB.begin () != MBB.end ()) {
@@ -268,36 +249,7 @@ void RegScavenger::backward() {
268
249
assert (Tracking && " Must be tracking to determine kills and defs" );
269
250
270
251
const MachineInstr &MI = *MBBI;
271
- // Defined or clobbered registers are available now.
272
- for (const MachineOperand &MO : MI.operands ()) {
273
- if (MO.isRegMask ()) {
274
- for (unsigned RU = 0 , RUEnd = TRI->getNumRegUnits (); RU != RUEnd;
275
- ++RU) {
276
- for (MCRegUnitRootIterator RURI (RU, TRI); RURI.isValid (); ++RURI) {
277
- if (MO.clobbersPhysReg (*RURI)) {
278
- RegUnitsAvailable.set (RU);
279
- break ;
280
- }
281
- }
282
- }
283
- } else if (MO.isReg () && MO.isDef ()) {
284
- unsigned Reg = MO.getReg ();
285
- if (!Reg || TargetRegisterInfo::isVirtualRegister (Reg) ||
286
- isReserved (Reg))
287
- continue ;
288
- addRegUnits (RegUnitsAvailable, Reg);
289
- }
290
- }
291
- // Mark read registers as unavailable.
292
- for (const MachineOperand &MO : MI.uses ()) {
293
- if (MO.isReg () && MO.readsReg ()) {
294
- unsigned Reg = MO.getReg ();
295
- if (!Reg || TargetRegisterInfo::isVirtualRegister (Reg) ||
296
- isReserved (Reg))
297
- continue ;
298
- removeRegUnits (RegUnitsAvailable, Reg);
299
- }
300
- }
252
+ LiveUnits.stepBackward (MI);
301
253
302
254
// Expire scavenge spill frameindex uses.
303
255
for (ScavengedInfo &I : Scavenged) {
@@ -315,12 +267,9 @@ void RegScavenger::backward() {
315
267
}
316
268
317
269
bool RegScavenger::isRegUsed (unsigned Reg, bool includeReserved) const {
318
- if (includeReserved && isReserved (Reg))
319
- return true ;
320
- for (MCRegUnitIterator RUI (Reg, TRI); RUI.isValid (); ++RUI)
321
- if (!RegUnitsAvailable.test (*RUI))
322
- return true ;
323
- return false ;
270
+ if (isReserved (Reg))
271
+ return includeReserved;
272
+ return !LiveUnits.available (Reg);
324
273
}
325
274
326
275
unsigned RegScavenger::FindUnusedReg (const TargetRegisterClass *RC) const {
@@ -621,7 +570,7 @@ unsigned RegScavenger::scavengeRegisterBackwards(const TargetRegisterClass &RC,
621
570
MachineBasicBlock::iterator SpillBefore = P.second ;
622
571
ScavengedInfo &Scavenged = spill (Reg, RC, SPAdj, SpillBefore, ReloadBefore);
623
572
Scavenged.Restore = &*std::prev (SpillBefore);
624
- addRegUnits (RegUnitsAvailable, Reg);
573
+ LiveUnits. removeReg ( Reg);
625
574
DEBUG (dbgs () << " Scavenged register with spill: " << PrintReg (Reg, TRI)
626
575
<< " until " << *SpillBefore);
627
576
} else {
0 commit comments