Skip to content

Commit e33e087

Browse files
authored
[MachineSink] Update register dependency correctly (#109763)
The accumulateUsedDefed() was missing if block prologue interference check does not pass. This would cause incorrect register dependency, which cause incorrect sinking.
1 parent 4a2d24e commit e33e087

File tree

2 files changed

+69
-2
lines changed

2 files changed

+69
-2
lines changed

llvm/lib/CodeGen/MachineSink.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2152,8 +2152,9 @@ bool PostRAMachineSinking::tryToSinkCopy(MachineBasicBlock &CurBB,
21522152
MachineBasicBlock::iterator InsertPos =
21532153
SuccBB->SkipPHIsAndLabels(SuccBB->begin());
21542154
if (blockPrologueInterferes(SuccBB, InsertPos, MI, TRI, TII, nullptr)) {
2155-
LLVM_DEBUG(
2156-
dbgs() << " *** Not sinking: prologue interference\n");
2155+
LiveRegUnits::accumulateUsedDefed(MI, ModifiedRegUnits, UsedRegUnits,
2156+
TRI);
2157+
LLVM_DEBUG(dbgs() << " *** Not sinking: prologue interference\n");
21572158
continue;
21582159
}
21592160

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -run-pass=postra-machine-sink -verify-machineinstrs -o - %s | FileCheck %s
3+
#
4+
# In the example, the ` $sgpr4 = COPY $sgpr2` was incorrectly sunk into bb.3. This happened because we did not update
5+
# register uses when we found that `$sgpr2 = COPY $sgpr3` should not be sunk because of conflict with the successor's
6+
# prologue instructions.
7+
---
8+
name: update_dependency_correctly
9+
tracksRegLiveness: true
10+
body: |
11+
; CHECK-LABEL: name: update_dependency_correctly
12+
; CHECK: bb.0:
13+
; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000)
14+
; CHECK-NEXT: liveins: $sgpr0, $sgpr3, $sgpr2
15+
; CHECK-NEXT: {{ $}}
16+
; CHECK-NEXT: $vgpr1 = IMPLICIT_DEF
17+
; CHECK-NEXT: renamable $sgpr4 = COPY $sgpr2
18+
; CHECK-NEXT: renamable $sgpr2 = COPY $sgpr3
19+
; CHECK-NEXT: $vgpr1 = SI_SPILL_S32_TO_VGPR $sgpr0, 0, $vgpr1
20+
; CHECK-NEXT: $sgpr1 = S_AND_SAVEEXEC_B32 $sgpr0, implicit-def $exec, implicit-def $scc, implicit $exec
21+
; CHECK-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec
22+
; CHECK-NEXT: S_BRANCH %bb.2
23+
; CHECK-NEXT: {{ $}}
24+
; CHECK-NEXT: bb.1:
25+
; CHECK-NEXT: S_ENDPGM 0
26+
; CHECK-NEXT: {{ $}}
27+
; CHECK-NEXT: bb.2:
28+
; CHECK-NEXT: successors: %bb.1(0x80000000)
29+
; CHECK-NEXT: liveins: $sgpr0, $sgpr2, $sgpr4, $vgpr1
30+
; CHECK-NEXT: {{ $}}
31+
; CHECK-NEXT: $sgpr3 = SI_RESTORE_S32_FROM_VGPR $vgpr1, 0
32+
; CHECK-NEXT: renamable $sgpr0_sgpr1 = S_GETPC_B64_pseudo
33+
; CHECK-NEXT: renamable $sgpr5 = COPY $sgpr1
34+
; CHECK-NEXT: renamable $sgpr0_sgpr1 = S_LOAD_DWORDX2_IMM renamable $sgpr4_sgpr5, 32, 0
35+
; CHECK-NEXT: S_BRANCH %bb.1
36+
bb.0:
37+
successors: %bb.3(0x40000000), %bb.2(0x40000000)
38+
liveins: $sgpr0, $sgpr3, $sgpr2
39+
40+
$vgpr1 = IMPLICIT_DEF
41+
42+
renamable $sgpr4 = COPY $sgpr2
43+
renamable $sgpr2 = COPY $sgpr3
44+
45+
$vgpr1 = SI_SPILL_S32_TO_VGPR $sgpr0, 0, $vgpr1
46+
47+
$sgpr1 = S_AND_SAVEEXEC_B32 $sgpr0, implicit-def $exec, implicit-def $scc, implicit $exec
48+
S_CBRANCH_EXECZ %bb.2, implicit $exec
49+
S_BRANCH %bb.3
50+
51+
bb.2:
52+
S_ENDPGM 0
53+
54+
bb.3:
55+
successors: %bb.2(0x40000000)
56+
liveins: $sgpr0, $sgpr2, $sgpr4, $vgpr1
57+
58+
$sgpr3 = SI_RESTORE_S32_FROM_VGPR $vgpr1, 0
59+
60+
renamable $sgpr0_sgpr1 = S_GETPC_B64_pseudo
61+
renamable $sgpr5 = COPY $sgpr1
62+
renamable $sgpr0_sgpr1 = S_LOAD_DWORDX2_IMM renamable $sgpr4_sgpr5, 32, 0
63+
64+
S_BRANCH %bb.2
65+
66+
...

0 commit comments

Comments
 (0)