Skip to content

Commit 349544d

Browse files
authored
[CodeGen] Fix handling dead redefs in finalizeBundle (llvm#157427)
A dead redefinition should override any earlier non-dead definition inside a bundle. Also remove KilledDefSet since it can be folded into DeadDefSet.
1 parent 0f05f92 commit 349544d

File tree

3 files changed

+26
-10
lines changed

3 files changed

+26
-10
lines changed

llvm/lib/CodeGen/MachineInstrBundle.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ void llvm::finalizeBundle(MachineBasicBlock &MBB,
133133
SmallSetVector<Register, 32> LocalDefs;
134134
BitVector LocalDefsP(TRI->getNumRegUnits());
135135
SmallSet<Register, 8> DeadDefSet;
136-
SmallSet<Register, 16> KilledDefSet;
137136
SmallSetVector<Register, 8> ExternUses;
138137
SmallSet<Register, 8> KilledUseSet;
139138
SmallSet<Register, 8> UndefUseSet;
@@ -151,7 +150,7 @@ void llvm::finalizeBundle(MachineBasicBlock &MBB,
151150
MO.setIsInternalRead();
152151
if (MO.isKill()) {
153152
// Internal def is now killed.
154-
KilledDefSet.insert(Reg);
153+
DeadDefSet.insert(Reg);
155154
}
156155
} else {
157156
if (ExternUses.insert(Reg)) {
@@ -171,19 +170,18 @@ void llvm::finalizeBundle(MachineBasicBlock &MBB,
171170
continue;
172171

173172
if (LocalDefs.insert(Reg)) {
174-
if (MO.isDead())
175-
DeadDefSet.insert(Reg);
176-
else if (Reg.isPhysical())
173+
if (!MO.isDead() && Reg.isPhysical()) {
177174
for (MCRegUnit Unit : TRI->regunits(Reg.asMCReg()))
178175
LocalDefsP.set(Unit);
176+
}
179177
} else {
180-
// Re-defined inside the bundle, it's no longer killed.
181-
KilledDefSet.erase(Reg);
182178
if (!MO.isDead()) {
183-
// Previously defined but dead.
179+
// Re-defined inside the bundle, it's no longer dead.
184180
DeadDefSet.erase(Reg);
185181
}
186182
}
183+
if (MO.isDead())
184+
DeadDefSet.insert(Reg);
187185
}
188186

189187
// Set FrameSetup/FrameDestroy for the bundle. If any of the instructions
@@ -196,7 +194,7 @@ void llvm::finalizeBundle(MachineBasicBlock &MBB,
196194

197195
for (Register Reg : LocalDefs) {
198196
// If it's not live beyond end of the bundle, mark it dead.
199-
bool isDead = DeadDefSet.contains(Reg) || KilledDefSet.contains(Reg);
197+
bool isDead = DeadDefSet.contains(Reg);
200198
MIB.addReg(Reg, getDefRegState(true) | getDeadRegState(isDead) |
201199
getImplRegState(true));
202200
}

llvm/test/CodeGen/AArch64/blr-bti-preserves-operands.mir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
# The arguments to the call must become implicit arguments, because the branch
99
# only expects to get 1 explicit operand which is the branch target.
1010

11-
# CHECK: BUNDLE implicit-def $lr, implicit-def $sp, implicit $sp, implicit $x0, implicit $w1 {
11+
# CHECK: BUNDLE implicit-def dead $lr, implicit-def $sp, implicit $sp, implicit $x0, implicit $w1 {
1212
# CHECK: BL @_setjmp, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $x0, implicit $w1, implicit-def dead $lr, implicit $sp, implicit-def $sp
1313
# CHECK: HINT 36
1414
# CHECK: }

llvm/test/CodeGen/AMDGPU/finalizebundle.mir

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,21 @@ body: |
1616
$vgpr2_vgpr3 = V_LSHLREV_B64_pseudo_e32 1, $vgpr0_vgpr1, implicit $exec
1717
$vgpr3_vgpr4 = V_LSHLREV_B64_pseudo_e32 1, $vgpr1_vgpr2, implicit $exec
1818
...
19+
20+
---
21+
name: test_dead_redef
22+
body: |
23+
bb.0:
24+
liveins: $vgpr0
25+
; CHECK-LABEL: name: test_dead_redef
26+
; CHECK: liveins: $vgpr0
27+
; CHECK-NEXT: {{ $}}
28+
; CHECK-NEXT: BUNDLE implicit-def dead $vgpr1, implicit-def $vgpr0, implicit $vgpr0, implicit $exec {
29+
; CHECK-NEXT: $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
30+
; CHECK-NEXT: $vgpr0 = V_MOV_B32_e32 internal $vgpr1, implicit $exec
31+
; CHECK-NEXT: dead $vgpr1 = V_MOV_B32_e32 internal $vgpr0, implicit $exec
32+
; CHECK-NEXT: }
33+
$vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
34+
$vgpr0 = V_MOV_B32_e32 $vgpr1, implicit $exec
35+
dead $vgpr1 = V_MOV_B32_e32 $vgpr0, implicit $exec
36+
...

0 commit comments

Comments
 (0)