@@ -788,14 +788,15 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
788
788
if (SinkInstsIntoCycle) {
789
789
SmallVector<MachineCycle *, 8 > Cycles (CI->toplevel_cycles ());
790
790
SchedModel.init (STI);
791
- enum CycleSinkStage { COPY, LOW_LATENCY, AGGRESSIVE, END };
792
-
793
- CycleSinkStage Stage = CycleSinkStage::COPY;
794
791
bool HasHighPressure;
795
- do {
792
+ DenseMap<std::pair<MachineInstr *, MachineBasicBlock *>, MachineInstr *>
793
+ SunkInstrs;
794
+
795
+ enum CycleSinkStage { COPY, LOW_LATENCY, AGGRESSIVE, END };
796
+ for (unsigned Stage = CycleSinkStage::COPY; Stage != CycleSinkStage::END;
797
+ ++Stage) {
796
798
HasHighPressure = false ;
797
- DenseMap<std::pair<MachineInstr *, MachineBasicBlock *>, MachineInstr *>
798
- SunkInstrs;
799
+ SunkInstrs.clear ();
799
800
for (auto *Cycle : Cycles) {
800
801
MachineBasicBlock *Preheader = Cycle->getCyclePreheader ();
801
802
if (!Preheader) {
@@ -816,7 +817,7 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
816
817
if (i++ == SinkIntoCycleLimit) {
817
818
LLVM_DEBUG (dbgs ()
818
819
<< " CycleSink: Limit reached of instructions to "
819
- " be analysed ." );
820
+ " be analyzed ." );
820
821
break ;
821
822
}
822
823
@@ -840,8 +841,9 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
840
841
if (!HasHighPressure)
841
842
HasHighPressure = registerPressureExceedsLimit (*Preheader);
842
843
}
843
- Stage = (CycleSinkStage)(Stage + 1 );
844
- } while (HasHighPressure && Stage < CycleSinkStage::END);
844
+ if (!HasHighPressure)
845
+ break ;
846
+ }
845
847
}
846
848
847
849
HasStoreCache.clear ();
@@ -1726,12 +1728,14 @@ bool MachineSinking::aggressivelySinkIntoCycle(
1726
1728
MachineInstr *NewMI = nullptr ;
1727
1729
std::pair<MachineInstr *, MachineBasicBlock *> MapEntry (&I, SinkBlock);
1728
1730
1731
+ auto SI = SunkInstrs.find (MapEntry);
1732
+
1729
1733
// Check for the case in which we have already sunk a copy of this
1730
1734
// instruction into the user block.
1731
- if (SunkInstrs.contains (MapEntry )) {
1735
+ if (SI != SunkInstrs.end ( )) {
1732
1736
LLVM_DEBUG (dbgs () << " AggressiveCycleSink: Already sunk to block: "
1733
1737
<< printMBBReference (*SinkBlock) << " \n " );
1734
- NewMI = SunkInstrs[MapEntry] ;
1738
+ NewMI = SI-> second ;
1735
1739
}
1736
1740
1737
1741
// Create a copy of the instruction in the use block.
@@ -1748,12 +1752,12 @@ bool MachineSinking::aggressivelySinkIntoCycle(
1748
1752
}
1749
1753
SinkBlock->insert (SinkBlock->SkipPHIsAndLabels (SinkBlock->begin ()),
1750
1754
NewMI);
1751
- SunkInstrs[ MapEntry] = NewMI;
1755
+ SunkInstrs. insert ({ MapEntry, NewMI}) ;
1752
1756
}
1753
1757
1754
1758
// Conservatively clear any kill flags on uses of sunk instruction
1755
- for (MachineOperand &MO : NewMI->operands ()) {
1756
- if (MO.isReg () && MO. readsReg () )
1759
+ for (MachineOperand &MO : NewMI->all_uses ()) {
1760
+ if (MO.isReg ())
1757
1761
RegsToClearKillFlags.insert (MO.getReg ());
1758
1762
}
1759
1763
0 commit comments