Skip to content

Commit 00254d3

Browse files
committed
[RegisterCoalescer] Deferring deletion of instructions in ErasedInstrs until the end of an iteration
1 parent 646c95f commit 00254d3

File tree

2 files changed

+97
-6
lines changed

2 files changed

+97
-6
lines changed

llvm/lib/CodeGen/RegisterCoalescer.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,8 @@ namespace {
236236
/// was successfully coalesced away. If it is not currently possible to
237237
/// coalesce this interval, but it may be possible if other things get
238238
/// coalesced, then it returns true by reference in 'Again'.
239-
bool joinCopy(MachineInstr *CopyMI, bool &Again);
239+
bool joinCopy(MachineInstr *CopyMI, bool &Again,
240+
SmallPtrSetImpl<MachineInstr *> &CurrentErasedInstrs);
240241

241242
/// Attempt to join these two intervals. On failure, this
242243
/// returns false. The output "SrcInt" will not have been modified, so we
@@ -1964,7 +1965,9 @@ void RegisterCoalescer::setUndefOnPrunedSubRegUses(LiveInterval &LI,
19641965
LIS->shrinkToUses(&LI);
19651966
}
19661967

1967-
bool RegisterCoalescer::joinCopy(MachineInstr *CopyMI, bool &Again) {
1968+
bool RegisterCoalescer::joinCopy(
1969+
MachineInstr *CopyMI, bool &Again,
1970+
SmallPtrSetImpl<MachineInstr *> &CurrentErasedInstrs) {
19681971
Again = false;
19691972
LLVM_DEBUG(dbgs() << LIS->getInstructionIndex(*CopyMI) << '\t' << *CopyMI);
19701973

@@ -2156,7 +2159,9 @@ bool RegisterCoalescer::joinCopy(MachineInstr *CopyMI, bool &Again) {
21562159
// CopyMI has been erased by joinIntervals at this point. Remove it from
21572160
// ErasedInstrs since copyCoalesceWorkList() won't add a successful join back
21582161
// to the work list. This keeps ErasedInstrs from growing needlessly.
2159-
ErasedInstrs.erase(CopyMI);
2162+
if (ErasedInstrs.erase(CopyMI))
2163+
// But we may encounter the instruction again in this iteration.
2164+
CurrentErasedInstrs.insert(CopyMI);
21602165

21612166
// Rewrite all SrcReg operands to DstReg.
21622167
// Also update DstReg operands to include DstIdx if it is set.
@@ -3982,17 +3987,18 @@ void RegisterCoalescer::lateLiveIntervalUpdate() {
39823987
bool RegisterCoalescer::
39833988
copyCoalesceWorkList(MutableArrayRef<MachineInstr*> CurrList) {
39843989
bool Progress = false;
3990+
SmallPtrSet<MachineInstr *, 4> CurrentErasedInstrs;
39853991
for (MachineInstr *&MI : CurrList) {
39863992
if (!MI)
39873993
continue;
39883994
// Skip instruction pointers that have already been erased, for example by
39893995
// dead code elimination.
3990-
if (ErasedInstrs.count(MI)) {
3996+
if (ErasedInstrs.count(MI) || CurrentErasedInstrs.count(MI)) {
39913997
MI = nullptr;
39923998
continue;
39933999
}
39944000
bool Again = false;
3995-
bool Success = joinCopy(MI, Again);
4001+
bool Success = joinCopy(MI, Again, CurrentErasedInstrs);
39964002
Progress |= Success;
39974003
if (Success || !Again)
39984004
MI = nullptr;

llvm/test/CodeGen/LoongArch/register-coalescer-crash-pr79718.mir

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,96 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4
22
# RUN: llc -o - %s -mtriple=loongarch64 \
3-
# RUN: -run-pass=register-coalescer -join-liveintervals=1 -join-splitedges=0 2>&1 | FileCheck %s
3+
# RUN: -run-pass=register-coalescer -join-liveintervals=1 -join-splitedges=0 | FileCheck %s
44

55
---
66
name: foo
77
tracksRegLiveness: true
88
body: |
9+
; CHECK-LABEL: name: foo
10+
; CHECK: bb.0:
11+
; CHECK-NEXT: successors: %bb.1(0x80000000)
12+
; CHECK-NEXT: liveins: $r4, $r5, $r6, $r7, $r8
13+
; CHECK-NEXT: {{ $}}
14+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $r8
15+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $r7
16+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr = COPY $r6
17+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gpr = COPY $r5
18+
; CHECK-NEXT: [[COPY4:%[0-9]+]]:gpr = COPY $r4
19+
; CHECK-NEXT: [[ANDI:%[0-9]+]]:gpr = ANDI [[COPY3]], 1
20+
; CHECK-NEXT: [[ORI:%[0-9]+]]:gpr = ORI $r0, 1
21+
; CHECK-NEXT: [[ANDI1:%[0-9]+]]:gpr = ANDI [[COPY2]], 1
22+
; CHECK-NEXT: [[ANDI2:%[0-9]+]]:gpr = ANDI [[COPY1]], 1
23+
; CHECK-NEXT: [[ANDI3:%[0-9]+]]:gpr = ANDI [[COPY]], 1
24+
; CHECK-NEXT: [[COPY5:%[0-9]+]]:gpr = COPY $r0
25+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gpr = COPY $r0
26+
; CHECK-NEXT: {{ $}}
27+
; CHECK-NEXT: bb.1:
28+
; CHECK-NEXT: successors: %bb.2(0x80000000)
29+
; CHECK-NEXT: {{ $}}
30+
; CHECK-NEXT: [[COPY7:%[0-9]+]]:gpr = COPY [[COPY5]]
31+
; CHECK-NEXT: {{ $}}
32+
; CHECK-NEXT: bb.2:
33+
; CHECK-NEXT: successors: %bb.3(0x40000000), %bb.4(0x40000000)
34+
; CHECK-NEXT: {{ $}}
35+
; CHECK-NEXT: BEQZ [[ANDI]], %bb.4
36+
; CHECK-NEXT: {{ $}}
37+
; CHECK-NEXT: bb.3:
38+
; CHECK-NEXT: successors: %bb.9(0x80000000)
39+
; CHECK-NEXT: {{ $}}
40+
; CHECK-NEXT: PseudoBR %bb.9
41+
; CHECK-NEXT: {{ $}}
42+
; CHECK-NEXT: bb.4:
43+
; CHECK-NEXT: successors: %bb.5(0x80000000)
44+
; CHECK-NEXT: {{ $}}
45+
; CHECK-NEXT: {{ $}}
46+
; CHECK-NEXT: bb.5:
47+
; CHECK-NEXT: successors: %bb.7(0x7c000000), %bb.6(0x04000000)
48+
; CHECK-NEXT: {{ $}}
49+
; CHECK-NEXT: dead [[LD_D:%[0-9]+]]:gpr = LD_D $r0, 8
50+
; CHECK-NEXT: dead [[LD_D1:%[0-9]+]]:gpr = LD_D $r0, 0
51+
; CHECK-NEXT: BNEZ [[ANDI1]], %bb.7
52+
; CHECK-NEXT: {{ $}}
53+
; CHECK-NEXT: bb.6:
54+
; CHECK-NEXT: successors: %bb.11(0x80000000)
55+
; CHECK-NEXT: {{ $}}
56+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gpr = COPY $r0
57+
; CHECK-NEXT: PseudoBR %bb.11
58+
; CHECK-NEXT: {{ $}}
59+
; CHECK-NEXT: bb.7:
60+
; CHECK-NEXT: successors: %bb.8(0x7c000000), %bb.10(0x04000000)
61+
; CHECK-NEXT: {{ $}}
62+
; CHECK-NEXT: BEQZ [[ANDI2]], %bb.10
63+
; CHECK-NEXT: PseudoBR %bb.8
64+
; CHECK-NEXT: {{ $}}
65+
; CHECK-NEXT: bb.8:
66+
; CHECK-NEXT: successors: %bb.9(0x04000000), %bb.5(0x7c000000)
67+
; CHECK-NEXT: {{ $}}
68+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gpr = ADDI_D [[COPY6]], 1
69+
; CHECK-NEXT: BEQZ [[ANDI3]], %bb.5
70+
; CHECK-NEXT: PseudoBR %bb.9
71+
; CHECK-NEXT: {{ $}}
72+
; CHECK-NEXT: bb.9:
73+
; CHECK-NEXT: successors: %bb.12(0x80000000)
74+
; CHECK-NEXT: {{ $}}
75+
; CHECK-NEXT: ST_B $r0, [[COPY4]], 0
76+
; CHECK-NEXT: PseudoBR %bb.12
77+
; CHECK-NEXT: {{ $}}
78+
; CHECK-NEXT: bb.10:
79+
; CHECK-NEXT: successors: %bb.11(0x80000000)
80+
; CHECK-NEXT: {{ $}}
81+
; CHECK-NEXT: [[COPY5:%[0-9]+]]:gpr = ADDI_D [[COPY6]], 1
82+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gpr = COPY [[ORI]]
83+
; CHECK-NEXT: {{ $}}
84+
; CHECK-NEXT: bb.11:
85+
; CHECK-NEXT: successors: %bb.12(0x80000000)
86+
; CHECK-NEXT: {{ $}}
87+
; CHECK-NEXT: ST_D $r0, [[COPY4]], 0
88+
; CHECK-NEXT: {{ $}}
89+
; CHECK-NEXT: bb.12:
90+
; CHECK-NEXT: successors: %bb.2(0x7c000000), %bb.1(0x04000000)
91+
; CHECK-NEXT: {{ $}}
92+
; CHECK-NEXT: BEQ [[COPY7]], [[ORI]], %bb.2
93+
; CHECK-NEXT: PseudoBR %bb.1
994
bb.0:
1095
liveins: $r4, $r5, $r6, $r7, $r8
1196

0 commit comments

Comments
 (0)