[MachineScheduler] Fix physreg dependencies of ExitSU (#123541)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / regbankselect-mui-regbankselect.mir
blob8f3495ea87eec4992007829e60a5b107d03bee0c
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2 # RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -run-pass=amdgpu-regbankselect %s -verify-machineinstrs -o - | FileCheck %s
4 ---
5 name: uniform_in_vgpr
6 legalized: true
7 body: |
8   bb.0:
9     liveins: $sgpr0, $sgpr1, $vgpr0, $vgpr1
11     ; CHECK-LABEL: name: uniform_in_vgpr
12     ; CHECK: liveins: $sgpr0, $sgpr1, $vgpr0, $vgpr1
13     ; CHECK-NEXT: {{  $}}
14     ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
15     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1
16     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
17     ; CHECK-NEXT: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
18     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY2]](s32), [[COPY3]](s32)
19     ; CHECK-NEXT: [[FPTOUI:%[0-9]+]]:sgpr(s32) = G_FPTOUI [[COPY]](s32)
20     ; CHECK-NEXT: [[ADD:%[0-9]+]]:sgpr(s32) = G_ADD [[FPTOUI]], [[COPY1]]
21     ; CHECK-NEXT: G_STORE [[ADD]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
22     ; CHECK-NEXT: S_ENDPGM 0
23     %0:_(s32) = COPY $sgpr0
24     %1:_(s32) = COPY $sgpr1
25     %2:_(s32) = COPY $vgpr0
26     %3:_(s32) = COPY $vgpr1
27     %4:_(p1) = G_MERGE_VALUES %2(s32), %3(s32)
28     %5:_(s32) = G_FPTOUI %0(s32)
29     %6:_(s32) = G_ADD %5, %1
30     G_STORE %6(s32), %4(p1) :: (store (s32), addrspace 1)
31     S_ENDPGM 0
32 ...
34 ---
35 name: back_to_back_uniform_in_vgpr
36 legalized: true
37 body: |
38   bb.0:
39     liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr0, $vgpr1
41     ; CHECK-LABEL: name: back_to_back_uniform_in_vgpr
42     ; CHECK: liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr0, $vgpr1
43     ; CHECK-NEXT: {{  $}}
44     ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
45     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1
46     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr2
47     ; CHECK-NEXT: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
48     ; CHECK-NEXT: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
49     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY3]](s32), [[COPY4]](s32)
50     ; CHECK-NEXT: [[FADD:%[0-9]+]]:sgpr(s32) = G_FADD [[COPY]], [[COPY1]]
51     ; CHECK-NEXT: [[FPTOUI:%[0-9]+]]:sgpr(s32) = G_FPTOUI [[FADD]](s32)
52     ; CHECK-NEXT: [[ADD:%[0-9]+]]:sgpr(s32) = G_ADD [[FPTOUI]], [[COPY2]]
53     ; CHECK-NEXT: G_STORE [[ADD]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
54     ; CHECK-NEXT: S_ENDPGM 0
55     %0:_(s32) = COPY $sgpr0
56     %1:_(s32) = COPY $sgpr1
57     %2:_(s32) = COPY $sgpr2
58     %3:_(s32) = COPY $vgpr0
59     %4:_(s32) = COPY $vgpr1
60     %5:_(p1) = G_MERGE_VALUES %3(s32), %4(s32)
61     %6:_(s32) = G_FADD %0, %1
62     %7:_(s32) = G_FPTOUI %6(s32)
63     %8:_(s32) = G_ADD %7, %2
64     G_STORE %8(s32), %5(p1) :: (store (s32), addrspace 1)
65     S_ENDPGM 0
66 ...
68 ---
69 name: buffer_load_uniform
70 legalized: true
71 body: |
72   bb.0:
73     liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3, $sgpr4, $vgpr0, $vgpr1
75     ; CHECK-LABEL: name: buffer_load_uniform
76     ; CHECK: liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3, $sgpr4, $vgpr0, $vgpr1
77     ; CHECK-NEXT: {{  $}}
78     ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
79     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1
80     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr2
81     ; CHECK-NEXT: [[COPY3:%[0-9]+]]:sgpr(s32) = COPY $sgpr3
82     ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:sgpr(<4 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32), [[COPY2]](s32), [[COPY3]](s32)
83     ; CHECK-NEXT: [[COPY4:%[0-9]+]]:sgpr(s32) = COPY $sgpr4
84     ; CHECK-NEXT: [[COPY5:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
85     ; CHECK-NEXT: [[COPY6:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
86     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY5]](s32), [[COPY6]](s32)
87     ; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
88     ; CHECK-NEXT: [[AMDGPU_BUFFER_LOAD:%[0-9]+]]:sgpr(<4 x s32>) = G_AMDGPU_BUFFER_LOAD [[BUILD_VECTOR]](<4 x s32>), [[C]](s32), [[COPY4]], [[C]], 0, 0, 0 :: (dereferenceable load (<4 x s32>), align 1, addrspace 8)
89     ; CHECK-NEXT: [[C1:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 1
90     ; CHECK-NEXT: [[UV:%[0-9]+]]:sgpr(s32), [[UV1:%[0-9]+]]:sgpr(s32), [[UV2:%[0-9]+]]:sgpr(s32), [[UV3:%[0-9]+]]:sgpr(s32) = G_UNMERGE_VALUES [[AMDGPU_BUFFER_LOAD]](<4 x s32>)
91     ; CHECK-NEXT: [[ADD:%[0-9]+]]:sgpr(s32) = G_ADD [[UV1]], [[C1]]
92     ; CHECK-NEXT: G_STORE [[ADD]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
93     ; CHECK-NEXT: S_ENDPGM 0
94     %0:_(s32) = COPY $sgpr0
95     %1:_(s32) = COPY $sgpr1
96     %2:_(s32) = COPY $sgpr2
97     %3:_(s32) = COPY $sgpr3
98     %4:_(<4 x s32>) = G_BUILD_VECTOR %0(s32), %1(s32), %2(s32), %3(s32)
99     %5:_(s32) = COPY $sgpr4
100     %6:_(s32) = COPY $vgpr0
101     %7:_(s32) = COPY $vgpr1
102     %8:_(p1) = G_MERGE_VALUES %6(s32), %7(s32)
103     %9:_(s32) = G_CONSTANT i32 0
104     %10:_(<4 x s32>) = G_AMDGPU_BUFFER_LOAD %4(<4 x s32>), %9(s32), %5, %9, 0, 0, 0 :: (dereferenceable load (<4 x s32>), align 1, addrspace 8)
105     %11:_(s32) = G_CONSTANT i32 1
106     %12:_(s32), %13:_(s32), %14:_(s32), %15:_(s32) = G_UNMERGE_VALUES %10(<4 x s32>)
107     %16:_(s32) = G_ADD %13, %11
108     G_STORE %16(s32), %8(p1) :: (store (s32), addrspace 1)
109     S_ENDPGM 0
113 name: buffer_load_divergent
114 legalized: true
115 body: |
116   bb.0:
117     liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3, $vgpr0, $vgpr1, $vgpr2
119     ; CHECK-LABEL: name: buffer_load_divergent
120     ; CHECK: liveins: $sgpr0, $sgpr1, $sgpr2, $sgpr3, $vgpr0, $vgpr1, $vgpr2
121     ; CHECK-NEXT: {{  $}}
122     ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
123     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1
124     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr2
125     ; CHECK-NEXT: [[COPY3:%[0-9]+]]:sgpr(s32) = COPY $sgpr3
126     ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:sgpr(<4 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32), [[COPY2]](s32), [[COPY3]](s32)
127     ; CHECK-NEXT: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
128     ; CHECK-NEXT: [[COPY5:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
129     ; CHECK-NEXT: [[COPY6:%[0-9]+]]:vgpr(s32) = COPY $vgpr2
130     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY5]](s32), [[COPY6]](s32)
131     ; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
132     ; CHECK-NEXT: [[AMDGPU_BUFFER_LOAD:%[0-9]+]]:vgpr(<4 x s32>) = G_AMDGPU_BUFFER_LOAD [[BUILD_VECTOR]](<4 x s32>), [[C]](s32), [[COPY4]], [[C]], 0, 0, 0 :: (dereferenceable load (<4 x s32>), align 1, addrspace 8)
133     ; CHECK-NEXT: [[C1:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 1
134     ; CHECK-NEXT: [[UV:%[0-9]+]]:vgpr(s32), [[UV1:%[0-9]+]]:vgpr(s32), [[UV2:%[0-9]+]]:vgpr(s32), [[UV3:%[0-9]+]]:vgpr(s32) = G_UNMERGE_VALUES [[AMDGPU_BUFFER_LOAD]](<4 x s32>)
135     ; CHECK-NEXT: [[ADD:%[0-9]+]]:vgpr(s32) = G_ADD [[UV1]], [[C1]]
136     ; CHECK-NEXT: G_STORE [[ADD]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
137     ; CHECK-NEXT: S_ENDPGM 0
138     %0:_(s32) = COPY $sgpr0
139     %1:_(s32) = COPY $sgpr1
140     %2:_(s32) = COPY $sgpr2
141     %3:_(s32) = COPY $sgpr3
142     %4:_(<4 x s32>) = G_BUILD_VECTOR %0(s32), %1(s32), %2(s32), %3(s32)
143     %5:_(s32) = COPY $vgpr0
144     %6:_(s32) = COPY $vgpr1
145     %7:_(s32) = COPY $vgpr2
146     %8:_(p1) = G_MERGE_VALUES %6(s32), %7(s32)
147     %9:_(s32) = G_CONSTANT i32 0
148     %10:_(<4 x s32>) = G_AMDGPU_BUFFER_LOAD %4(<4 x s32>), %9(s32), %5, %9, 0, 0, 0 :: (dereferenceable load (<4 x s32>), align 1, addrspace 8)
149     %11:_(s32) = G_CONSTANT i32 1
150     %12:_(s32), %13:_(s32), %14:_(s32), %15:_(s32) = G_UNMERGE_VALUES %10(<4 x s32>)
151     %16:_(s32) = G_ADD %13, %11
152     G_STORE %16(s32), %8(p1) :: (store (s32), addrspace 1)
153     S_ENDPGM 0
157 name: vgpr_and_i64
158 legalized: true
159 body: |
160   bb.0:
161     liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5
163     ; CHECK-LABEL: name: vgpr_and_i64
164     ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5
165     ; CHECK-NEXT: {{  $}}
166     ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
167     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
168     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(s64) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
169     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr2
170     ; CHECK-NEXT: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY $vgpr3
171     ; CHECK-NEXT: [[MV1:%[0-9]+]]:vgpr(s64) = G_MERGE_VALUES [[COPY2]](s32), [[COPY3]](s32)
172     ; CHECK-NEXT: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY $vgpr4
173     ; CHECK-NEXT: [[COPY5:%[0-9]+]]:vgpr(s32) = COPY $vgpr5
174     ; CHECK-NEXT: [[MV2:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY4]](s32), [[COPY5]](s32)
175     ; CHECK-NEXT: [[AND:%[0-9]+]]:vgpr(s64) = G_AND [[MV]], [[MV1]]
176     ; CHECK-NEXT: G_STORE [[AND]](s64), [[MV2]](p1) :: (store (s64), addrspace 1)
177     ; CHECK-NEXT: S_ENDPGM 0
178     %0:_(s32) = COPY $vgpr0
179     %1:_(s32) = COPY $vgpr1
180     %2:_(s64) = G_MERGE_VALUES %0(s32), %1(s32)
181     %3:_(s32) = COPY $vgpr2
182     %4:_(s32) = COPY $vgpr3
183     %5:_(s64) = G_MERGE_VALUES %3(s32), %4(s32)
184     %6:_(s32) = COPY $vgpr4
185     %7:_(s32) = COPY $vgpr5
186     %8:_(p1) = G_MERGE_VALUES %6(s32), %7(s32)
187     %9:_(s64) = G_AND %2, %5
188     G_STORE %9(s64), %8(p1) :: (store (s64), addrspace 1)
189     S_ENDPGM 0
193 name: abs_sgpr_i16
194 legalized: true
195 body: |
196   bb.0:
197     liveins: $sgpr0, $vgpr0, $vgpr1
199     ; CHECK-LABEL: name: abs_sgpr_i16
200     ; CHECK: liveins: $sgpr0, $vgpr0, $vgpr1
201     ; CHECK-NEXT: {{  $}}
202     ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
203     ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:sgpr(s16) = G_TRUNC [[COPY]](s32)
204     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
205     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
206     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
207     ; CHECK-NEXT: [[ABS:%[0-9]+]]:sgpr(s16) = G_ABS [[TRUNC]]
208     ; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:sgpr(s32) = G_ANYEXT [[ABS]](s16)
209     ; CHECK-NEXT: G_STORE [[ANYEXT]](s32), [[MV]](p1) :: (store (s16), addrspace 1)
210     ; CHECK-NEXT: S_ENDPGM 0
211     %0:_(s32) = COPY $sgpr0
212     %1:_(s16) = G_TRUNC %0(s32)
213     %2:_(s32) = COPY $vgpr0
214     %3:_(s32) = COPY $vgpr1
215     %4:_(p1) = G_MERGE_VALUES %2(s32), %3(s32)
216     %5:_(s16) = G_ABS %1
217     %6:_(s32) = G_ANYEXT %5(s16)
218     G_STORE %6(s32), %4(p1) :: (store (s16), addrspace 1)
219     S_ENDPGM 0
223 name: uniform_i1_phi
224 legalized: true
225 tracksRegLiveness: true
226 body: |
227   ; CHECK-LABEL: name: uniform_i1_phi
228   ; CHECK: bb.0:
229   ; CHECK-NEXT:   successors: %bb.1(0x30000000), %bb.2(0x50000000)
230   ; CHECK-NEXT:   liveins: $sgpr0, $sgpr1, $vgpr0, $vgpr1
231   ; CHECK-NEXT: {{  $}}
232   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
233   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
234   ; CHECK-NEXT:   [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
235   ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
236   ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:sgpr(s32) = COPY $sgpr1
237   ; CHECK-NEXT:   [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 6
238   ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:sgpr(s1) = G_ICMP intpred(uge), [[COPY2]](s32), [[C]]
239   ; CHECK-NEXT:   [[C1:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
240   ; CHECK-NEXT:   [[ICMP1:%[0-9]+]]:sgpr(s1) = G_ICMP intpred(ne), [[COPY3]](s32), [[C1]]
241   ; CHECK-NEXT:   G_BRCOND [[ICMP1]](s1), %bb.2
242   ; CHECK-NEXT:   G_BR %bb.1
243   ; CHECK-NEXT: {{  $}}
244   ; CHECK-NEXT: bb.1:
245   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
246   ; CHECK-NEXT: {{  $}}
247   ; CHECK-NEXT:   [[C2:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 1
248   ; CHECK-NEXT:   [[ICMP2:%[0-9]+]]:sgpr(s1) = G_ICMP intpred(ult), [[COPY2]](s32), [[C2]]
249   ; CHECK-NEXT: {{  $}}
250   ; CHECK-NEXT: bb.2:
251   ; CHECK-NEXT:   [[PHI:%[0-9]+]]:sgpr(s1) = G_PHI [[ICMP]](s1), %bb.0, [[ICMP2]](s1), %bb.1
252   ; CHECK-NEXT:   [[SEXT:%[0-9]+]]:sgpr(s32) = G_SEXT [[PHI]](s1)
253   ; CHECK-NEXT:   [[C3:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 2
254   ; CHECK-NEXT:   [[ADD:%[0-9]+]]:sgpr(s32) = G_ADD [[SEXT]], [[C3]]
255   ; CHECK-NEXT:   G_STORE [[ADD]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
256   ; CHECK-NEXT:   S_ENDPGM 0
257   bb.0:
258     successors: %bb.1(0x30000000), %bb.2(0x50000000)
259     liveins: $sgpr0, $sgpr1, $vgpr0, $vgpr1
261     %0:_(s32) = COPY $vgpr0
262     %1:_(s32) = COPY $vgpr1
263     %2:_(p1) = G_MERGE_VALUES %0(s32), %1(s32)
264     %3:_(s32) = COPY $sgpr0
265     %4:_(s32) = COPY $sgpr1
266     %5:_(s32) = G_CONSTANT i32 6
267     %6:_(s1) = G_ICMP intpred(uge), %3(s32), %5
268     %7:_(s32) = G_CONSTANT i32 0
269     %8:_(s1) = G_ICMP intpred(ne), %4(s32), %7
270     G_BRCOND %8(s1), %bb.2
271     G_BR %bb.1
273   bb.1:
274     successors: %bb.2(0x80000000)
276     %9:_(s32) = G_CONSTANT i32 1
277     %10:_(s1) = G_ICMP intpred(ult), %3(s32), %9
279   bb.2:
280     %11:_(s1) = G_PHI %6(s1), %bb.0, %10(s1), %bb.1
281     %12:_(s32) = G_SEXT %11(s1)
282     %13:_(s32) = G_CONSTANT i32 2
283     %14:_(s32) = G_ADD %12, %13
284     G_STORE %14(s32), %2(p1) :: (store (s32), addrspace 1)
285     S_ENDPGM 0
289 name: vcc_to_scc
290 legalized: true
291 body: |
292   bb.0:
293     liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr0, $vgpr1
295     ; CHECK-LABEL: name: vcc_to_scc
296     ; CHECK: liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr0, $vgpr1
297     ; CHECK-NEXT: {{  $}}
298     ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
299     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1
300     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:sgpr(s32) = COPY $sgpr2
301     ; CHECK-NEXT: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
302     ; CHECK-NEXT: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
303     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY3]](s32), [[COPY4]](s32)
304     ; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_FCONSTANT float 0.000000e+00
305     ; CHECK-NEXT: [[FCMP:%[0-9]+]]:sgpr(s1) = G_FCMP floatpred(oeq), [[COPY]](s32), [[C]]
306     ; CHECK-NEXT: [[SELECT:%[0-9]+]]:sgpr(s32) = G_SELECT [[FCMP]](s1), [[COPY1]], [[COPY2]]
307     ; CHECK-NEXT: G_STORE [[SELECT]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
308     ; CHECK-NEXT: S_ENDPGM 0
309     %0:_(s32) = COPY $sgpr0
310     %1:_(s32) = COPY $sgpr1
311     %2:_(s32) = COPY $sgpr2
312     %3:_(s32) = COPY $vgpr0
313     %4:_(s32) = COPY $vgpr1
314     %5:_(p1) = G_MERGE_VALUES %3(s32), %4(s32)
315     %6:_(s32) = G_FCONSTANT float 0.000000e+00
316     %7:_(s1) = G_FCMP floatpred(oeq), %0(s32), %6
317     %8:_(s32) = G_SELECT %7(s1), %1, %2
318     G_STORE %8(s32), %5(p1) :: (store (s32), addrspace 1)
319     S_ENDPGM 0
323 name: scc_to_vcc
324 legalized: true
325 body: |
326   bb.0:
327     liveins: $sgpr0, $vgpr0, $vgpr1, $vgpr2, $vgpr3
329     ; CHECK-LABEL: name: scc_to_vcc
330     ; CHECK: liveins: $sgpr0, $vgpr0, $vgpr1, $vgpr2, $vgpr3
331     ; CHECK-NEXT: {{  $}}
332     ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
333     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
334     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
335     ; CHECK-NEXT: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY $vgpr2
336     ; CHECK-NEXT: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY $vgpr3
337     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY3]](s32), [[COPY4]](s32)
338     ; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
339     ; CHECK-NEXT: [[ICMP:%[0-9]+]]:sgpr(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[C]]
340     ; CHECK-NEXT: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[ICMP]](s1), [[COPY1]], [[COPY2]]
341     ; CHECK-NEXT: G_STORE [[SELECT]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
342     ; CHECK-NEXT: S_ENDPGM 0
343     %0:_(s32) = COPY $sgpr0
344     %1:_(s32) = COPY $vgpr0
345     %2:_(s32) = COPY $vgpr1
346     %3:_(s32) = COPY $vgpr2
347     %4:_(s32) = COPY $vgpr3
348     %5:_(p1) = G_MERGE_VALUES %3(s32), %4(s32)
349     %6:_(s32) = G_CONSTANT i32 0
350     %7:_(s1) = G_ICMP intpred(eq), %0(s32), %6
351     %8:_(s32) = G_SELECT %7(s1), %1, %2
352     G_STORE %8(s32), %5(p1) :: (store (s32), addrspace 1)
353     S_ENDPGM 0
357 name: vgpr_to_vcc_trunc
358 legalized: true
359 body: |
360   bb.0:
361     liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4
363     ; CHECK-LABEL: name: vgpr_to_vcc_trunc
364     ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4
365     ; CHECK-NEXT: {{  $}}
366     ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
367     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
368     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr2
369     ; CHECK-NEXT: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY $vgpr3
370     ; CHECK-NEXT: [[COPY4:%[0-9]+]]:vgpr(s32) = COPY $vgpr4
371     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY3]](s32), [[COPY4]](s32)
372     ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:vcc(s1) = G_TRUNC [[COPY]](s32)
373     ; CHECK-NEXT: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[TRUNC]](s1), [[COPY1]], [[COPY2]]
374     ; CHECK-NEXT: G_STORE [[SELECT]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
375     ; CHECK-NEXT: S_ENDPGM 0
376     %0:_(s32) = COPY $vgpr0
377     %1:_(s32) = COPY $vgpr1
378     %2:_(s32) = COPY $vgpr2
379     %3:_(s32) = COPY $vgpr3
380     %4:_(s32) = COPY $vgpr4
381     %5:_(p1) = G_MERGE_VALUES %3(s32), %4(s32)
382     %6:_(s1) = G_TRUNC %0(s32)
383     %7:_(s32) = G_SELECT %6(s1), %1, %2
384     G_STORE %7(s32), %5(p1) :: (store (s32), addrspace 1)
385     S_ENDPGM 0
389 name: zext
390 legalized: true
391 body: |
392   bb.0:
393     liveins: $sgpr0, $vgpr0, $vgpr1
395     ; CHECK-LABEL: name: zext
396     ; CHECK: liveins: $sgpr0, $vgpr0, $vgpr1
397     ; CHECK-NEXT: {{  $}}
398     ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
399     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
400     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
401     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
402     ; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 10
403     ; CHECK-NEXT: [[ICMP:%[0-9]+]]:sgpr(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[C]]
404     ; CHECK-NEXT: [[ZEXT:%[0-9]+]]:sgpr(s32) = G_ZEXT [[ICMP]](s1)
405     ; CHECK-NEXT: G_STORE [[ZEXT]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
406     ; CHECK-NEXT: S_ENDPGM 0
407     %0:_(s32) = COPY $sgpr0
408     %1:_(s32) = COPY $vgpr0
409     %2:_(s32) = COPY $vgpr1
410     %3:_(p1) = G_MERGE_VALUES %1(s32), %2(s32)
411     %4:_(s32) = G_CONSTANT i32 10
412     %5:_(s1) = G_ICMP intpred(eq), %0(s32), %4
413     %6:_(s32) = G_ZEXT %5(s1)
414     G_STORE %6(s32), %3(p1) :: (store (s32), addrspace 1)
415     S_ENDPGM 0
419 name: sext
420 legalized: true
421 body: |
422   bb.0:
423     liveins: $sgpr0, $vgpr0, $vgpr1
425     ; CHECK-LABEL: name: sext
426     ; CHECK: liveins: $sgpr0, $vgpr0, $vgpr1
427     ; CHECK-NEXT: {{  $}}
428     ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
429     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
430     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
431     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
432     ; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 10
433     ; CHECK-NEXT: [[ICMP:%[0-9]+]]:sgpr(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[C]]
434     ; CHECK-NEXT: [[SEXT:%[0-9]+]]:sgpr(s32) = G_SEXT [[ICMP]](s1)
435     ; CHECK-NEXT: G_STORE [[SEXT]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
436     ; CHECK-NEXT: S_ENDPGM 0
437     %0:_(s32) = COPY $sgpr0
438     %1:_(s32) = COPY $vgpr0
439     %2:_(s32) = COPY $vgpr1
440     %3:_(p1) = G_MERGE_VALUES %1(s32), %2(s32)
441     %4:_(s32) = G_CONSTANT i32 10
442     %5:_(s1) = G_ICMP intpred(eq), %0(s32), %4
443     %6:_(s32) = G_SEXT %5(s1)
444     G_STORE %6(s32), %3(p1) :: (store (s32), addrspace 1)
445     S_ENDPGM 0
449 name: and_i1_vcc
450 legalized: true
451 body: |
452   bb.0:
453     liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
455     ; CHECK-LABEL: name: and_i1_vcc
456     ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
457     ; CHECK-NEXT: {{  $}}
458     ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
459     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
460     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr2
461     ; CHECK-NEXT: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY $vgpr3
462     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY2]](s32), [[COPY3]](s32)
463     ; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 10
464     ; CHECK-NEXT: [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(uge), [[COPY]](s32), [[C]]
465     ; CHECK-NEXT: [[C1:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 20
466     ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:vcc(s1) = G_ICMP intpred(uge), [[COPY1]](s32), [[C1]]
467     ; CHECK-NEXT: [[AND:%[0-9]+]]:vcc(s1) = G_AND [[ICMP]], [[ICMP1]]
468     ; CHECK-NEXT: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[AND]](s1), [[COPY]], [[COPY1]]
469     ; CHECK-NEXT: G_STORE [[SELECT]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
470     ; CHECK-NEXT: S_ENDPGM 0
471     %0:_(s32) = COPY $vgpr0
472     %1:_(s32) = COPY $vgpr1
473     %2:_(s32) = COPY $vgpr2
474     %3:_(s32) = COPY $vgpr3
475     %4:_(p1) = G_MERGE_VALUES %2(s32), %3(s32)
476     %5:_(s32) = G_CONSTANT i32 10
477     %6:_(s1) = G_ICMP intpred(uge), %0(s32), %5
478     %7:_(s32) = G_CONSTANT i32 20
479     %8:_(s1) = G_ICMP intpred(uge), %1(s32), %7
480     %9:_(s1) = G_AND %6, %8
481     %10:_(s32) = G_SELECT %9(s1), %0, %1
482     G_STORE %10(s32), %4(p1) :: (store (s32), addrspace 1)
483     S_ENDPGM 0
487 name: and_i1_scc
488 legalized: true
489 body: |
490   bb.0:
491     liveins: $sgpr0, $sgpr1, $vgpr0, $vgpr1
493     ; CHECK-LABEL: name: and_i1_scc
494     ; CHECK: liveins: $sgpr0, $sgpr1, $vgpr0, $vgpr1
495     ; CHECK-NEXT: {{  $}}
496     ; CHECK-NEXT: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0
497     ; CHECK-NEXT: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1
498     ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
499     ; CHECK-NEXT: [[COPY3:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
500     ; CHECK-NEXT: [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY2]](s32), [[COPY3]](s32)
501     ; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 10
502     ; CHECK-NEXT: [[ICMP:%[0-9]+]]:sgpr(s1) = G_ICMP intpred(uge), [[COPY]](s32), [[C]]
503     ; CHECK-NEXT: [[C1:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 20
504     ; CHECK-NEXT: [[ICMP1:%[0-9]+]]:sgpr(s1) = G_ICMP intpred(uge), [[COPY1]](s32), [[C1]]
505     ; CHECK-NEXT: [[AND:%[0-9]+]]:sgpr(s1) = G_AND [[ICMP]], [[ICMP1]]
506     ; CHECK-NEXT: [[SELECT:%[0-9]+]]:sgpr(s32) = G_SELECT [[AND]](s1), [[COPY]], [[COPY1]]
507     ; CHECK-NEXT: G_STORE [[SELECT]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
508     ; CHECK-NEXT: S_ENDPGM 0
509     %0:_(s32) = COPY $sgpr0
510     %1:_(s32) = COPY $sgpr1
511     %2:_(s32) = COPY $vgpr0
512     %3:_(s32) = COPY $vgpr1
513     %4:_(p1) = G_MERGE_VALUES %2(s32), %3(s32)
514     %5:_(s32) = G_CONSTANT i32 10
515     %6:_(s1) = G_ICMP intpred(uge), %0(s32), %5
516     %7:_(s32) = G_CONSTANT i32 20
517     %8:_(s1) = G_ICMP intpred(uge), %1(s32), %7
518     %9:_(s1) = G_AND %6, %8
519     %10:_(s32) = G_SELECT %9(s1), %0, %1
520     G_STORE %10(s32), %4(p1) :: (store (s32), addrspace 1)
521     S_ENDPGM 0
525 name: divergent_phi_with_uniform_inputs
526 legalized: true
527 tracksRegLiveness: true
528 body: |
529   ; CHECK-LABEL: name: divergent_phi_with_uniform_inputs
530   ; CHECK: bb.0:
531   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
532   ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2
533   ; CHECK-NEXT: {{  $}}
534   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
535   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
536   ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr2
537   ; CHECK-NEXT:   [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
538   ; CHECK-NEXT:   [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
539   ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(eq), [[COPY]](s32), [[C]]
540   ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:sreg_32_xm0_xexec(s1) = COPY [[ICMP]](s1)
541   ; CHECK-NEXT:   [[SI_IF:%[0-9]+]]:sreg_32_xm0_xexec(s32) = SI_IF [[COPY3]](s1), %bb.2, implicit-def $exec, implicit-def $scc, implicit $exec
542   ; CHECK-NEXT:   G_BR %bb.1
543   ; CHECK-NEXT: {{  $}}
544   ; CHECK-NEXT: bb.1:
545   ; CHECK-NEXT:   successors: %bb.2(0x80000000)
546   ; CHECK-NEXT: {{  $}}
547   ; CHECK-NEXT:   [[C1:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 1
548   ; CHECK-NEXT: {{  $}}
549   ; CHECK-NEXT: bb.2:
550   ; CHECK-NEXT:   [[PHI:%[0-9]+]]:vgpr(s32) = G_PHI [[C]](s32), %bb.0, [[C1]](s32), %bb.1
551   ; CHECK-NEXT:   [[COPY4:%[0-9]+]]:sgpr(s32) = COPY [[SI_IF]](s32)
552   ; CHECK-NEXT:   G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.end.cf), [[COPY4]](s32)
553   ; CHECK-NEXT:   G_STORE [[PHI]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
554   ; CHECK-NEXT:   S_ENDPGM 0
555   bb.0:
556     successors: %bb.1(0x40000000), %bb.2(0x40000000)
557     liveins: $vgpr0, $vgpr1, $vgpr2
559     %0:_(s32) = COPY $vgpr0
560     %1:_(s32) = COPY $vgpr1
561     %2:_(s32) = COPY $vgpr2
562     %3:_(p1) = G_MERGE_VALUES %1(s32), %2(s32)
563     %4:_(s32) = G_CONSTANT i32 0
564     %5:sreg_32_xm0_xexec(s1) = G_ICMP intpred(eq), %0(s32), %4
565     %6:sreg_32_xm0_xexec(s32) = SI_IF %5(s1), %bb.2, implicit-def $exec, implicit-def $scc, implicit $exec
566     G_BR %bb.1
568   bb.1:
569     successors: %bb.2(0x80000000)
571     %7:_(s32) = G_CONSTANT i32 1
573   bb.2:
574     %8:_(s32) = G_PHI %4(s32), %bb.0, %7(s32), %bb.1
575     G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.end.cf), %6(s32)
576     G_STORE %8(s32), %3(p1) :: (store (s32), addrspace 1)
577     S_ENDPGM 0
581 name: divergent_because_of_temporal_divergent_use
582 legalized: true
583 tracksRegLiveness: true
584 body: |
585   ; CHECK-LABEL: name: divergent_because_of_temporal_divergent_use
586   ; CHECK: bb.0:
587   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
588   ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2
589   ; CHECK-NEXT: {{  $}}
590   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
591   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
592   ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr2
593   ; CHECK-NEXT:   [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
594   ; CHECK-NEXT:   [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 -1
595   ; CHECK-NEXT:   [[C1:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
596   ; CHECK-NEXT: {{  $}}
597   ; CHECK-NEXT: bb.1:
598   ; CHECK-NEXT:   successors: %bb.2(0x04000000), %bb.1(0x7c000000)
599   ; CHECK-NEXT: {{  $}}
600   ; CHECK-NEXT:   [[PHI:%[0-9]+]]:sgpr(s32) = G_PHI %17(s32), %bb.1, [[C1]](s32), %bb.0
601   ; CHECK-NEXT:   [[PHI1:%[0-9]+]]:sgpr(s32) = G_PHI [[C]](s32), %bb.0, %9(s32), %bb.1
602   ; CHECK-NEXT:   [[C2:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 1
603   ; CHECK-NEXT:   [[ADD:%[0-9]+]]:sgpr(s32) = G_ADD [[PHI1]], [[C2]]
604   ; CHECK-NEXT:   [[UITOFP:%[0-9]+]]:sgpr(s32) = G_UITOFP [[ADD]](s32)
605   ; CHECK-NEXT:   [[FCMP:%[0-9]+]]:vcc(s1) = G_FCMP floatpred(ogt), [[UITOFP]](s32), [[COPY]]
606   ; CHECK-NEXT:   [[INT:%[0-9]+]]:sgpr(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.if.break), [[FCMP]](s1), [[PHI]](s32)
607   ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:sreg_32_xm0_xexec(s32) = COPY [[INT]](s32)
608   ; CHECK-NEXT:   SI_LOOP [[COPY3]](s32), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
609   ; CHECK-NEXT:   G_BR %bb.2
610   ; CHECK-NEXT: {{  $}}
611   ; CHECK-NEXT: bb.2:
612   ; CHECK-NEXT:   [[PHI2:%[0-9]+]]:vgpr(s32) = G_PHI [[ADD]](s32), %bb.1
613   ; CHECK-NEXT:   [[PHI3:%[0-9]+]]:sgpr(s32) = G_PHI [[INT]](s32), %bb.1
614   ; CHECK-NEXT:   G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.end.cf), [[PHI3]](s32)
615   ; CHECK-NEXT:   [[C3:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 10
616   ; CHECK-NEXT:   [[MUL:%[0-9]+]]:vgpr(s32) = G_MUL [[PHI2]], [[C3]]
617   ; CHECK-NEXT:   G_STORE [[MUL]](s32), [[MV]](p1) :: (store (s32), addrspace 1)
618   ; CHECK-NEXT:   S_ENDPGM 0
619   bb.0:
620     successors: %bb.1(0x80000000)
621     liveins: $vgpr0, $vgpr1, $vgpr2
623     %0:_(s32) = COPY $vgpr0
624     %1:_(s32) = COPY $vgpr1
625     %2:_(s32) = COPY $vgpr2
626     %3:_(p1) = G_MERGE_VALUES %1(s32), %2(s32)
627     %4:_(s32) = G_CONSTANT i32 -1
628     %5:_(s32) = G_CONSTANT i32 0
630   bb.1:
631     successors: %bb.2(0x04000000), %bb.1(0x7c000000)
633     %6:_(s32) = G_PHI %7(s32), %bb.1, %5(s32), %bb.0
634     %8:_(s32) = G_PHI %4(s32), %bb.0, %9(s32), %bb.1
635     %10:_(s32) = G_CONSTANT i32 1
636     %9:_(s32) = G_ADD %8, %10
637     %11:_(s32) = G_UITOFP %9(s32)
638     %12:_(s1) = G_FCMP floatpred(ogt), %11(s32), %0
639     %7:sreg_32_xm0_xexec(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.if.break), %12(s1), %6(s32)
640     SI_LOOP %7(s32), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
641     G_BR %bb.2
643   bb.2:
644     %13:_(s32) = G_PHI %9(s32), %bb.1
645     %14:_(s32) = G_PHI %7(s32), %bb.1
646     G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.end.cf), %14(s32)
647     %15:_(s32) = G_CONSTANT i32 10
648     %16:_(s32) = G_MUL %13, %15
649     G_STORE %16(s32), %3(p1) :: (store (s32), addrspace 1)
650     S_ENDPGM 0
654 name: loop_with_2breaks
655 legalized: true
656 tracksRegLiveness: true
657 body: |
658   ; CHECK-LABEL: name: loop_with_2breaks
659   ; CHECK: bb.0:
660   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
661   ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5
662   ; CHECK-NEXT: {{  $}}
663   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
664   ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
665   ; CHECK-NEXT:   [[MV:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
666   ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:vgpr(s32) = COPY $vgpr2
667   ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:vgpr(s32) = COPY $vgpr3
668   ; CHECK-NEXT:   [[MV1:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY2]](s32), [[COPY3]](s32)
669   ; CHECK-NEXT:   [[COPY4:%[0-9]+]]:vgpr(s32) = COPY $vgpr4
670   ; CHECK-NEXT:   [[COPY5:%[0-9]+]]:vgpr(s32) = COPY $vgpr5
671   ; CHECK-NEXT:   [[MV2:%[0-9]+]]:vgpr(p1) = G_MERGE_VALUES [[COPY4]](s32), [[COPY5]](s32)
672   ; CHECK-NEXT:   [[DEF:%[0-9]+]]:sgpr(s32) = G_IMPLICIT_DEF
673   ; CHECK-NEXT:   [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
674   ; CHECK-NEXT:   [[DEF1:%[0-9]+]]:sreg_32(s1) = IMPLICIT_DEF
675   ; CHECK-NEXT: {{  $}}
676   ; CHECK-NEXT: bb.1:
677   ; CHECK-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
678   ; CHECK-NEXT: {{  $}}
679   ; CHECK-NEXT:   [[PHI:%[0-9]+]]:sreg_32(s1) = PHI [[DEF1]](s1), %bb.0, %13(s1), %bb.3
680   ; CHECK-NEXT:   [[PHI1:%[0-9]+]]:sgpr(s32) = G_PHI %68(s32), %bb.3, [[C]](s32), %bb.0
681   ; CHECK-NEXT:   [[PHI2:%[0-9]+]]:sgpr(s32) = G_PHI [[C]](s32), %bb.0, %17(s32), %bb.3
682   ; CHECK-NEXT:   [[COPY6:%[0-9]+]]:sreg_32(s1) = COPY [[PHI]](s1)
683   ; CHECK-NEXT:   [[SEXT:%[0-9]+]]:sgpr(s64) = G_SEXT [[PHI2]](s32)
684   ; CHECK-NEXT:   [[C1:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 2
685   ; CHECK-NEXT:   [[SHL:%[0-9]+]]:sgpr(s64) = G_SHL [[SEXT]], [[C1]](s32)
686   ; CHECK-NEXT:   [[PTR_ADD:%[0-9]+]]:vgpr(p1) = G_PTR_ADD [[MV1]], [[SHL]](s64)
687   ; CHECK-NEXT:   [[LOAD:%[0-9]+]]:vgpr(s32) = G_LOAD [[PTR_ADD]](p1) :: (load (s32), addrspace 1)
688   ; CHECK-NEXT:   [[C2:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
689   ; CHECK-NEXT:   [[ICMP:%[0-9]+]]:vcc(s1) = G_ICMP intpred(ne), [[LOAD]](s32), [[C2]]
690   ; CHECK-NEXT:   [[COPY7:%[0-9]+]]:sreg_32_xm0_xexec(s1) = COPY [[ICMP]](s1)
691   ; CHECK-NEXT:   [[C3:%[0-9]+]]:sgpr(s1) = G_CONSTANT i1 true
692   ; CHECK-NEXT:   [[COPY8:%[0-9]+]]:sreg_32(s1) = COPY [[C3]](s1)
693   ; CHECK-NEXT:   [[S_ANDN2_B32_:%[0-9]+]]:sreg_32(s1) = S_ANDN2_B32 [[COPY6]](s1), $exec_lo, implicit-def $scc
694   ; CHECK-NEXT:   [[S_AND_B32_:%[0-9]+]]:sreg_32(s1) = S_AND_B32 $exec_lo, [[COPY8]](s1), implicit-def $scc
695   ; CHECK-NEXT:   [[S_OR_B32_:%[0-9]+]]:sreg_32(s1) = S_OR_B32 [[S_ANDN2_B32_]](s1), [[S_AND_B32_]](s1), implicit-def $scc
696   ; CHECK-NEXT:   [[COPY9:%[0-9]+]]:sreg_32(s1) = COPY [[S_OR_B32_]](s1)
697   ; CHECK-NEXT:   [[SI_IF:%[0-9]+]]:sreg_32_xm0_xexec(s32) = SI_IF [[COPY7]](s1), %bb.3, implicit-def $exec, implicit-def $scc, implicit $exec
698   ; CHECK-NEXT:   G_BR %bb.2
699   ; CHECK-NEXT: {{  $}}
700   ; CHECK-NEXT: bb.2:
701   ; CHECK-NEXT:   successors: %bb.4(0x40000000), %bb.5(0x40000000)
702   ; CHECK-NEXT: {{  $}}
703   ; CHECK-NEXT:   [[C4:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 2
704   ; CHECK-NEXT:   [[SHL1:%[0-9]+]]:sgpr(s64) = G_SHL [[SEXT]], [[C4]](s32)
705   ; CHECK-NEXT:   [[PTR_ADD1:%[0-9]+]]:vgpr(p1) = G_PTR_ADD [[MV2]], [[SHL1]](s64)
706   ; CHECK-NEXT:   [[LOAD1:%[0-9]+]]:vgpr(s32) = G_LOAD [[PTR_ADD1]](p1) :: (load (s32), addrspace 1)
707   ; CHECK-NEXT:   [[C5:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
708   ; CHECK-NEXT:   [[ICMP1:%[0-9]+]]:vcc(s1) = G_ICMP intpred(ne), [[LOAD1]](s32), [[C5]]
709   ; CHECK-NEXT:   [[COPY10:%[0-9]+]]:sreg_32_xm0_xexec(s1) = COPY [[ICMP1]](s1)
710   ; CHECK-NEXT:   [[C6:%[0-9]+]]:sgpr(s1) = G_CONSTANT i1 true
711   ; CHECK-NEXT:   [[COPY11:%[0-9]+]]:sreg_32(s1) = COPY [[C6]](s1)
712   ; CHECK-NEXT:   [[COPY12:%[0-9]+]]:sreg_32(s1) = COPY [[COPY11]](s1)
713   ; CHECK-NEXT:   [[SI_IF1:%[0-9]+]]:sreg_32_xm0_xexec(s32) = SI_IF [[COPY10]](s1), %bb.5, implicit-def $exec, implicit-def $scc, implicit $exec
714   ; CHECK-NEXT:   G_BR %bb.4
715   ; CHECK-NEXT: {{  $}}
716   ; CHECK-NEXT: bb.3:
717   ; CHECK-NEXT:   successors: %bb.6(0x04000000), %bb.1(0x7c000000)
718   ; CHECK-NEXT: {{  $}}
719   ; CHECK-NEXT:   [[PHI3:%[0-9]+]]:sreg_32(s1) = PHI [[S_OR_B32_]](s1), %bb.1, %43(s1), %bb.5
720   ; CHECK-NEXT:   [[PHI4:%[0-9]+]]:sgpr(s32) = G_PHI %44(s32), %bb.5, [[DEF]](s32), %bb.1
721   ; CHECK-NEXT:   [[COPY13:%[0-9]+]]:sreg_32(s1) = COPY [[PHI3]](s1)
722   ; CHECK-NEXT:   [[COPY14:%[0-9]+]]:sgpr(s32) = COPY [[SI_IF]](s32)
723   ; CHECK-NEXT:   G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.end.cf), [[COPY14]](s32)
724   ; CHECK-NEXT:   [[COPY15:%[0-9]+]]:vcc(s1) = COPY [[COPY13]](s1)
725   ; CHECK-NEXT:   [[INT:%[0-9]+]]:sgpr(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.if.break), [[COPY15]](s1), [[PHI1]](s32)
726   ; CHECK-NEXT:   [[COPY16:%[0-9]+]]:sreg_32_xm0_xexec(s32) = COPY [[INT]](s32)
727   ; CHECK-NEXT:   SI_LOOP [[COPY16]](s32), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
728   ; CHECK-NEXT:   G_BR %bb.6
729   ; CHECK-NEXT: {{  $}}
730   ; CHECK-NEXT: bb.4:
731   ; CHECK-NEXT:   successors: %bb.5(0x80000000)
732   ; CHECK-NEXT: {{  $}}
733   ; CHECK-NEXT:   [[C7:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 2
734   ; CHECK-NEXT:   [[SHL2:%[0-9]+]]:sgpr(s64) = G_SHL [[SEXT]], [[C7]](s32)
735   ; CHECK-NEXT:   [[PTR_ADD2:%[0-9]+]]:vgpr(p1) = G_PTR_ADD [[MV]], [[SHL2]](s64)
736   ; CHECK-NEXT:   [[LOAD2:%[0-9]+]]:vgpr(s32) = G_LOAD [[PTR_ADD2]](p1) :: (load (s32), addrspace 1)
737   ; CHECK-NEXT:   [[C8:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 1
738   ; CHECK-NEXT:   [[ADD:%[0-9]+]]:vgpr(s32) = G_ADD [[LOAD2]], [[C8]]
739   ; CHECK-NEXT:   G_STORE [[ADD]](s32), [[PTR_ADD2]](p1) :: (store (s32), addrspace 1)
740   ; CHECK-NEXT:   [[ADD1:%[0-9]+]]:sgpr(s32) = G_ADD [[PHI2]], [[C8]]
741   ; CHECK-NEXT:   [[C9:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 100
742   ; CHECK-NEXT:   [[ICMP2:%[0-9]+]]:sgpr(s1) = G_ICMP intpred(ult), [[PHI2]](s32), [[C9]]
743   ; CHECK-NEXT:   [[COPY17:%[0-9]+]]:sreg_32(s1) = COPY [[ICMP2]](s1)
744   ; CHECK-NEXT:   [[S_ANDN2_B32_1:%[0-9]+]]:sreg_32(s1) = S_ANDN2_B32 [[COPY12]](s1), $exec_lo, implicit-def $scc
745   ; CHECK-NEXT:   [[S_AND_B32_1:%[0-9]+]]:sreg_32(s1) = S_AND_B32 $exec_lo, [[COPY17]](s1), implicit-def $scc
746   ; CHECK-NEXT:   [[S_OR_B32_1:%[0-9]+]]:sreg_32(s1) = S_OR_B32 [[S_ANDN2_B32_1]](s1), [[S_AND_B32_1]](s1), implicit-def $scc
747   ; CHECK-NEXT: {{  $}}
748   ; CHECK-NEXT: bb.5:
749   ; CHECK-NEXT:   successors: %bb.3(0x80000000)
750   ; CHECK-NEXT: {{  $}}
751   ; CHECK-NEXT:   [[PHI5:%[0-9]+]]:sreg_32(s1) = PHI [[COPY11]](s1), %bb.2, [[S_OR_B32_1]](s1), %bb.4
752   ; CHECK-NEXT:   [[PHI6:%[0-9]+]]:sgpr(s32) = G_PHI [[ADD1]](s32), %bb.4, [[DEF]](s32), %bb.2
753   ; CHECK-NEXT:   [[COPY18:%[0-9]+]]:sreg_32(s1) = COPY [[PHI5]](s1)
754   ; CHECK-NEXT:   [[COPY19:%[0-9]+]]:sreg_32(s1) = COPY [[COPY18]](s1)
755   ; CHECK-NEXT:   [[COPY20:%[0-9]+]]:sgpr(s32) = COPY [[SI_IF1]](s32)
756   ; CHECK-NEXT:   G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.end.cf), [[COPY20]](s32)
757   ; CHECK-NEXT:   [[S_ANDN2_B32_2:%[0-9]+]]:sreg_32(s1) = S_ANDN2_B32 [[COPY9]](s1), $exec_lo, implicit-def $scc
758   ; CHECK-NEXT:   [[S_AND_B32_2:%[0-9]+]]:sreg_32(s1) = S_AND_B32 $exec_lo, [[COPY19]](s1), implicit-def $scc
759   ; CHECK-NEXT:   [[S_OR_B32_2:%[0-9]+]]:sreg_32(s1) = S_OR_B32 [[S_ANDN2_B32_2]](s1), [[S_AND_B32_2]](s1), implicit-def $scc
760   ; CHECK-NEXT:   G_BR %bb.3
761   ; CHECK-NEXT: {{  $}}
762   ; CHECK-NEXT: bb.6:
763   ; CHECK-NEXT:   [[PHI7:%[0-9]+]]:sgpr(s32) = G_PHI [[INT]](s32), %bb.3
764   ; CHECK-NEXT:   G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.end.cf), [[PHI7]](s32)
765   ; CHECK-NEXT:   S_ENDPGM 0
766   bb.0:
767     successors: %bb.1(0x80000000)
768     liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3, $vgpr4, $vgpr5
770     %0:_(s32) = COPY $vgpr0
771     %1:_(s32) = COPY $vgpr1
772     %2:_(p1) = G_MERGE_VALUES %0(s32), %1(s32)
773     %3:_(s32) = COPY $vgpr2
774     %4:_(s32) = COPY $vgpr3
775     %5:_(p1) = G_MERGE_VALUES %3(s32), %4(s32)
776     %6:_(s32) = COPY $vgpr4
777     %7:_(s32) = COPY $vgpr5
778     %8:_(p1) = G_MERGE_VALUES %6(s32), %7(s32)
779     %9:_(s32) = G_IMPLICIT_DEF
780     %10:_(s32) = G_CONSTANT i32 0
781     %11:sreg_32(s1) = IMPLICIT_DEF
783   bb.1:
784     successors: %bb.2(0x40000000), %bb.3(0x40000000)
786     %12:sreg_32(s1) = PHI %11(s1), %bb.0, %13(s1), %bb.3
787     %14:_(s32) = G_PHI %15(s32), %bb.3, %10(s32), %bb.0
788     %16:_(s32) = G_PHI %10(s32), %bb.0, %17(s32), %bb.3
789     %18:sreg_32(s1) = COPY %12(s1)
790     %19:_(s64) = G_SEXT %16(s32)
791     %20:_(s32) = G_CONSTANT i32 2
792     %21:_(s64) = G_SHL %19, %20(s32)
793     %22:_(p1) = G_PTR_ADD %5, %21(s64)
794     %23:_(s32) = G_LOAD %22(p1) :: (load (s32), addrspace 1)
795     %24:_(s32) = G_CONSTANT i32 0
796     %25:sreg_32_xm0_xexec(s1) = G_ICMP intpred(ne), %23(s32), %24
797     %26:_(s1) = G_CONSTANT i1 true
798     %27:sreg_32(s1) = COPY %26(s1)
799     %28:sreg_32(s1) = S_ANDN2_B32 %18(s1), $exec_lo, implicit-def $scc
800     %29:sreg_32(s1) = S_AND_B32 $exec_lo, %27(s1), implicit-def $scc
801     %30:sreg_32(s1) = S_OR_B32 %28(s1), %29(s1), implicit-def $scc
802     %31:sreg_32(s1) = COPY %30(s1)
803     %32:sreg_32_xm0_xexec(s32) = SI_IF %25(s1), %bb.3, implicit-def $exec, implicit-def $scc, implicit $exec
804     G_BR %bb.2
806   bb.2:
807     successors: %bb.4(0x40000000), %bb.5(0x40000000)
809     %33:_(s32) = G_CONSTANT i32 2
810     %34:_(s64) = G_SHL %19, %33(s32)
811     %35:_(p1) = G_PTR_ADD %8, %34(s64)
812     %36:_(s32) = G_LOAD %35(p1) :: (load (s32), addrspace 1)
813     %37:_(s32) = G_CONSTANT i32 0
814     %38:sreg_32_xm0_xexec(s1) = G_ICMP intpred(ne), %36(s32), %37
815     %39:_(s1) = G_CONSTANT i1 true
816     %40:sreg_32(s1) = COPY %39(s1)
817     %41:sreg_32(s1) = COPY %40(s1)
818     %42:sreg_32_xm0_xexec(s32) = SI_IF %38(s1), %bb.5, implicit-def $exec, implicit-def $scc, implicit $exec
819     G_BR %bb.4
821   bb.3:
822     successors: %bb.6(0x04000000), %bb.1(0x7c000000)
824     %13:sreg_32(s1) = PHI %30(s1), %bb.1, %43(s1), %bb.5
825     %17:_(s32) = G_PHI %44(s32), %bb.5, %9(s32), %bb.1
826     %45:sreg_32(s1) = COPY %13(s1)
827     G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.end.cf), %32(s32)
828     %15:sreg_32_xm0_xexec(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.if.break), %45(s1), %14(s32)
829     SI_LOOP %15(s32), %bb.1, implicit-def $exec, implicit-def $scc, implicit $exec
830     G_BR %bb.6
832   bb.4:
833     successors: %bb.5(0x80000000)
835     %46:_(s32) = G_CONSTANT i32 2
836     %47:_(s64) = G_SHL %19, %46(s32)
837     %48:_(p1) = G_PTR_ADD %2, %47(s64)
838     %49:_(s32) = G_LOAD %48(p1) :: (load (s32), addrspace 1)
839     %50:_(s32) = G_CONSTANT i32 1
840     %51:_(s32) = G_ADD %49, %50
841     G_STORE %51(s32), %48(p1) :: (store (s32), addrspace 1)
842     %52:_(s32) = G_ADD %16, %50
843     %53:_(s32) = G_CONSTANT i32 100
844     %54:_(s1) = G_ICMP intpred(ult), %16(s32), %53
845     %55:sreg_32(s1) = COPY %54(s1)
846     %56:sreg_32(s1) = S_ANDN2_B32 %41(s1), $exec_lo, implicit-def $scc
847     %57:sreg_32(s1) = S_AND_B32 $exec_lo, %55(s1), implicit-def $scc
848     %58:sreg_32(s1) = S_OR_B32 %56(s1), %57(s1), implicit-def $scc
850   bb.5:
851     successors: %bb.3(0x80000000)
853     %59:sreg_32(s1) = PHI %40(s1), %bb.2, %58(s1), %bb.4
854     %44:_(s32) = G_PHI %52(s32), %bb.4, %9(s32), %bb.2
855     %60:sreg_32(s1) = COPY %59(s1)
856     %61:sreg_32(s1) = COPY %60(s1)
857     G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.end.cf), %42(s32)
858     %62:sreg_32(s1) = S_ANDN2_B32 %31(s1), $exec_lo, implicit-def $scc
859     %63:sreg_32(s1) = S_AND_B32 $exec_lo, %61(s1), implicit-def $scc
860     %43:sreg_32(s1) = S_OR_B32 %62(s1), %63(s1), implicit-def $scc
861     G_BR %bb.3
863   bb.6:
864     %64:_(s32) = G_PHI %15(s32), %bb.3
865     G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.end.cf), %64(s32)
866     S_ENDPGM 0