@@ -47,17 +47,17 @@ class MachineLateInstrsCleanup : public MachineFunctionPass {
4747 return MI && MI->isIdenticalTo (*ArgMI);
4848 }
4949 };
50-
50+ typedef SmallDenseMap<Register, TinyPtrVector<MachineInstr *>> Reg2MIVecMap;
5151 std::vector<Reg2MIMap> RegDefs;
52- std::vector<Reg2MIMap > RegKills;
52+ std::vector<Reg2MIVecMap > RegKills;
5353
5454 // Walk through the instructions in MBB and remove any redundant
5555 // instructions.
5656 bool processBlock (MachineBasicBlock *MBB);
5757
5858 void removeRedundantDef (MachineInstr *MI);
5959 void clearKillsForDef (Register Reg, MachineBasicBlock *MBB,
60- BitVector &VisitedPreds);
60+ BitVector &VisitedPreds, MachineInstr *ToRemoveMI );
6161
6262public:
6363 static char ID; // Pass identification, replacement for typeid
@@ -113,33 +113,39 @@ bool MachineLateInstrsCleanup::runOnMachineFunction(MachineFunction &MF) {
113113// definition.
114114void MachineLateInstrsCleanup::clearKillsForDef (Register Reg,
115115 MachineBasicBlock *MBB,
116- BitVector &VisitedPreds) {
116+ BitVector &VisitedPreds,
117+ MachineInstr *ToRemoveMI) {
117118 VisitedPreds.set (MBB->getNumber ());
118119
119- // Kill flag in MBB
120- if (MachineInstr *KillMI = RegKills[MBB->getNumber ()].lookup (Reg)) {
121- KillMI->clearRegisterKills (Reg, TRI);
122- return ;
123- }
120+ // Clear kill flag(s) in MBB, that have been seen after the preceding
121+ // definition. If Reg or one of its subregs was killed, it would actually
122+ // be ok to stop after removing that (and any other) kill-flag, but it
123+ // doesn't seem noticeably faster while it would be a bit more complicated.
124+ Reg2MIVecMap &MBBKills = RegKills[MBB->getNumber ()];
125+ if (MBBKills.contains (Reg))
126+ for (auto *KillMI : MBBKills[Reg])
127+ KillMI->clearRegisterKills (Reg, TRI);
124128
125- // Def in MBB (missing kill flag)
126- if (MachineInstr *DefMI = RegDefs[MBB->getNumber ()].lookup (Reg))
127- if (DefMI->getParent () == MBB)
128- return ;
129+ // Definition in current MBB: done.
130+ Reg2MIMap &MBBDefs = RegDefs[MBB->getNumber ()];
131+ MachineInstr *DefMI = MBBDefs[Reg];
132+ assert (DefMI->isIdenticalTo (*ToRemoveMI) && " Previous def not identical?" );
133+ if (DefMI->getParent () == MBB)
134+ return ;
129135
130136 // If an earlier def is not in MBB, continue in predecessors.
131137 if (!MBB->isLiveIn (Reg))
132138 MBB->addLiveIn (Reg);
133139 assert (!MBB->pred_empty () && " Predecessor def not found!" );
134140 for (MachineBasicBlock *Pred : MBB->predecessors ())
135141 if (!VisitedPreds.test (Pred->getNumber ()))
136- clearKillsForDef (Reg, Pred, VisitedPreds);
142+ clearKillsForDef (Reg, Pred, VisitedPreds, ToRemoveMI );
137143}
138144
139145void MachineLateInstrsCleanup::removeRedundantDef (MachineInstr *MI) {
140146 Register Reg = MI->getOperand (0 ).getReg ();
141147 BitVector VisitedPreds (MI->getMF ()->getNumBlockIDs ());
142- clearKillsForDef (Reg, MI->getParent (), VisitedPreds);
148+ clearKillsForDef (Reg, MI->getParent (), VisitedPreds, MI );
143149 MI->eraseFromParent ();
144150 ++NumRemoved;
145151}
@@ -175,7 +181,7 @@ static bool isCandidate(const MachineInstr *MI, Register &DefedReg,
175181bool MachineLateInstrsCleanup::processBlock (MachineBasicBlock *MBB) {
176182 bool Changed = false ;
177183 Reg2MIMap &MBBDefs = RegDefs[MBB->getNumber ()];
178- Reg2MIMap &MBBKills = RegKills[MBB->getNumber ()];
184+ Reg2MIVecMap &MBBKills = RegKills[MBB->getNumber ()];
179185
180186 // Find reusable definitions in the predecessor(s).
181187 if (!MBB->pred_empty () && !MBB->isEHPad () &&
@@ -225,8 +231,8 @@ bool MachineLateInstrsCleanup::processBlock(MachineBasicBlock *MBB) {
225231 MBBDefs.erase (Reg);
226232 MBBKills.erase (Reg);
227233 } else if (MI.findRegisterUseOperandIdx (Reg, TRI, true /* isKill*/ ) != -1 )
228- // Keep track of register kills.
229- MBBKills[Reg] = &MI;
234+ // Keep track of all instructions that fully or partially kills Reg .
235+ MBBKills[Reg]. push_back ( &MI) ;
230236 }
231237
232238 // Record this MI for potential later reuse.
0 commit comments