Skip to content

Commit 9cb9ad2

Browse files
committed
[RegisterCoalescer] Deferring deletion of instructions in ErasedInstrs until the end of an iteration
1 parent 6528a77 commit 9cb9ad2

File tree

2 files changed

+98
-7
lines changed

2 files changed

+98
-7
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: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# XFAIL: *
1+
# 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
source_filename = "register-coalescer-crash-pr79718.ll"
@@ -180,6 +180,91 @@ debugValueSubstitutions: []
180180
constants: []
181181
machineFunctionInfo: {}
182182
body: |
183+
; CHECK-LABEL: name: foo
184+
; CHECK: bb.0.start:
185+
; CHECK-NEXT: successors: %bb.1(0x80000000)
186+
; CHECK-NEXT: liveins: $r4, $r5, $r6, $r7, $r8
187+
; CHECK-NEXT: {{ $}}
188+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $r8
189+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $r7
190+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr = COPY $r6
191+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gpr = COPY $r5
192+
; CHECK-NEXT: [[COPY4:%[0-9]+]]:gpr = COPY $r4
193+
; CHECK-NEXT: [[ANDI:%[0-9]+]]:gpr = ANDI [[COPY3]], 1
194+
; CHECK-NEXT: [[ORI:%[0-9]+]]:gpr = ORI $r0, 1
195+
; CHECK-NEXT: [[ANDI1:%[0-9]+]]:gpr = ANDI [[COPY2]], 1
196+
; CHECK-NEXT: [[ANDI2:%[0-9]+]]:gpr = ANDI [[COPY1]], 1
197+
; CHECK-NEXT: [[ANDI3:%[0-9]+]]:gpr = ANDI [[COPY]], 1
198+
; CHECK-NEXT: [[COPY5:%[0-9]+]]:gpr = COPY $r0
199+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gpr = COPY $r0
200+
; CHECK-NEXT: {{ $}}
201+
; CHECK-NEXT: bb.1.bb1:
202+
; CHECK-NEXT: successors: %bb.2(0x80000000)
203+
; CHECK-NEXT: {{ $}}
204+
; CHECK-NEXT: [[COPY7:%[0-9]+]]:gpr = COPY [[COPY5]]
205+
; CHECK-NEXT: {{ $}}
206+
; CHECK-NEXT: bb.2.bb2:
207+
; CHECK-NEXT: successors: %bb.3(0x40000000), %bb.4(0x40000000)
208+
; CHECK-NEXT: {{ $}}
209+
; CHECK-NEXT: BEQZ [[ANDI]], %bb.4
210+
; CHECK-NEXT: {{ $}}
211+
; CHECK-NEXT: bb.3:
212+
; CHECK-NEXT: successors: %bb.9(0x80000000)
213+
; CHECK-NEXT: {{ $}}
214+
; CHECK-NEXT: PseudoBR %bb.9
215+
; CHECK-NEXT: {{ $}}
216+
; CHECK-NEXT: bb.4.preheader.preheader:
217+
; CHECK-NEXT: successors: %bb.5(0x80000000)
218+
; CHECK-NEXT: {{ $}}
219+
; CHECK-NEXT: {{ $}}
220+
; CHECK-NEXT: bb.5.preheader:
221+
; CHECK-NEXT: successors: %bb.7(0x7c000000), %bb.6(0x04000000)
222+
; CHECK-NEXT: {{ $}}
223+
; CHECK-NEXT: dead [[LD_D:%[0-9]+]]:gpr = LD_D $r0, 8 :: (volatile load (s64) from `ptr null` + 8, basealign 4294967296)
224+
; CHECK-NEXT: dead [[LD_D1:%[0-9]+]]:gpr = LD_D $r0, 0 :: (volatile load (s64) from `ptr null`, align 4294967296)
225+
; CHECK-NEXT: BNEZ [[ANDI1]], %bb.7
226+
; CHECK-NEXT: {{ $}}
227+
; CHECK-NEXT: bb.6:
228+
; CHECK-NEXT: successors: %bb.11(0x80000000)
229+
; CHECK-NEXT: {{ $}}
230+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gpr = COPY $r0
231+
; CHECK-NEXT: PseudoBR %bb.11
232+
; CHECK-NEXT: {{ $}}
233+
; CHECK-NEXT: bb.7.bb3:
234+
; CHECK-NEXT: successors: %bb.8(0x7c000000), %bb.10(0x04000000)
235+
; CHECK-NEXT: {{ $}}
236+
; CHECK-NEXT: BEQZ [[ANDI2]], %bb.10
237+
; CHECK-NEXT: PseudoBR %bb.8
238+
; CHECK-NEXT: {{ $}}
239+
; CHECK-NEXT: bb.8.bb4:
240+
; CHECK-NEXT: successors: %bb.9(0x04000000), %bb.5(0x7c000000)
241+
; CHECK-NEXT: {{ $}}
242+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gpr = ADDI_D [[COPY6]], 1
243+
; CHECK-NEXT: BEQZ [[ANDI3]], %bb.5
244+
; CHECK-NEXT: PseudoBR %bb.9
245+
; CHECK-NEXT: {{ $}}
246+
; CHECK-NEXT: bb.9.loopexit:
247+
; CHECK-NEXT: successors: %bb.12(0x80000000)
248+
; CHECK-NEXT: {{ $}}
249+
; CHECK-NEXT: ST_B $r0, [[COPY4]], 0 :: (store (s8) into %ir.0)
250+
; CHECK-NEXT: PseudoBR %bb.12
251+
; CHECK-NEXT: {{ $}}
252+
; CHECK-NEXT: bb.10.bb3.bb5_crit_edge:
253+
; CHECK-NEXT: successors: %bb.11(0x80000000)
254+
; CHECK-NEXT: {{ $}}
255+
; CHECK-NEXT: [[COPY5:%[0-9]+]]:gpr = ADDI_D [[COPY6]], 1
256+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gpr = COPY [[ORI]]
257+
; CHECK-NEXT: {{ $}}
258+
; CHECK-NEXT: bb.11.bb5:
259+
; CHECK-NEXT: successors: %bb.12(0x80000000)
260+
; CHECK-NEXT: {{ $}}
261+
; CHECK-NEXT: ST_D $r0, [[COPY4]], 0 :: (store (s64) into %ir.0)
262+
; CHECK-NEXT: {{ $}}
263+
; CHECK-NEXT: bb.12.bb6:
264+
; CHECK-NEXT: successors: %bb.2(0x7c000000), %bb.1(0x04000000)
265+
; CHECK-NEXT: {{ $}}
266+
; CHECK-NEXT: BEQ [[COPY7]], [[ORI]], %bb.2
267+
; CHECK-NEXT: PseudoBR %bb.1
183268
bb.0.start:
184269
successors: %bb.1(0x80000000)
185270
liveins: $r4, $r5, $r6, $r7, $r8

0 commit comments

Comments
 (0)