@@ -211,8 +211,7 @@ void ScheduleDAGInstrs::addSchedBarrierDeps() {
211
211
for (const MachineOperand &MO : ExitMI->all_uses ()) {
212
212
Register Reg = MO.getReg ();
213
213
if (Reg.isPhysical ()) {
214
- for (MCRegUnit Unit : TRI->regunits (Reg))
215
- Uses.insert (PhysRegSUOper (&ExitSU, -1 , Unit));
214
+ Uses.insert (PhysRegSUOper (&ExitSU, -1 , Reg));
216
215
} else if (Reg.isVirtual () && MO.readsReg ()) {
217
216
addVRegUseDeps (&ExitSU, MO.getOperandNo ());
218
217
}
@@ -223,11 +222,8 @@ void ScheduleDAGInstrs::addSchedBarrierDeps() {
223
222
// uses all the registers that are livein to the successor blocks.
224
223
for (const MachineBasicBlock *Succ : BB->successors ()) {
225
224
for (const auto &LI : Succ->liveins ()) {
226
- // TODO: Use LI.LaneMask to refine this.
227
- for (MCRegUnit Unit : TRI->regunits (LI.PhysReg )) {
228
- if (!Uses.contains (Unit))
229
- Uses.insert (PhysRegSUOper (&ExitSU, -1 , Unit));
230
- }
225
+ if (!Uses.contains (LI.PhysReg ))
226
+ Uses.insert (PhysRegSUOper (&ExitSU, -1 , LI.PhysReg ));
231
227
}
232
228
}
233
229
}
@@ -248,8 +244,8 @@ void ScheduleDAGInstrs::addPhysRegDataDeps(SUnit *SU, unsigned OperIdx) {
248
244
const MCInstrDesc &DefMIDesc = SU->getInstr ()->getDesc ();
249
245
bool ImplicitPseudoDef = (OperIdx >= DefMIDesc.getNumOperands () &&
250
246
!DefMIDesc.hasImplicitDefOfPhysReg (Reg));
251
- for (MCRegUnit Unit : TRI-> regunits (Reg) ) {
252
- for (Reg2SUnitsMap::iterator I = Uses.find (Unit ); I != Uses.end (); ++I) {
247
+ for (MCRegAliasIterator Alias (Reg, TRI, true ); Alias. isValid (); ++Alias ) {
248
+ for (Reg2SUnitsMap::iterator I = Uses.find (*Alias ); I != Uses.end (); ++I) {
253
249
SUnit *UseSU = I->SU ;
254
250
if (UseSU == SU)
255
251
continue ;
@@ -266,14 +262,11 @@ void ScheduleDAGInstrs::addPhysRegDataDeps(SUnit *SU, unsigned OperIdx) {
266
262
// Set the hasPhysRegDefs only for physreg defs that have a use within
267
263
// the scheduling region.
268
264
SU->hasPhysRegDefs = true ;
269
-
270
265
UseInstr = UseSU->getInstr ();
271
- Register UseReg = UseInstr->getOperand (UseOpIdx).getReg ();
272
266
const MCInstrDesc &UseMIDesc = UseInstr->getDesc ();
273
- ImplicitPseudoUse = UseOpIdx >= ((int )UseMIDesc.getNumOperands ()) &&
274
- !UseMIDesc.hasImplicitUseOfPhysReg (UseReg);
275
-
276
- Dep = SDep (SU, SDep::Data, UseReg);
267
+ ImplicitPseudoUse = (UseOpIdx >= ((int )UseMIDesc.getNumOperands ()) &&
268
+ !UseMIDesc.hasImplicitUseOfPhysReg (*Alias));
269
+ Dep = SDep (SU, SDep::Data, *Alias);
277
270
}
278
271
if (!ImplicitPseudoDef && !ImplicitPseudoUse) {
279
272
Dep.setLatency (SchedModel.computeOperandLatency (SU->getInstr (), OperIdx,
@@ -307,16 +300,15 @@ void ScheduleDAGInstrs::addPhysRegDeps(SUnit *SU, unsigned OperIdx) {
307
300
// TODO: Using a latency of 1 here for output dependencies assumes
308
301
// there's no cost for reusing registers.
309
302
SDep::Kind Kind = MO.isUse () ? SDep::Anti : SDep::Output;
310
- for (MCRegUnit Unit : TRI-> regunits (Reg) ) {
311
- for (Reg2SUnitsMap::iterator I = Defs.find (Unit ); I != Defs.end (); ++I) {
303
+ for (MCRegAliasIterator Alias (Reg, TRI, true ); Alias. isValid (); ++Alias ) {
304
+ for (Reg2SUnitsMap::iterator I = Defs.find (*Alias ); I != Defs.end (); ++I) {
312
305
SUnit *DefSU = I->SU ;
313
306
if (DefSU == &ExitSU)
314
307
continue ;
315
308
MachineInstr *DefInstr = DefSU->getInstr ();
316
- MachineOperand &DefMO = DefInstr->getOperand (I->OpIdx );
317
- if (DefSU != SU &&
318
- (Kind != SDep::Output || !MO.isDead () || !DefMO.isDead ())) {
319
- SDep Dep (SU, Kind, DefMO.getReg ());
309
+ if (DefSU != SU && (Kind != SDep::Output || !MO.isDead () ||
310
+ !DefInstr->registerDefIsDead (*Alias))) {
311
+ SDep Dep (SU, Kind, /* Reg=*/ *Alias);
320
312
if (Kind != SDep::Anti) {
321
313
Dep.setLatency (
322
314
SchedModel.computeOutputLatency (MI, OperIdx, DefInstr));
@@ -332,42 +324,37 @@ void ScheduleDAGInstrs::addPhysRegDeps(SUnit *SU, unsigned OperIdx) {
332
324
// Either insert a new Reg2SUnits entry with an empty SUnits list, or
333
325
// retrieve the existing SUnits list for this register's uses.
334
326
// Push this SUnit on the use list.
335
- for (MCRegUnit Unit : TRI->regunits (Reg))
336
- Uses.insert (PhysRegSUOper (SU, OperIdx, Unit));
327
+ Uses.insert (PhysRegSUOper (SU, OperIdx, Reg));
337
328
if (RemoveKillFlags)
338
329
MO.setIsKill (false );
339
330
} else {
340
331
addPhysRegDataDeps (SU, OperIdx);
341
332
342
333
// Clear previous uses and defs of this register and its subregisters.
343
- for (MCRegUnit Unit : TRI->regunits (Reg)) {
344
- Uses.eraseAll (Unit );
334
+ for (MCPhysReg SubReg : TRI->subregs_inclusive (Reg)) {
335
+ Uses.eraseAll (SubReg );
345
336
if (!MO.isDead ())
346
- Defs.eraseAll (Unit );
337
+ Defs.eraseAll (SubReg );
347
338
}
348
-
349
339
if (MO.isDead () && SU->isCall ) {
350
340
// Calls will not be reordered because of chain dependencies (see
351
341
// below). Since call operands are dead, calls may continue to be added
352
342
// to the DefList making dependence checking quadratic in the size of
353
343
// the block. Instead, we leave only one call at the back of the
354
344
// DefList.
355
- for (MCRegUnit Unit : TRI->regunits (Reg)) {
356
- Reg2SUnitsMap::RangePair P = Defs.equal_range (Unit);
357
- Reg2SUnitsMap::iterator B = P.first ;
358
- Reg2SUnitsMap::iterator I = P.second ;
359
- for (bool isBegin = I == B; !isBegin; /* empty */ ) {
360
- isBegin = (--I) == B;
361
- if (!I->SU ->isCall )
362
- break ;
363
- I = Defs.erase (I);
364
- }
345
+ Reg2SUnitsMap::RangePair P = Defs.equal_range (Reg);
346
+ Reg2SUnitsMap::iterator B = P.first ;
347
+ Reg2SUnitsMap::iterator I = P.second ;
348
+ for (bool isBegin = I == B; !isBegin; /* empty */ ) {
349
+ isBegin = (--I) == B;
350
+ if (!I->SU ->isCall )
351
+ break ;
352
+ I = Defs.erase (I);
365
353
}
366
354
}
367
355
368
356
// Defs are pushed in the order they are visited and never reordered.
369
- for (MCRegUnit Unit : TRI->regunits (Reg))
370
- Defs.insert (PhysRegSUOper (SU, OperIdx, Unit));
357
+ Defs.insert (PhysRegSUOper (SU, OperIdx, Reg));
371
358
}
372
359
}
373
360
0 commit comments