@@ -199,12 +199,7 @@ namespace {
199
199
DenseMap<Register, unsigned long > LargeLIVisitCounter;
200
200
201
201
// / Recursively eliminate dead defs in DeadDefs.
202
- void eliminateDeadDefs ();
203
-
204
- // / allUsesAvailableAt - Return true if all registers used by OrigMI at
205
- // / OrigIdx are also available with the same value at UseIdx.
206
- bool allUsesAvailableAt (const MachineInstr *OrigMI, SlotIndex OrigIdx,
207
- SlotIndex UseIdx);
202
+ void eliminateDeadDefs (LiveRangeEdit *Edit = nullptr );
208
203
209
204
// / LiveRangeEdit callback for eliminateDeadDefs().
210
205
void LRE_WillEraseInstruction (MachineInstr *MI) override ;
@@ -603,20 +598,16 @@ void RegisterCoalescer::getAnalysisUsage(AnalysisUsage &AU) const {
603
598
MachineFunctionPass::getAnalysisUsage (AU);
604
599
}
605
600
606
- void RegisterCoalescer::eliminateDeadDefs () {
601
+ void RegisterCoalescer::eliminateDeadDefs (LiveRangeEdit *Edit) {
602
+ if (Edit) {
603
+ Edit->eliminateDeadDefs (DeadDefs);
604
+ return ;
605
+ }
607
606
SmallVector<Register, 8 > NewRegs;
608
607
LiveRangeEdit (nullptr , NewRegs, *MF, *LIS,
609
608
nullptr , this ).eliminateDeadDefs (DeadDefs);
610
609
}
611
610
612
- bool RegisterCoalescer::allUsesAvailableAt (const MachineInstr *OrigMI,
613
- SlotIndex OrigIdx,
614
- SlotIndex UseIdx) {
615
- SmallVector<Register, 8 > NewRegs;
616
- return LiveRangeEdit (nullptr , NewRegs, *MF, *LIS, nullptr , this )
617
- .allUsesAvailableAt (OrigMI, OrigIdx, UseIdx);
618
- }
619
-
620
611
void RegisterCoalescer::LRE_WillEraseInstruction (MachineInstr *MI) {
621
612
// MI may be in WorkList. Make sure we don't visit it.
622
613
ErasedInstrs.insert (MI);
@@ -1306,8 +1297,12 @@ bool RegisterCoalescer::reMaterializeTrivialDef(const CoalescerPair &CP,
1306
1297
}
1307
1298
if (!TII->isAsCheapAsAMove (*DefMI))
1308
1299
return false ;
1309
- if (!TII->isTriviallyReMaterializable (*DefMI))
1300
+
1301
+ SmallVector<Register, 8 > NewRegs;
1302
+ LiveRangeEdit Edit (&SrcInt, NewRegs, *MF, *LIS, nullptr , this );
1303
+ if (!Edit.checkRematerializable (ValNo, DefMI))
1310
1304
return false ;
1305
+
1311
1306
if (!definesFullReg (*DefMI, SrcReg))
1312
1307
return false ;
1313
1308
bool SawStore = false ;
@@ -1352,14 +1347,16 @@ bool RegisterCoalescer::reMaterializeTrivialDef(const CoalescerPair &CP,
1352
1347
}
1353
1348
}
1354
1349
1355
- if (!allUsesAvailableAt (DefMI, ValNo->def , CopyIdx))
1350
+ LiveRangeEdit::Remat RM (ValNo);
1351
+ RM.OrigMI = DefMI;
1352
+ if (!Edit.canRematerializeAt (RM, ValNo, CopyIdx, true ))
1356
1353
return false ;
1357
1354
1358
1355
DebugLoc DL = CopyMI->getDebugLoc ();
1359
1356
MachineBasicBlock *MBB = CopyMI->getParent ();
1360
1357
MachineBasicBlock::iterator MII =
1361
1358
std::next (MachineBasicBlock::iterator (CopyMI));
1362
- TII-> reMaterialize (*MBB, MII, DstReg, SrcIdx , *DefMI, *TRI );
1359
+ Edit. rematerializeAt (*MBB, MII, DstReg, RM , *TRI, false , SrcIdx, CopyMI );
1363
1360
MachineInstr &NewMI = *std::prev (MII);
1364
1361
NewMI.setDebugLoc (DL);
1365
1362
@@ -1403,7 +1400,6 @@ bool RegisterCoalescer::reMaterializeTrivialDef(const CoalescerPair &CP,
1403
1400
}
1404
1401
}
1405
1402
1406
- LIS->ReplaceMachineInstrInMaps (*CopyMI, NewMI);
1407
1403
CopyMI->eraseFromParent ();
1408
1404
ErasedInstrs.insert (CopyMI);
1409
1405
@@ -1597,7 +1593,7 @@ bool RegisterCoalescer::reMaterializeTrivialDef(const CoalescerPair &CP,
1597
1593
// The source interval can become smaller because we removed a use.
1598
1594
shrinkToUses (&SrcInt, &DeadDefs);
1599
1595
if (!DeadDefs.empty ())
1600
- eliminateDeadDefs ();
1596
+ eliminateDeadDefs (&Edit );
1601
1597
} else {
1602
1598
ToBeUpdated.insert (SrcReg);
1603
1599
}
0 commit comments