Skip to content

Commit 138859d

Browse files
committed
Handle multiple kills for a preceding definition.
1 parent 0bb7bd4 commit 138859d

File tree

2 files changed

+76
-18
lines changed

2 files changed

+76
-18
lines changed

llvm/lib/CodeGen/MachineLateInstrsCleanup.cpp

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

6262
public:
6363
static char ID; // Pass identification, replacement for typeid
@@ -113,33 +113,39 @@ bool MachineLateInstrsCleanup::runOnMachineFunction(MachineFunction &MF) {
113113
// definition.
114114
void 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

139145
void 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,
175181
bool 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.
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# RUN: llc -mtriple=s390x-linux-gnu -run-pass=machine-latecleanup %s -o - -mcpu=z16 \
2+
# RUN: -verify-machineinstrs 2>&1 | FileCheck %s
3+
4+
# Kill flag of $r0q (super-reg) needs to be removed, and $r0l needs to be added as live-in.
5+
# CHECK-LABEL: name: fun0
6+
# CHECK-LABEL: bb.0:
7+
# CHECK: renamable $r0l = LHIMux -1
8+
# CHECK-NEXT: J %bb.1
9+
# CHECK-LABEL: bb.1:
10+
# CHECK-NEXT: liveins: $r0l
11+
# CHECK: renamable $r1d = LGFI 0
12+
# CHECK-NEXT: ST128 renamable $r0q, $r15d, 168, $noreg
13+
# CHECK-NEXT: ST killed renamable $r0l, $r15d, 160, $noreg
14+
# CHECK-NEXT: Return
15+
---
16+
name: fun0
17+
tracksRegLiveness: true
18+
body: |
19+
bb.0:
20+
renamable $r0l = LHIMux -1
21+
J %bb.1
22+
23+
bb.1:
24+
renamable $r1d = LGFI 0
25+
ST128 killed renamable $r0q, $r15d, 168, $noreg
26+
renamable $r0l = LHIMux -1
27+
ST killed renamable $r0l, $r15d, 160, $noreg
28+
Return
29+
...
30+
31+
# Kill flags of both $r1d and $r0q (super-reg) need to be removed.
32+
# CHECK-LABEL: name: fun1
33+
# CHECK-LABEL: bb.0:
34+
# CHECK-NEXT: renamable $r1d = LLILL 1
35+
# CHECK-NEXT: STG renamable $r1d, killed $r15d, 8, $noreg
36+
# CHECK-NEXT: renamable $r0d = LLILL 0
37+
# CHECK-NEXT: ST128 renamable $r0q, $r15d, 0, $noreg
38+
# CHECK-NEXT: STG killed renamable $r1d, killed $r15d, 8, $noreg
39+
# CHECK-NEXT: Return
40+
---
41+
name: fun1
42+
tracksRegLiveness: true
43+
body: |
44+
bb.0:
45+
renamable $r1d = LLILL 1
46+
STG killed renamable $r1d, killed $r15d, 8, $noreg
47+
renamable $r0d = LLILL 0
48+
ST128 killed renamable $r0q, $r15d, 0, $noreg
49+
renamable $r1d = LLILL 1
50+
STG killed renamable $r1d, killed $r15d, 8, $noreg
51+
Return
52+
...

0 commit comments

Comments
 (0)