Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / legalize-brcond.mir
blob9be5e14cdc711fb76d71f43566036d43b78fdabf
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji -O0 -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck -check-prefix=WAVE64 %s
3 # RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 -mattr=+wavefrontsize32,-wavefrontsize64 -O0 -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck -check-prefix=WAVE32 %s
4 # RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 -mattr=+wavefrontsize32,-wavefrontsize64 -O0 -run-pass=legalizer -verify-machineinstrs %s -o - | FileCheck -check-prefix=WAVE32 %s
6 ---
7 name: legal_brcond_vcc
8 body:             |
9   ; WAVE64-LABEL: name: legal_brcond_vcc
10   ; WAVE64: bb.0:
11   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
12   ; WAVE64-NEXT:   liveins: $vgpr0, $vgpr1
13   ; WAVE64-NEXT: {{  $}}
14   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
15   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
16   ; WAVE64-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
17   ; WAVE64-NEXT:   G_BRCOND [[ICMP]](s1), %bb.1
18   ; WAVE64-NEXT: {{  $}}
19   ; WAVE64-NEXT: bb.1:
20   ; WAVE32-LABEL: name: legal_brcond_vcc
21   ; WAVE32: bb.0:
22   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
23   ; WAVE32-NEXT:   liveins: $vgpr0, $vgpr1
24   ; WAVE32-NEXT: {{  $}}
25   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
26   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
27   ; WAVE32-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
28   ; WAVE32-NEXT:   G_BRCOND [[ICMP]](s1), %bb.1
29   ; WAVE32-NEXT: {{  $}}
30   ; WAVE32-NEXT: bb.1:
31   bb.0:
32     successors: %bb.1
33     liveins: $vgpr0, $vgpr1
34     %0:_(s32) = COPY $vgpr0
35     %1:_(s32) = COPY $vgpr1
36     %2:_(s1) = G_ICMP intpred(ne), %0, %1
37     G_BRCOND %2, %bb.1
39   bb.1:
40 ...
42 ---
44 name: legal_brcond_sgpr_s1
46 body: |
47   ; WAVE64-LABEL: name: legal_brcond_sgpr_s1
48   ; WAVE64: bb.0:
49   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
50   ; WAVE64-NEXT:   liveins: $sgpr0, $sgpr1
51   ; WAVE64-NEXT: {{  $}}
52   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $sgpr0
53   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $sgpr1
54   ; WAVE64-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[COPY1]]
55   ; WAVE64-NEXT:   G_BRCOND [[ICMP]](s1), %bb.1
56   ; WAVE64-NEXT: {{  $}}
57   ; WAVE64-NEXT: bb.1:
58   ; WAVE32-LABEL: name: legal_brcond_sgpr_s1
59   ; WAVE32: bb.0:
60   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
61   ; WAVE32-NEXT:   liveins: $sgpr0, $sgpr1
62   ; WAVE32-NEXT: {{  $}}
63   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $sgpr0
64   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $sgpr1
65   ; WAVE32-NEXT:   [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[COPY1]]
66   ; WAVE32-NEXT:   G_BRCOND [[ICMP]](s1), %bb.1
67   ; WAVE32-NEXT: {{  $}}
68   ; WAVE32-NEXT: bb.1:
69   bb.0:
70     liveins: $sgpr0, $sgpr1
72     %0:_(s32) = COPY $sgpr0
73     %1:_(s32) = COPY $sgpr1
74     %2:_(s1) = G_ICMP intpred(eq), %0, %1
75     G_BRCOND %2, %bb.1
77   bb.1:
79 ...
81 ---
83 name: legal_brcond_sgpr_s32
85 body: |
86   ; WAVE64-LABEL: name: legal_brcond_sgpr_s32
87   ; WAVE64: bb.0:
88   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
89   ; WAVE64-NEXT:   liveins: $sgpr0, $sgpr1
90   ; WAVE64-NEXT: {{  $}}
91   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $sgpr0
92   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $sgpr1
93   ; WAVE64-NEXT:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY]](s32), [[COPY1]]
94   ; WAVE64-NEXT:   G_BRCOND [[ICMP]](s32), %bb.1
95   ; WAVE64-NEXT: {{  $}}
96   ; WAVE64-NEXT: bb.1:
97   ; WAVE32-LABEL: name: legal_brcond_sgpr_s32
98   ; WAVE32: bb.0:
99   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
100   ; WAVE32-NEXT:   liveins: $sgpr0, $sgpr1
101   ; WAVE32-NEXT: {{  $}}
102   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $sgpr0
103   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $sgpr1
104   ; WAVE32-NEXT:   [[ICMP:%[0-9]+]]:_(s32) = G_ICMP intpred(eq), [[COPY]](s32), [[COPY1]]
105   ; WAVE32-NEXT:   G_BRCOND [[ICMP]](s32), %bb.1
106   ; WAVE32-NEXT: {{  $}}
107   ; WAVE32-NEXT: bb.1:
108   bb.0:
109     liveins: $sgpr0, $sgpr1
111     %0:_(s32) = COPY $sgpr0
112     %1:_(s32) = COPY $sgpr1
113     %2:_(s32) = G_ICMP intpred(eq), %0, %1
114     G_BRCOND %2, %bb.1
116   bb.1:
121 name: brcond_si_if
122 body:             |
123   ; WAVE64-LABEL: name: brcond_si_if
124   ; WAVE64: bb.0:
125   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
126   ; WAVE64-NEXT:   liveins: $vgpr0, $vgpr1
127   ; WAVE64-NEXT: {{  $}}
128   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
129   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
130   ; WAVE64-NEXT:   [[ICMP:%[0-9]+]]:sreg_64_xexec(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
131   ; WAVE64-NEXT:   [[SI_IF:%[0-9]+]]:sreg_64_xexec(s64) = SI_IF [[ICMP]](s1), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
132   ; WAVE64-NEXT:   G_BR %bb.1
133   ; WAVE64-NEXT: {{  $}}
134   ; WAVE64-NEXT: bb.1:
135   ; WAVE32-LABEL: name: brcond_si_if
136   ; WAVE32: bb.0:
137   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
138   ; WAVE32-NEXT:   liveins: $vgpr0, $vgpr1
139   ; WAVE32-NEXT: {{  $}}
140   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
141   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
142   ; WAVE32-NEXT:   [[ICMP:%[0-9]+]]:sreg_32_xm0_xexec(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
143   ; WAVE32-NEXT:   [[SI_IF:%[0-9]+]]:sreg_32_xm0_xexec(s64) = SI_IF [[ICMP]](s1), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
144   ; WAVE32-NEXT:   G_BR %bb.1
145   ; WAVE32-NEXT: {{  $}}
146   ; WAVE32-NEXT: bb.1:
147   bb.0:
148     successors: %bb.1
149     liveins: $vgpr0, $vgpr1
150     %0:_(s32) = COPY $vgpr0
151     %1:_(s32) = COPY $vgpr1
152     %2:_(s1) = G_ICMP intpred(ne), %0, %1
153     %3:_(s1), %4:_(s64) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.if), %2
154     G_BRCOND %3, %bb.1
156   bb.1:
160 name: brcond_si_else
161 body:             |
162   ; WAVE64-LABEL: name: brcond_si_else
163   ; WAVE64: bb.0:
164   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
165   ; WAVE64-NEXT:   liveins: $vgpr0, $vgpr1
166   ; WAVE64-NEXT: {{  $}}
167   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
168   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
169   ; WAVE64-NEXT:   [[ICMP:%[0-9]+]]:sreg_64_xexec(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
170   ; WAVE64-NEXT:   [[SI_ELSE:%[0-9]+]]:sreg_64_xexec(s64) = SI_ELSE [[ICMP]](s1), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
171   ; WAVE64-NEXT:   G_BR %bb.1
172   ; WAVE64-NEXT: {{  $}}
173   ; WAVE64-NEXT: bb.1:
174   ; WAVE32-LABEL: name: brcond_si_else
175   ; WAVE32: bb.0:
176   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
177   ; WAVE32-NEXT:   liveins: $vgpr0, $vgpr1
178   ; WAVE32-NEXT: {{  $}}
179   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
180   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
181   ; WAVE32-NEXT:   [[ICMP:%[0-9]+]]:sreg_32_xm0_xexec(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
182   ; WAVE32-NEXT:   [[SI_ELSE:%[0-9]+]]:sreg_32_xm0_xexec(s64) = SI_ELSE [[ICMP]](s1), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
183   ; WAVE32-NEXT:   G_BR %bb.1
184   ; WAVE32-NEXT: {{  $}}
185   ; WAVE32-NEXT: bb.1:
186   bb.0:
187     successors: %bb.1
188     liveins: $vgpr0, $vgpr1
189     %0:_(s32) = COPY $vgpr0
190     %1:_(s32) = COPY $vgpr1
191     %2:_(s1) = G_ICMP intpred(ne), %0, %1
192     %3:_(s1), %4:_(s64) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.else), %2
193     G_BRCOND %3, %bb.1
195   bb.1:
199 name: brcond_si_loop_brcond
200 tracksRegLiveness: true
201 body:             |
202   ; WAVE64-LABEL: name: brcond_si_loop_brcond
203   ; WAVE64: bb.0:
204   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
205   ; WAVE64-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
206   ; WAVE64-NEXT: {{  $}}
207   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
208   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
209   ; WAVE64-NEXT:   [[COPY2:%[0-9]+]]:sreg_64_xexec(s64) = COPY $sgpr0_sgpr1
210   ; WAVE64-NEXT: {{  $}}
211   ; WAVE64-NEXT: bb.1:
212   ; WAVE64-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
213   ; WAVE64-NEXT: {{  $}}
214   ; WAVE64-NEXT:   S_NOP 0
215   ; WAVE64-NEXT:   SI_LOOP [[COPY2]](s64), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
216   ; WAVE64-NEXT:   G_BR %bb.2
217   ; WAVE64-NEXT: {{  $}}
218   ; WAVE64-NEXT: bb.2:
219   ; WAVE64-NEXT:   S_NOP 0
220   ; WAVE32-LABEL: name: brcond_si_loop_brcond
221   ; WAVE32: bb.0:
222   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
223   ; WAVE32-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
224   ; WAVE32-NEXT: {{  $}}
225   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
226   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
227   ; WAVE32-NEXT:   [[COPY2:%[0-9]+]]:sreg_32_xm0_xexec(s64) = COPY $sgpr0_sgpr1
228   ; WAVE32-NEXT: {{  $}}
229   ; WAVE32-NEXT: bb.1:
230   ; WAVE32-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
231   ; WAVE32-NEXT: {{  $}}
232   ; WAVE32-NEXT:   S_NOP 0
233   ; WAVE32-NEXT:   SI_LOOP [[COPY2]](s64), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
234   ; WAVE32-NEXT:   G_BR %bb.2
235   ; WAVE32-NEXT: {{  $}}
236   ; WAVE32-NEXT: bb.2:
237   ; WAVE32-NEXT:   S_NOP 0
238   bb.0:
239     liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
240     %0:_(s32) = COPY $vgpr0
241     %1:_(s32) = COPY $vgpr1
242     %2:_(s64) = COPY $sgpr0_sgpr1
244   bb.1:
245     successors: %bb.1, %bb.2
246     S_NOP 0
247     %3:_(s1) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.loop), %2
248     G_BRCOND %3, %bb.2
249     G_BR %bb.1
251   bb.2:
252     S_NOP 0
255 # This usage is backwards from how the intrinsic is supposed to be
256 # used.
258 name: brcond_si_loop_brcond_back
259 tracksRegLiveness: true
260 body:             |
261   ; WAVE64-LABEL: name: brcond_si_loop_brcond_back
262   ; WAVE64: bb.0:
263   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
264   ; WAVE64-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
265   ; WAVE64-NEXT: {{  $}}
266   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
267   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
268   ; WAVE64-NEXT:   [[COPY2:%[0-9]+]]:sreg_64_xexec(s64) = COPY $sgpr0_sgpr1
269   ; WAVE64-NEXT: {{  $}}
270   ; WAVE64-NEXT: bb.1:
271   ; WAVE64-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
272   ; WAVE64-NEXT: {{  $}}
273   ; WAVE64-NEXT:   S_NOP 0
274   ; WAVE64-NEXT:   SI_LOOP [[COPY2]](s64), %bb.2, implicit-def $exec, implicit-def $scc, implicit $exec
275   ; WAVE64-NEXT:   G_BR %bb.1
276   ; WAVE64-NEXT: {{  $}}
277   ; WAVE64-NEXT: bb.2:
278   ; WAVE64-NEXT:   S_NOP 0
279   ; WAVE32-LABEL: name: brcond_si_loop_brcond_back
280   ; WAVE32: bb.0:
281   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
282   ; WAVE32-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
283   ; WAVE32-NEXT: {{  $}}
284   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
285   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
286   ; WAVE32-NEXT:   [[COPY2:%[0-9]+]]:sreg_32_xm0_xexec(s64) = COPY $sgpr0_sgpr1
287   ; WAVE32-NEXT: {{  $}}
288   ; WAVE32-NEXT: bb.1:
289   ; WAVE32-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
290   ; WAVE32-NEXT: {{  $}}
291   ; WAVE32-NEXT:   S_NOP 0
292   ; WAVE32-NEXT:   SI_LOOP [[COPY2]](s64), %bb.2, implicit-def $exec, implicit-def $scc, implicit $exec
293   ; WAVE32-NEXT:   G_BR %bb.1
294   ; WAVE32-NEXT: {{  $}}
295   ; WAVE32-NEXT: bb.2:
296   ; WAVE32-NEXT:   S_NOP 0
297   bb.0:
298     liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
299     %0:_(s32) = COPY $vgpr0
300     %1:_(s32) = COPY $vgpr1
301     %2:_(s64) = COPY $sgpr0_sgpr1
303   bb.1:
304     successors: %bb.1, %bb.2
305     S_NOP 0
306     %3:_(s1) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.loop), %2
307     G_BRCOND %3, %bb.1
308     G_BR %bb.2
310   bb.2:
311     S_NOP 0
314 # This usage is backwards from how the intrinsic is supposed to be
315 # used.
317 name: brcond_si_loop_brcond_back_fallthrough
318 tracksRegLiveness: true
319 body:             |
320   ; WAVE64-LABEL: name: brcond_si_loop_brcond_back_fallthrough
321   ; WAVE64: bb.0:
322   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
323   ; WAVE64-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
324   ; WAVE64-NEXT: {{  $}}
325   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
326   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
327   ; WAVE64-NEXT:   [[COPY2:%[0-9]+]]:sreg_64_xexec(s64) = COPY $sgpr0_sgpr1
328   ; WAVE64-NEXT: {{  $}}
329   ; WAVE64-NEXT: bb.1:
330   ; WAVE64-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
331   ; WAVE64-NEXT: {{  $}}
332   ; WAVE64-NEXT:   S_NOP 0
333   ; WAVE64-NEXT:   SI_LOOP [[COPY2]](s64), %bb.2, implicit-def $exec, implicit-def $scc, implicit $exec
334   ; WAVE64-NEXT:   G_BR %bb.1
335   ; WAVE64-NEXT: {{  $}}
336   ; WAVE64-NEXT: bb.2:
337   ; WAVE32-LABEL: name: brcond_si_loop_brcond_back_fallthrough
338   ; WAVE32: bb.0:
339   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
340   ; WAVE32-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
341   ; WAVE32-NEXT: {{  $}}
342   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
343   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
344   ; WAVE32-NEXT:   [[COPY2:%[0-9]+]]:sreg_32_xm0_xexec(s64) = COPY $sgpr0_sgpr1
345   ; WAVE32-NEXT: {{  $}}
346   ; WAVE32-NEXT: bb.1:
347   ; WAVE32-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
348   ; WAVE32-NEXT: {{  $}}
349   ; WAVE32-NEXT:   S_NOP 0
350   ; WAVE32-NEXT:   SI_LOOP [[COPY2]](s64), %bb.2, implicit-def $exec, implicit-def $scc, implicit $exec
351   ; WAVE32-NEXT:   G_BR %bb.1
352   ; WAVE32-NEXT: {{  $}}
353   ; WAVE32-NEXT: bb.2:
354   bb.0:
355     liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
356     %0:_(s32) = COPY $vgpr0
357     %1:_(s32) = COPY $vgpr1
358     %2:_(s64) = COPY $sgpr0_sgpr1
360   bb.1:
361     successors: %bb.1, %bb.2
362     S_NOP 0
363     %3:_(s1) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.loop), %2
364     G_BRCOND %3, %bb.1
366   bb.2:
369 # There's another instruction between the intrinsic and the
370 # conditional branch, so we need to move the insert point.
372 name: brcond_si_if_need_insert_terminator_point
373 body:             |
374   ; WAVE64-LABEL: name: brcond_si_if_need_insert_terminator_point
375   ; WAVE64: bb.0:
376   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
377   ; WAVE64-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2
378   ; WAVE64-NEXT: {{  $}}
379   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
380   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
381   ; WAVE64-NEXT:   [[ICMP:%[0-9]+]]:sreg_64_xexec(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
382   ; WAVE64-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
383   ; WAVE64-NEXT:   [[SI_IF:%[0-9]+]]:sreg_64_xexec(s64) = SI_IF [[ICMP]](s1), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
384   ; WAVE64-NEXT:   G_BR %bb.1
385   ; WAVE64-NEXT: {{  $}}
386   ; WAVE64-NEXT: bb.1:
387   ; WAVE64-NEXT:   S_ENDPGM 0, implicit [[COPY2]](s32)
388   ; WAVE32-LABEL: name: brcond_si_if_need_insert_terminator_point
389   ; WAVE32: bb.0:
390   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
391   ; WAVE32-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2
392   ; WAVE32-NEXT: {{  $}}
393   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
394   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
395   ; WAVE32-NEXT:   [[ICMP:%[0-9]+]]:sreg_32_xm0_xexec(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
396   ; WAVE32-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
397   ; WAVE32-NEXT:   [[SI_IF:%[0-9]+]]:sreg_32_xm0_xexec(s64) = SI_IF [[ICMP]](s1), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
398   ; WAVE32-NEXT:   G_BR %bb.1
399   ; WAVE32-NEXT: {{  $}}
400   ; WAVE32-NEXT: bb.1:
401   ; WAVE32-NEXT:   S_ENDPGM 0, implicit [[COPY2]](s32)
402   bb.0:
403     successors: %bb.1
404     liveins: $vgpr0, $vgpr1, $vgpr2
405     %0:_(s32) = COPY $vgpr0
406     %1:_(s32) = COPY $vgpr1
407     %2:_(s1) = G_ICMP intpred(ne), %0, %1
408     %3:_(s1), %4:_(s64) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.if), %2
409     %5:_(s32) = COPY $vgpr2
410     G_BRCOND %3, %bb.1
412   bb.1:
413     S_ENDPGM 0, implicit %5
417 name: brcond_si_loop_need_terminator_insert_point
418 tracksRegLiveness: true
419 body:             |
420   ; WAVE64-LABEL: name: brcond_si_loop_need_terminator_insert_point
421   ; WAVE64: bb.0:
422   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
423   ; WAVE64-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
424   ; WAVE64-NEXT: {{  $}}
425   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
426   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
427   ; WAVE64-NEXT:   [[COPY2:%[0-9]+]]:sreg_64_xexec(s64) = COPY $sgpr0_sgpr1
428   ; WAVE64-NEXT: {{  $}}
429   ; WAVE64-NEXT: bb.1:
430   ; WAVE64-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
431   ; WAVE64-NEXT: {{  $}}
432   ; WAVE64-NEXT:   S_NOP 0
433   ; WAVE64-NEXT:   S_NOP 0
434   ; WAVE64-NEXT:   S_NOP 0
435   ; WAVE64-NEXT:   SI_LOOP [[COPY2]](s64), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
436   ; WAVE64-NEXT:   G_BR %bb.2
437   ; WAVE64-NEXT: {{  $}}
438   ; WAVE64-NEXT: bb.2:
439   ; WAVE64-NEXT:   S_NOP 0
440   ; WAVE32-LABEL: name: brcond_si_loop_need_terminator_insert_point
441   ; WAVE32: bb.0:
442   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
443   ; WAVE32-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
444   ; WAVE32-NEXT: {{  $}}
445   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
446   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
447   ; WAVE32-NEXT:   [[COPY2:%[0-9]+]]:sreg_32_xm0_xexec(s64) = COPY $sgpr0_sgpr1
448   ; WAVE32-NEXT: {{  $}}
449   ; WAVE32-NEXT: bb.1:
450   ; WAVE32-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
451   ; WAVE32-NEXT: {{  $}}
452   ; WAVE32-NEXT:   S_NOP 0
453   ; WAVE32-NEXT:   S_NOP 0
454   ; WAVE32-NEXT:   S_NOP 0
455   ; WAVE32-NEXT:   SI_LOOP [[COPY2]](s64), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
456   ; WAVE32-NEXT:   G_BR %bb.2
457   ; WAVE32-NEXT: {{  $}}
458   ; WAVE32-NEXT: bb.2:
459   ; WAVE32-NEXT:   S_NOP 0
460   bb.0:
461     liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
462     %0:_(s32) = COPY $vgpr0
463     %1:_(s32) = COPY $vgpr1
464     %2:_(s64) = COPY $sgpr0_sgpr1
466   bb.1:
467     successors: %bb.1, %bb.2
468     S_NOP 0
469     %3:_(s1) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.loop), %2
470     S_NOP 0
471     S_NOP 0
472     G_BRCOND %3, %bb.2
473     G_BR %bb.1
475   bb.2:
476     S_NOP 0
480 name: brcond_si_if_negated
481 body:             |
482   ; WAVE64-LABEL: name: brcond_si_if_negated
483   ; WAVE64: bb.0:
484   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
485   ; WAVE64-NEXT:   liveins: $vgpr0, $vgpr1
486   ; WAVE64-NEXT: {{  $}}
487   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
488   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
489   ; WAVE64-NEXT:   [[ICMP:%[0-9]+]]:sreg_64_xexec(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
490   ; WAVE64-NEXT:   [[SI_IF:%[0-9]+]]:sreg_64_xexec(s64) = SI_IF [[ICMP]](s1), %bb.2, implicit-def $exec, implicit-def $scc, implicit $exec
491   ; WAVE64-NEXT:   G_BR %bb.1
492   ; WAVE64-NEXT: {{  $}}
493   ; WAVE64-NEXT: bb.1:
494   ; WAVE64-NEXT:   successors: %bb.2(0x80000000)
495   ; WAVE64-NEXT: {{  $}}
496   ; WAVE64-NEXT:   S_NOP 0
497   ; WAVE64-NEXT: {{  $}}
498   ; WAVE64-NEXT: bb.2:
499   ; WAVE64-NEXT:   S_NOP 1
500   ; WAVE32-LABEL: name: brcond_si_if_negated
501   ; WAVE32: bb.0:
502   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
503   ; WAVE32-NEXT:   liveins: $vgpr0, $vgpr1
504   ; WAVE32-NEXT: {{  $}}
505   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
506   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
507   ; WAVE32-NEXT:   [[ICMP:%[0-9]+]]:sreg_32_xm0_xexec(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
508   ; WAVE32-NEXT:   [[SI_IF:%[0-9]+]]:sreg_32_xm0_xexec(s64) = SI_IF [[ICMP]](s1), %bb.2, implicit-def $exec, implicit-def $scc, implicit $exec
509   ; WAVE32-NEXT:   G_BR %bb.1
510   ; WAVE32-NEXT: {{  $}}
511   ; WAVE32-NEXT: bb.1:
512   ; WAVE32-NEXT:   successors: %bb.2(0x80000000)
513   ; WAVE32-NEXT: {{  $}}
514   ; WAVE32-NEXT:   S_NOP 0
515   ; WAVE32-NEXT: {{  $}}
516   ; WAVE32-NEXT: bb.2:
517   ; WAVE32-NEXT:   S_NOP 1
518   bb.0:
519     successors: %bb.1
520     liveins: $vgpr0, $vgpr1
521     %0:_(s32) = COPY $vgpr0
522     %1:_(s32) = COPY $vgpr1
523     %2:_(s1) = G_ICMP intpred(ne), %0, %1
524     %3:_(s1), %4:_(s64) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.if), %2
525     %5:_(s1) = G_CONSTANT i1 true
526     %6:_(s1) = G_XOR %3, %5
527     G_BRCOND %6, %bb.2
529   bb.1:
530     S_NOP 0
532   bb.2:
533     S_NOP 1
537 name: brcond_si_if_br_negated
538 body:             |
539   ; WAVE64-LABEL: name: brcond_si_if_br_negated
540   ; WAVE64: bb.0:
541   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
542   ; WAVE64-NEXT:   liveins: $vgpr0, $vgpr1
543   ; WAVE64-NEXT: {{  $}}
544   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
545   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
546   ; WAVE64-NEXT:   [[ICMP:%[0-9]+]]:sreg_64_xexec(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
547   ; WAVE64-NEXT:   [[SI_IF:%[0-9]+]]:sreg_64_xexec(s64) = SI_IF [[ICMP]](s1), %bb.2, implicit-def $exec, implicit-def $scc, implicit $exec
548   ; WAVE64-NEXT:   G_BR %bb.3
549   ; WAVE64-NEXT: {{  $}}
550   ; WAVE64-NEXT: bb.1:
551   ; WAVE64-NEXT:   successors: %bb.2(0x80000000)
552   ; WAVE64-NEXT: {{  $}}
553   ; WAVE64-NEXT:   S_NOP 0
554   ; WAVE64-NEXT: {{  $}}
555   ; WAVE64-NEXT: bb.2:
556   ; WAVE64-NEXT:   successors: %bb.3(0x80000000)
557   ; WAVE64-NEXT: {{  $}}
558   ; WAVE64-NEXT:   S_NOP 1
559   ; WAVE64-NEXT: {{  $}}
560   ; WAVE64-NEXT: bb.3:
561   ; WAVE64-NEXT:   S_NOP 2
562   ; WAVE32-LABEL: name: brcond_si_if_br_negated
563   ; WAVE32: bb.0:
564   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
565   ; WAVE32-NEXT:   liveins: $vgpr0, $vgpr1
566   ; WAVE32-NEXT: {{  $}}
567   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
568   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
569   ; WAVE32-NEXT:   [[ICMP:%[0-9]+]]:sreg_32_xm0_xexec(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]]
570   ; WAVE32-NEXT:   [[SI_IF:%[0-9]+]]:sreg_32_xm0_xexec(s64) = SI_IF [[ICMP]](s1), %bb.2, implicit-def $exec, implicit-def $scc, implicit $exec
571   ; WAVE32-NEXT:   G_BR %bb.3
572   ; WAVE32-NEXT: {{  $}}
573   ; WAVE32-NEXT: bb.1:
574   ; WAVE32-NEXT:   successors: %bb.2(0x80000000)
575   ; WAVE32-NEXT: {{  $}}
576   ; WAVE32-NEXT:   S_NOP 0
577   ; WAVE32-NEXT: {{  $}}
578   ; WAVE32-NEXT: bb.2:
579   ; WAVE32-NEXT:   successors: %bb.3(0x80000000)
580   ; WAVE32-NEXT: {{  $}}
581   ; WAVE32-NEXT:   S_NOP 1
582   ; WAVE32-NEXT: {{  $}}
583   ; WAVE32-NEXT: bb.3:
584   ; WAVE32-NEXT:   S_NOP 2
585   bb.0:
586     successors: %bb.1
587     liveins: $vgpr0, $vgpr1
588     %0:_(s32) = COPY $vgpr0
589     %1:_(s32) = COPY $vgpr1
590     %2:_(s1) = G_ICMP intpred(ne), %0, %1
591     %3:_(s1), %4:_(s64) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.if), %2
592     %5:_(s1) = G_CONSTANT i1 true
593     %6:_(s1) = G_XOR %3, %5
594     G_BRCOND %6, %bb.2
595     G_BR %bb.3
597   bb.1:
598     S_NOP 0
600   bb.2:
601     S_NOP 1
603   bb.3:
604     S_NOP 2
608 name: brcond_si_loop_brcond_negated
609 tracksRegLiveness: true
610 body:             |
611   ; WAVE64-LABEL: name: brcond_si_loop_brcond_negated
612   ; WAVE64: bb.0:
613   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
614   ; WAVE64-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
615   ; WAVE64-NEXT: {{  $}}
616   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
617   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
618   ; WAVE64-NEXT:   [[COPY2:%[0-9]+]]:sreg_64_xexec(s64) = COPY $sgpr0_sgpr1
619   ; WAVE64-NEXT: {{  $}}
620   ; WAVE64-NEXT: bb.1:
621   ; WAVE64-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
622   ; WAVE64-NEXT: {{  $}}
623   ; WAVE64-NEXT:   S_NOP 0
624   ; WAVE64-NEXT:   SI_LOOP [[COPY2]](s64), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
625   ; WAVE64-NEXT:   G_BR %bb.2
626   ; WAVE64-NEXT: {{  $}}
627   ; WAVE64-NEXT: bb.2:
628   ; WAVE64-NEXT:   S_NOP 0
629   ; WAVE32-LABEL: name: brcond_si_loop_brcond_negated
630   ; WAVE32: bb.0:
631   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
632   ; WAVE32-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
633   ; WAVE32-NEXT: {{  $}}
634   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
635   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
636   ; WAVE32-NEXT:   [[COPY2:%[0-9]+]]:sreg_32_xm0_xexec(s64) = COPY $sgpr0_sgpr1
637   ; WAVE32-NEXT: {{  $}}
638   ; WAVE32-NEXT: bb.1:
639   ; WAVE32-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
640   ; WAVE32-NEXT: {{  $}}
641   ; WAVE32-NEXT:   S_NOP 0
642   ; WAVE32-NEXT:   SI_LOOP [[COPY2]](s64), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
643   ; WAVE32-NEXT:   G_BR %bb.2
644   ; WAVE32-NEXT: {{  $}}
645   ; WAVE32-NEXT: bb.2:
646   ; WAVE32-NEXT:   S_NOP 0
647   bb.0:
648     liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
649     %0:_(s32) = COPY $vgpr0
650     %1:_(s32) = COPY $vgpr1
651     %2:_(s64) = COPY $sgpr0_sgpr1
653   bb.1:
654     successors: %bb.1, %bb.2
655     S_NOP 0
656     %3:_(s1) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.loop), %2
657     %4:_(s1) = G_CONSTANT i1 true
658     %5:_(s1) = G_XOR %3, %4
659     G_BRCOND %5, %bb.1
661   bb.2:
662     S_NOP 0
666 name: brcond_si_loop_brcond_br_negated
667 tracksRegLiveness: true
668 body:             |
669   ; WAVE64-LABEL: name: brcond_si_loop_brcond_br_negated
670   ; WAVE64: bb.0:
671   ; WAVE64-NEXT:   successors: %bb.1(0x80000000)
672   ; WAVE64-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
673   ; WAVE64-NEXT: {{  $}}
674   ; WAVE64-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
675   ; WAVE64-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
676   ; WAVE64-NEXT:   [[COPY2:%[0-9]+]]:sreg_64_xexec(s64) = COPY $sgpr0_sgpr1
677   ; WAVE64-NEXT: {{  $}}
678   ; WAVE64-NEXT: bb.1:
679   ; WAVE64-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
680   ; WAVE64-NEXT: {{  $}}
681   ; WAVE64-NEXT:   S_NOP 0
682   ; WAVE64-NEXT:   SI_LOOP [[COPY2]](s64), %bb.2, implicit-def $exec, implicit-def $scc, implicit $exec
683   ; WAVE64-NEXT:   G_BR %bb.1
684   ; WAVE64-NEXT: {{  $}}
685   ; WAVE64-NEXT: bb.2:
686   ; WAVE64-NEXT:   S_NOP 0
687   ; WAVE32-LABEL: name: brcond_si_loop_brcond_br_negated
688   ; WAVE32: bb.0:
689   ; WAVE32-NEXT:   successors: %bb.1(0x80000000)
690   ; WAVE32-NEXT:   liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
691   ; WAVE32-NEXT: {{  $}}
692   ; WAVE32-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
693   ; WAVE32-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
694   ; WAVE32-NEXT:   [[COPY2:%[0-9]+]]:sreg_32_xm0_xexec(s64) = COPY $sgpr0_sgpr1
695   ; WAVE32-NEXT: {{  $}}
696   ; WAVE32-NEXT: bb.1:
697   ; WAVE32-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
698   ; WAVE32-NEXT: {{  $}}
699   ; WAVE32-NEXT:   S_NOP 0
700   ; WAVE32-NEXT:   SI_LOOP [[COPY2]](s64), %bb.2, implicit-def $exec, implicit-def $scc, implicit $exec
701   ; WAVE32-NEXT:   G_BR %bb.1
702   ; WAVE32-NEXT: {{  $}}
703   ; WAVE32-NEXT: bb.2:
704   ; WAVE32-NEXT:   S_NOP 0
705   bb.0:
706     liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
707     %0:_(s32) = COPY $vgpr0
708     %1:_(s32) = COPY $vgpr1
709     %2:_(s64) = COPY $sgpr0_sgpr1
711   bb.1:
712     successors: %bb.1, %bb.2
713     S_NOP 0
714     %3:_(s1) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.loop), %2
715     %4:_(s1) = G_CONSTANT i1 true
716     %5:_(s1) = G_XOR %3, %4
717     G_BRCOND %5, %bb.2
718     G_BR %bb.1
720   bb.2:
721     S_NOP 0