@@ -48,17 +48,17 @@ class MachineLateInstrsCleanup {
4848 return MI && MI->isIdenticalTo (*ArgMI);
4949 }
5050 };
51-
51+ typedef SmallDenseMap<Register, TinyPtrVector<MachineInstr *>> Reg2MIVecMap;
5252 std::vector<Reg2MIMap> RegDefs;
53- std::vector<Reg2MIMap > RegKills;
53+ std::vector<Reg2MIVecMap > RegKills;
5454
5555 // Walk through the instructions in MBB and remove any redundant
5656 // instructions.
5757 bool processBlock (MachineBasicBlock *MBB);
5858
5959 void removeRedundantDef (MachineInstr *MI);
6060 void clearKillsForDef (Register Reg, MachineBasicBlock *MBB,
61- BitVector &VisitedPreds);
61+ BitVector &VisitedPreds, MachineInstr *ToRemoveMI );
6262
6363public:
6464 bool run (MachineFunction &MF);
@@ -135,33 +135,39 @@ bool MachineLateInstrsCleanup::run(MachineFunction &MF) {
135135// definition.
136136void MachineLateInstrsCleanup::clearKillsForDef (Register Reg,
137137 MachineBasicBlock *MBB,
138- BitVector &VisitedPreds) {
138+ BitVector &VisitedPreds,
139+ MachineInstr *ToRemoveMI) {
139140 VisitedPreds.set (MBB->getNumber ());
140141
141- // Kill flag in MBB
142- if (MachineInstr *KillMI = RegKills[MBB->getNumber ()].lookup (Reg)) {
143- KillMI->clearRegisterKills (Reg, TRI);
144- return ;
145- }
142+ // Clear kill flag(s) in MBB, that have been seen after the preceding
143+ // definition. If Reg or one of its subregs was killed, it would actually
144+ // be ok to stop after removing that (and any other) kill-flag, but it
145+ // doesn't seem noticeably faster while it would be a bit more complicated.
146+ Reg2MIVecMap &MBBKills = RegKills[MBB->getNumber ()];
147+ if (MBBKills.contains (Reg))
148+ for (auto *KillMI : MBBKills[Reg])
149+ KillMI->clearRegisterKills (Reg, TRI);
146150
147- // Def in MBB (missing kill flag)
148- if (MachineInstr *DefMI = RegDefs[MBB->getNumber ()].lookup (Reg))
149- if (DefMI->getParent () == MBB)
150- return ;
151+ // Definition in current MBB: done.
152+ Reg2MIMap &MBBDefs = RegDefs[MBB->getNumber ()];
153+ MachineInstr *DefMI = MBBDefs[Reg];
154+ assert (DefMI->isIdenticalTo (*ToRemoveMI) && " Previous def not identical?" );
155+ if (DefMI->getParent () == MBB)
156+ return ;
151157
152158 // If an earlier def is not in MBB, continue in predecessors.
153159 if (!MBB->isLiveIn (Reg))
154160 MBB->addLiveIn (Reg);
155161 assert (!MBB->pred_empty () && " Predecessor def not found!" );
156162 for (MachineBasicBlock *Pred : MBB->predecessors ())
157163 if (!VisitedPreds.test (Pred->getNumber ()))
158- clearKillsForDef (Reg, Pred, VisitedPreds);
164+ clearKillsForDef (Reg, Pred, VisitedPreds, ToRemoveMI );
159165}
160166
161167void MachineLateInstrsCleanup::removeRedundantDef (MachineInstr *MI) {
162168 Register Reg = MI->getOperand (0 ).getReg ();
163169 BitVector VisitedPreds (MI->getMF ()->getNumBlockIDs ());
164- clearKillsForDef (Reg, MI->getParent (), VisitedPreds);
170+ clearKillsForDef (Reg, MI->getParent (), VisitedPreds, MI );
165171 MI->eraseFromParent ();
166172 ++NumRemoved;
167173}
@@ -197,7 +203,7 @@ static bool isCandidate(const MachineInstr *MI, Register &DefedReg,
197203bool MachineLateInstrsCleanup::processBlock (MachineBasicBlock *MBB) {
198204 bool Changed = false ;
199205 Reg2MIMap &MBBDefs = RegDefs[MBB->getNumber ()];
200- Reg2MIMap &MBBKills = RegKills[MBB->getNumber ()];
206+ Reg2MIVecMap &MBBKills = RegKills[MBB->getNumber ()];
201207
202208 // Find reusable definitions in the predecessor(s).
203209 if (!MBB->pred_empty () && !MBB->isEHPad () &&
@@ -247,8 +253,8 @@ bool MachineLateInstrsCleanup::processBlock(MachineBasicBlock *MBB) {
247253 MBBDefs.erase (Reg);
248254 MBBKills.erase (Reg);
249255 } else if (MI.findRegisterUseOperandIdx (Reg, TRI, true /* isKill*/ ) != -1 )
250- // Keep track of register kills.
251- MBBKills[Reg] = &MI;
256+ // Keep track of all instructions that fully or partially kills Reg .
257+ MBBKills[Reg]. push_back ( &MI) ;
252258 }
253259
254260 // Record this MI for potential later reuse.
0 commit comments