xref: /llvm-project/llvm/test/CodeGen/AMDGPU/skip-branch-taildup-ret.mir (revision 2d5f3b0a61fb171617012a2c3ba05fd31fb3bb1d)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs -run-pass=si-pre-emit-peephole -o -  %s | FileCheck %s
3
4---
5name: skip_branch_taildup_endpgm
6machineFunctionInfo:
7  isEntryFunction: true
8body:             |
9  ; CHECK-LABEL: name: skip_branch_taildup_endpgm
10  ; CHECK: bb.0:
11  ; CHECK-NEXT:   successors: %bb.3(0x40000000), %bb.1(0x40000000)
12  ; CHECK-NEXT:   liveins: $vgpr0, $sgpr4_sgpr5, $sgpr7
13  ; CHECK-NEXT: {{  $}}
14  ; CHECK-NEXT:   renamable $sgpr0_sgpr1 = S_LOAD_DWORDX2_IMM renamable $sgpr4_sgpr5, 4, 0 :: (dereferenceable invariant load (s64), align 16, addrspace 4)
15  ; CHECK-NEXT:   renamable $vgpr0 = V_LSHLREV_B32_e32 2, killed $vgpr0, implicit $exec
16  ; CHECK-NEXT:   S_WAITCNT 127
17  ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $sgpr1, implicit $exec, implicit $exec
18  ; CHECK-NEXT:   renamable $vgpr0 = V_ADD_CO_U32_e32 $sgpr0, killed $vgpr0, implicit-def $vcc, implicit $exec
19  ; CHECK-NEXT:   renamable $vgpr1 = V_ADDC_U32_e32 0, killed $vgpr1, implicit-def $vcc, implicit killed $vcc, implicit $exec
20  ; CHECK-NEXT:   renamable $vgpr0 = FLAT_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr :: (load (s32), addrspace 1)
21  ; CHECK-NEXT:   renamable $sgpr0_sgpr1 = S_LOAD_DWORDX2_IMM killed renamable $sgpr4_sgpr5, 0, 0 :: (dereferenceable invariant load (s64), align 16, addrspace 4)
22  ; CHECK-NEXT:   S_WAITCNT 112
23  ; CHECK-NEXT:   V_CMP_NE_U32_e32 0, killed $vgpr0, implicit-def $vcc, implicit $exec
24  ; CHECK-NEXT:   $sgpr2_sgpr3 = S_AND_SAVEEXEC_B64 $vcc, implicit-def $exec, implicit-def $scc, implicit $exec
25  ; CHECK-NEXT:   renamable $sgpr2_sgpr3 = S_XOR_B64 $exec, killed renamable $sgpr2_sgpr3, implicit-def dead $scc
26  ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec
27  ; CHECK-NEXT:   S_BRANCH %bb.3
28  ; CHECK-NEXT: {{  $}}
29  ; CHECK-NEXT: bb.1:
30  ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.2(0x40000000)
31  ; CHECK-NEXT:   liveins: $sgpr0_sgpr1, $sgpr2_sgpr3
32  ; CHECK-NEXT: {{  $}}
33  ; CHECK-NEXT:   renamable $sgpr2_sgpr3 = S_OR_SAVEEXEC_B64 killed renamable $sgpr2_sgpr3, implicit-def $exec, implicit-def $scc, implicit $exec
34  ; CHECK-NEXT:   $exec = S_XOR_B64 $exec, renamable $sgpr2_sgpr3, implicit-def $scc
35  ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.2, implicit $exec
36  ; CHECK-NEXT:   S_BRANCH %bb.4
37  ; CHECK-NEXT: {{  $}}
38  ; CHECK-NEXT: bb.2:
39  ; CHECK-NEXT:   liveins: $sgpr2_sgpr3
40  ; CHECK-NEXT: {{  $}}
41  ; CHECK-NEXT:   $exec = S_OR_B64 $exec, killed renamable $sgpr2_sgpr3, implicit-def $scc
42  ; CHECK-NEXT:   renamable $vgpr0 = V_MOV_B32_e32 32, implicit $exec
43  ; CHECK-NEXT:   S_ENDPGM 0
44  ; CHECK-NEXT: {{  $}}
45  ; CHECK-NEXT: bb.3:
46  ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.2(0x40000000)
47  ; CHECK-NEXT:   liveins: $sgpr0_sgpr1, $sgpr2_sgpr3
48  ; CHECK-NEXT: {{  $}}
49  ; CHECK-NEXT:   renamable $vgpr2 = V_MOV_B32_e32 15, implicit $exec
50  ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit-def $vgpr0_vgpr1, implicit $sgpr0_sgpr1
51  ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $sgpr1, implicit $exec, implicit $sgpr0_sgpr1, implicit $exec
52  ; CHECK-NEXT:   renamable $sgpr2_sgpr3 = S_OR_SAVEEXEC_B64 killed renamable $sgpr2_sgpr3, implicit-def $exec, implicit-def $scc, implicit $exec
53  ; CHECK-NEXT:   $exec = S_XOR_B64 $exec, renamable $sgpr2_sgpr3, implicit-def $scc
54  ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.2, implicit $exec
55  ; CHECK-NEXT:   S_BRANCH %bb.4
56  ; CHECK-NEXT: {{  $}}
57  ; CHECK-NEXT: bb.4:
58  ; CHECK-NEXT:   liveins: $sgpr0_sgpr1, $sgpr2_sgpr3
59  ; CHECK-NEXT: {{  $}}
60  ; CHECK-NEXT:   renamable $vgpr2 = V_MOV_B32_e32 8, implicit $exec
61  ; CHECK-NEXT:   $vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit-def $vgpr0_vgpr1, implicit $sgpr0_sgpr1
62  ; CHECK-NEXT:   $vgpr1 = V_MOV_B32_e32 $sgpr1, implicit $exec, implicit killed $sgpr0_sgpr1, implicit $exec
63  ; CHECK-NEXT:   $exec = S_OR_B64 $exec, killed renamable $sgpr2_sgpr3, implicit-def $scc
64  ; CHECK-NEXT:   renamable $vgpr0 = V_MOV_B32_e32 32, implicit $exec
65  ; CHECK-NEXT:   S_ENDPGM 0
66  bb.0:
67    successors: %bb.1, %bb.2
68    liveins: $vgpr0, $sgpr4_sgpr5, $sgpr7
69
70    renamable $sgpr0_sgpr1 = S_LOAD_DWORDX2_IMM renamable $sgpr4_sgpr5, 4, 0 :: (dereferenceable invariant load (s64), align 16, addrspace 4)
71    renamable $vgpr0 = V_LSHLREV_B32_e32 2, killed $vgpr0, implicit $exec
72    S_WAITCNT 127
73    $vgpr1 = V_MOV_B32_e32 $sgpr1, implicit $exec, implicit $exec
74    renamable $vgpr0 = V_ADD_CO_U32_e32 $sgpr0, killed $vgpr0, implicit-def $vcc, implicit $exec
75    renamable $vgpr1 = V_ADDC_U32_e32 0, killed $vgpr1, implicit-def $vcc, implicit killed $vcc, implicit $exec
76    renamable $vgpr0 = FLAT_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr :: (load (s32), addrspace 1)
77    renamable $sgpr0_sgpr1 = S_LOAD_DWORDX2_IMM killed renamable $sgpr4_sgpr5, 0, 0 :: (dereferenceable invariant load (s64), align 16, addrspace 4)
78    S_WAITCNT 112
79    V_CMP_NE_U32_e32 0, killed $vgpr0, implicit-def $vcc, implicit $exec
80    $sgpr2_sgpr3 = S_AND_SAVEEXEC_B64 $vcc, implicit-def $exec, implicit-def $scc, implicit $exec
81    renamable $sgpr2_sgpr3 = S_XOR_B64 $exec, killed renamable $sgpr2_sgpr3, implicit-def dead $scc
82    S_CBRANCH_EXECZ %bb.2, implicit $exec
83    S_BRANCH %bb.1
84
85  bb.2:
86    successors: %bb.3, %bb.4
87    liveins: $sgpr0_sgpr1, $sgpr2_sgpr3
88
89    renamable $sgpr2_sgpr3 = S_OR_SAVEEXEC_B64 killed renamable $sgpr2_sgpr3, implicit-def $exec, implicit-def $scc, implicit $exec
90    $exec = S_XOR_B64 $exec, renamable $sgpr2_sgpr3, implicit-def $scc
91    S_CBRANCH_EXECZ %bb.4, implicit $exec
92    S_BRANCH %bb.3
93
94  bb.4:
95    liveins: $sgpr2_sgpr3
96
97    $exec = S_OR_B64 $exec, killed renamable $sgpr2_sgpr3, implicit-def $scc
98    renamable $vgpr0 = V_MOV_B32_e32 32, implicit $exec
99    S_ENDPGM 0
100
101  bb.1:
102    successors: %bb.3, %bb.4
103    liveins: $sgpr0_sgpr1, $sgpr2_sgpr3
104
105    renamable $vgpr2 = V_MOV_B32_e32 15, implicit $exec
106    $vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit-def $vgpr0_vgpr1, implicit $sgpr0_sgpr1
107    $vgpr1 = V_MOV_B32_e32 $sgpr1, implicit $exec, implicit $sgpr0_sgpr1, implicit $exec
108    renamable $sgpr2_sgpr3 = S_OR_SAVEEXEC_B64 killed renamable $sgpr2_sgpr3, implicit-def $exec, implicit-def $scc, implicit $exec
109    $exec = S_XOR_B64 $exec, renamable $sgpr2_sgpr3, implicit-def $scc
110    S_CBRANCH_EXECZ %bb.4, implicit $exec
111    S_BRANCH %bb.3
112
113  bb.3:
114    liveins: $sgpr0_sgpr1, $sgpr2_sgpr3
115
116    renamable $vgpr2 = V_MOV_B32_e32 8, implicit $exec
117    $vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit-def $vgpr0_vgpr1, implicit $sgpr0_sgpr1
118    $vgpr1 = V_MOV_B32_e32 $sgpr1, implicit $exec, implicit killed $sgpr0_sgpr1, implicit $exec
119    $exec = S_OR_B64 $exec, killed renamable $sgpr2_sgpr3, implicit-def $scc
120    renamable $vgpr0 = V_MOV_B32_e32 32, implicit $exec
121    S_ENDPGM 0
122
123...
124
125---
126name: skip_branch_taildup_ret
127body:             |
128  ; CHECK-LABEL: name: skip_branch_taildup_ret
129  ; CHECK: bb.0:
130  ; CHECK-NEXT:   successors: %bb.3(0x40000000), %bb.1(0x40000000)
131  ; CHECK-NEXT:   liveins: $vgpr0, $sgpr30_sgpr31, $vgpr1_vgpr2
132  ; CHECK-NEXT: {{  $}}
133  ; CHECK-NEXT:   S_WAITCNT 0
134  ; CHECK-NEXT:   V_CMP_NE_U32_e32 0, killed $vgpr0, implicit-def $vcc, implicit $exec
135  ; CHECK-NEXT:   $sgpr6_sgpr7 = S_AND_SAVEEXEC_B64 $vcc, implicit-def $exec, implicit-def $scc, implicit $exec
136  ; CHECK-NEXT:   renamable $sgpr6_sgpr7 = S_XOR_B64 $exec, killed renamable $sgpr6_sgpr7, implicit-def dead $scc
137  ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec
138  ; CHECK-NEXT:   S_BRANCH %bb.3
139  ; CHECK-NEXT: {{  $}}
140  ; CHECK-NEXT: bb.1:
141  ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.2(0x40000000)
142  ; CHECK-NEXT:   liveins: $sgpr6_sgpr7, $sgpr30_sgpr31, $vgpr1_vgpr2
143  ; CHECK-NEXT: {{  $}}
144  ; CHECK-NEXT:   renamable $sgpr6_sgpr7 = S_OR_SAVEEXEC_B64 killed renamable $sgpr6_sgpr7, implicit-def $exec, implicit-def $scc, implicit $exec
145  ; CHECK-NEXT:   $exec = S_XOR_B64 $exec, renamable $sgpr6_sgpr7, implicit-def $scc
146  ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.2, implicit $exec
147  ; CHECK-NEXT:   S_BRANCH %bb.4
148  ; CHECK-NEXT: {{  $}}
149  ; CHECK-NEXT: bb.2:
150  ; CHECK-NEXT:   liveins: $sgpr6_sgpr7, $sgpr30_sgpr31
151  ; CHECK-NEXT: {{  $}}
152  ; CHECK-NEXT:   $exec = S_OR_B64 $exec, killed renamable $sgpr6_sgpr7, implicit-def $scc
153  ; CHECK-NEXT:   renamable $vgpr0 = V_MOV_B32_e32 32, implicit $exec
154  ; CHECK-NEXT:   S_SETPC_B64_return $sgpr30_sgpr31
155  ; CHECK-NEXT: {{  $}}
156  ; CHECK-NEXT: bb.3:
157  ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.2(0x40000000)
158  ; CHECK-NEXT:   liveins: $sgpr6_sgpr7, $sgpr30_sgpr31, $vgpr1_vgpr2
159  ; CHECK-NEXT: {{  $}}
160  ; CHECK-NEXT:   renamable $vgpr0 = V_MOV_B32_e32 15, implicit $exec
161  ; CHECK-NEXT:   renamable $sgpr6_sgpr7 = S_OR_SAVEEXEC_B64 killed renamable $sgpr6_sgpr7, implicit-def $exec, implicit-def $scc, implicit $exec
162  ; CHECK-NEXT:   $exec = S_XOR_B64 $exec, renamable $sgpr6_sgpr7, implicit-def $scc
163  ; CHECK-NEXT:   S_CBRANCH_EXECZ %bb.2, implicit $exec
164  ; CHECK-NEXT:   S_BRANCH %bb.4
165  ; CHECK-NEXT: {{  $}}
166  ; CHECK-NEXT: bb.4:
167  ; CHECK-NEXT:   liveins: $sgpr6_sgpr7, $sgpr30_sgpr31, $vgpr1_vgpr2
168  ; CHECK-NEXT: {{  $}}
169  ; CHECK-NEXT:   renamable $vgpr0 = V_MOV_B32_e32 8, implicit $exec
170  ; CHECK-NEXT:   $exec = S_OR_B64 $exec, killed renamable $sgpr6_sgpr7, implicit-def $scc
171  ; CHECK-NEXT:   renamable $vgpr0 = V_MOV_B32_e32 32, implicit $exec
172  ; CHECK-NEXT:   S_SETPC_B64_return $sgpr30_sgpr31
173  bb.0:
174    successors: %bb.1, %bb.2
175    liveins: $vgpr0, $sgpr30_sgpr31, $vgpr1_vgpr2
176
177    S_WAITCNT 0
178    V_CMP_NE_U32_e32 0, killed $vgpr0, implicit-def $vcc, implicit $exec
179    $sgpr6_sgpr7 = S_AND_SAVEEXEC_B64 $vcc, implicit-def $exec, implicit-def $scc, implicit $exec
180    renamable $sgpr6_sgpr7 = S_XOR_B64 $exec, killed renamable $sgpr6_sgpr7, implicit-def dead $scc
181    S_CBRANCH_EXECZ %bb.2, implicit $exec
182    S_BRANCH %bb.1
183
184  bb.2:
185    successors: %bb.3, %bb.4
186    liveins: $sgpr6_sgpr7, $sgpr30_sgpr31, $vgpr1_vgpr2
187
188    renamable $sgpr6_sgpr7 = S_OR_SAVEEXEC_B64 killed renamable $sgpr6_sgpr7, implicit-def $exec, implicit-def $scc, implicit $exec
189    $exec = S_XOR_B64 $exec, renamable $sgpr6_sgpr7, implicit-def $scc
190    S_CBRANCH_EXECZ %bb.4, implicit $exec
191    S_BRANCH %bb.3
192
193  bb.4:
194    liveins: $sgpr6_sgpr7, $sgpr30_sgpr31
195
196    $exec = S_OR_B64 $exec, killed renamable $sgpr6_sgpr7, implicit-def $scc
197    renamable $vgpr0 = V_MOV_B32_e32 32, implicit $exec
198    S_SETPC_B64_return $sgpr30_sgpr31
199
200  bb.1:
201    successors: %bb.3, %bb.4
202    liveins: $sgpr6_sgpr7, $sgpr30_sgpr31, $vgpr1_vgpr2
203
204    renamable $vgpr0 = V_MOV_B32_e32 15, implicit $exec
205    renamable $sgpr6_sgpr7 = S_OR_SAVEEXEC_B64 killed renamable $sgpr6_sgpr7, implicit-def $exec, implicit-def $scc, implicit $exec
206    $exec = S_XOR_B64 $exec, renamable $sgpr6_sgpr7, implicit-def $scc
207    S_CBRANCH_EXECZ %bb.4, implicit $exec
208    S_BRANCH %bb.3
209
210  bb.3:
211    liveins: $sgpr6_sgpr7, $sgpr30_sgpr31, $vgpr1_vgpr2
212
213    renamable $vgpr0 = V_MOV_B32_e32 8, implicit $exec
214    $exec = S_OR_B64 $exec, killed renamable $sgpr6_sgpr7, implicit-def $scc
215    renamable $vgpr0 = V_MOV_B32_e32 32, implicit $exec
216    S_SETPC_B64_return $sgpr30_sgpr31
217
218...
219