xref: /llvm-project/llvm/test/CodeGen/AMDGPU/GlobalISel/combine-fold-binop-into-select.mir (revision 4b9194952d73c34d4d58a5dc3aeddead130b5f0e)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=amdgpu-prelegalizer-combiner -simplify-mir -verify-machineinstrs -o - %s | FileCheck %s
3
4---
5name: no_fold_add_into_select_s32_0_multi_use
6tracksRegLiveness: true
7body: |
8  bb.0:
9    liveins: $vgpr0
10    ; CHECK-LABEL: name: no_fold_add_into_select_s32_0_multi_use
11    ; CHECK: liveins: $vgpr0
12    ; CHECK-NEXT: {{  $}}
13    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
14    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
15    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
16    ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10
17    ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20
18    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty
19    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
20    ; CHECK-NEXT: %add:_(s32) = G_ADD %select, %thirty
21    ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32), implicit %select(s32)
22    %reg:_(s32) = COPY $vgpr0
23    %zero:_(s32) = G_CONSTANT i32 0
24    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
25    %ten:_(s32) = G_CONSTANT i32 10
26    %twenty:_(s32) = G_CONSTANT i32 20
27    %select:_(s32) = G_SELECT %cond, %ten, %twenty
28    %thirty:_(s32) = G_CONSTANT i32 30
29    %add:_(s32) = G_ADD %select, %thirty
30    S_ENDPGM 0, implicit %add, implicit %select
31...
32
33---
34name: no_fold_add_into_select_s32_1_multi_use
35tracksRegLiveness: true
36body: |
37  bb.0:
38    liveins: $vgpr0
39    ; CHECK-LABEL: name: no_fold_add_into_select_s32_1_multi_use
40    ; CHECK: liveins: $vgpr0
41    ; CHECK-NEXT: {{  $}}
42    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
43    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
44    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
45    ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10
46    ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20
47    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty
48    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
49    ; CHECK-NEXT: %add:_(s32) = G_ADD %select, %thirty
50    ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32), implicit %select(s32)
51    %reg:_(s32) = COPY $vgpr0
52    %zero:_(s32) = G_CONSTANT i32 0
53    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
54    %ten:_(s32) = G_CONSTANT i32 10
55    %twenty:_(s32) = G_CONSTANT i32 20
56    %select:_(s32) = G_SELECT %cond, %ten, %twenty
57    %thirty:_(s32) = G_CONSTANT i32 30
58    %add:_(s32) = G_ADD %thirty, %select
59    S_ENDPGM 0, implicit %add, implicit %select
60...
61
62---
63name: no_fold_sub_into_select_s32_nonconst_rhs
64tracksRegLiveness: true
65body: |
66  bb.0:
67    liveins: $vgpr0, $vgpr1
68    ; CHECK-LABEL: name: no_fold_sub_into_select_s32_nonconst_rhs
69    ; CHECK: liveins: $vgpr0, $vgpr1
70    ; CHECK-NEXT: {{  $}}
71    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
72    ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0
73    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
74    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
75    ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10
76    ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20
77    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty
78    ; CHECK-NEXT: %sub:_(s32) = G_SUB %select, %variable
79    ; CHECK-NEXT: S_ENDPGM 0, implicit %sub(s32)
80    %reg:_(s32) = COPY $vgpr0
81    %variable:_(s32) = COPY $vgpr0
82    %zero:_(s32) = G_CONSTANT i32 0
83    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
84    %ten:_(s32) = G_CONSTANT i32 10
85    %twenty:_(s32) = G_CONSTANT i32 20
86    %select:_(s32) = G_SELECT %cond, %ten, %twenty
87    %thirty:_(s32) = G_CONSTANT i32 30
88    %sub:_(s32) = G_SUB %select, %variable
89    S_ENDPGM 0, implicit %sub
90...
91
92---
93name: no_fold_sub_into_select_s32_nonconst_lhs
94tracksRegLiveness: true
95body: |
96  bb.0:
97    liveins: $vgpr0, $vgpr1
98    ; CHECK-LABEL: name: no_fold_sub_into_select_s32_nonconst_lhs
99    ; CHECK: liveins: $vgpr0, $vgpr1
100    ; CHECK-NEXT: {{  $}}
101    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
102    ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0
103    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
104    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
105    ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10
106    ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20
107    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty
108    ; CHECK-NEXT: %sub:_(s32) = G_SUB %variable, %select
109    ; CHECK-NEXT: S_ENDPGM 0, implicit %sub(s32)
110    %reg:_(s32) = COPY $vgpr0
111    %variable:_(s32) = COPY $vgpr0
112    %zero:_(s32) = G_CONSTANT i32 0
113    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
114    %ten:_(s32) = G_CONSTANT i32 10
115    %twenty:_(s32) = G_CONSTANT i32 20
116    %select:_(s32) = G_SELECT %cond, %ten, %twenty
117    %thirty:_(s32) = G_CONSTANT i32 30
118    %sub:_(s32) = G_SUB %variable, %select
119    S_ENDPGM 0, implicit %sub
120...
121
122---
123name: fold_add_into_select_s32_0
124tracksRegLiveness: true
125body: |
126  bb.0:
127    liveins: $vgpr0
128    ; CHECK-LABEL: name: fold_add_into_select_s32_0
129    ; CHECK: liveins: $vgpr0
130    ; CHECK-NEXT: {{  $}}
131    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
132    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
133    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
134    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40
135    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50
136    ; CHECK-NEXT: %add:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]]
137    ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32)
138    %reg:_(s32) = COPY $vgpr0
139    %zero:_(s32) = G_CONSTANT i32 0
140    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
141    %ten:_(s32) = G_CONSTANT i32 10
142    %twenty:_(s32) = G_CONSTANT i32 20
143    %select:_(s32) = G_SELECT %cond, %ten, %twenty
144    %thirty:_(s32) = G_CONSTANT i32 30
145    %add:_(s32) = G_ADD %select, %thirty
146    S_ENDPGM 0, implicit %add
147...
148
149---
150name: fold_add_into_select_s32_1
151tracksRegLiveness: true
152body: |
153  bb.0:
154    liveins: $vgpr0
155    ; CHECK-LABEL: name: fold_add_into_select_s32_1
156    ; CHECK: liveins: $vgpr0
157    ; CHECK-NEXT: {{  $}}
158    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
159    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
160    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
161    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40
162    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50
163    ; CHECK-NEXT: %add:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]]
164    ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32)
165    %reg:_(s32) = COPY $vgpr0
166    %zero:_(s32) = G_CONSTANT i32 0
167    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
168    %ten:_(s32) = G_CONSTANT i32 10
169    %twenty:_(s32) = G_CONSTANT i32 20
170    %select:_(s32) = G_SELECT %cond, %ten, %twenty
171    %thirty:_(s32) = G_CONSTANT i32 30
172    %add:_(s32) = G_ADD %thirty, %select
173    S_ENDPGM 0, implicit %add
174...
175
176---
177name: fold_add_into_select_v2s32_splat
178tracksRegLiveness: true
179body: |
180  bb.0:
181    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
182    ; CHECK-LABEL: name: fold_add_into_select_v2s32_splat
183    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
184    ; CHECK-NEXT: {{  $}}
185    ; CHECK-NEXT: %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1
186    ; CHECK-NEXT: %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3
187    ; CHECK-NEXT: %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0(<2 x s32>), %reg1
188    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40
189    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32)
190    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50
191    ; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C1]](s32), [[C1]](s32)
192    ; CHECK-NEXT: %add:_(<2 x s32>) = G_SELECT %cond(<2 x s1>), [[BUILD_VECTOR]], [[BUILD_VECTOR1]]
193    ; CHECK-NEXT: S_ENDPGM 0, implicit %add(<2 x s32>)
194    %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1
195    %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3
196    %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0, %reg1
197    %ten:_(s32) = G_CONSTANT i32 10
198    %twenty:_(s32) = G_CONSTANT i32 20
199    %ten_vec:_(<2 x s32>) = G_BUILD_VECTOR %ten, %ten
200    %twenty_vec:_(<2 x s32>) = G_BUILD_VECTOR %twenty, %twenty
201    %select:_(<2 x s32>) = G_SELECT %cond, %ten_vec, %twenty_vec
202    %thirty:_(s32) = G_CONSTANT i32 30
203    %thirty_vec:_(<2 x s32>) = G_BUILD_VECTOR %thirty, %thirty
204    %add:_(<2 x s32>) = G_ADD %select, %thirty_vec
205    S_ENDPGM 0, implicit %add
206...
207
208---
209name: fold_add_into_select_v2s32_nonsplat
210tracksRegLiveness: true
211body: |
212  bb.0:
213    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
214    ; CHECK-LABEL: name: fold_add_into_select_v2s32_nonsplat
215    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
216    ; CHECK-NEXT: {{  $}}
217    ; CHECK-NEXT: %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1
218    ; CHECK-NEXT: %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3
219    ; CHECK-NEXT: %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0(<2 x s32>), %reg1
220    ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20
221    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
222    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40
223    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C]](s32), %thirty(s32)
224    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50
225    ; CHECK-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[C1]](s32), %twenty(s32)
226    ; CHECK-NEXT: %add:_(<2 x s32>) = G_SELECT %cond(<2 x s1>), [[BUILD_VECTOR]], [[BUILD_VECTOR1]]
227    ; CHECK-NEXT: S_ENDPGM 0, implicit %add(<2 x s32>)
228    %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1
229    %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3
230    %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0, %reg1
231    %ten:_(s32) = G_CONSTANT i32 10
232    %twenty:_(s32) = G_CONSTANT i32 20
233    %const_vec0:_(<2 x s32>) = G_BUILD_VECTOR %ten, %twenty
234    %const_vec1:_(<2 x s32>) = G_BUILD_VECTOR %twenty, %ten
235    %select:_(<2 x s32>) = G_SELECT %cond, %const_vec0, %const_vec1
236    %thirty:_(s32) = G_CONSTANT i32 30
237    %const_vec3:_(<2 x s32>) = G_BUILD_VECTOR %thirty, %ten
238    %add:_(<2 x s32>) = G_ADD %select, %const_vec3
239    S_ENDPGM 0, implicit %add
240...
241
242---
243name: fold_add_into_select_v2s32_nonsplat_undef
244tracksRegLiveness: true
245body: |
246  bb.0:
247    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
248    ; CHECK-LABEL: name: fold_add_into_select_v2s32_nonsplat_undef
249    ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
250    ; CHECK-NEXT: {{  $}}
251    ; CHECK-NEXT: %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1
252    ; CHECK-NEXT: %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3
253    ; CHECK-NEXT: %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0(<2 x s32>), %reg1
254    ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20
255    ; CHECK-NEXT: %undef:_(s32) = G_IMPLICIT_DEF
256    ; CHECK-NEXT: %const_vec0:_(<2 x s32>) = G_BUILD_VECTOR %undef(s32), %twenty(s32)
257    ; CHECK-NEXT: %const_vec1:_(<2 x s32>) = G_BUILD_VECTOR %twenty(s32), %undef(s32)
258    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
259    ; CHECK-NEXT: %const_vec3:_(<2 x s32>) = G_BUILD_VECTOR %thirty(s32), %undef(s32)
260    ; CHECK-NEXT: [[ADD:%[0-9]+]]:_(<2 x s32>) = G_ADD %const_vec0, %const_vec3
261    ; CHECK-NEXT: [[ADD1:%[0-9]+]]:_(<2 x s32>) = G_ADD %const_vec1, %const_vec3
262    ; CHECK-NEXT: %add:_(<2 x s32>) = G_SELECT %cond(<2 x s1>), [[ADD]], [[ADD1]]
263    ; CHECK-NEXT: S_ENDPGM 0, implicit %add(<2 x s32>)
264    %reg0:_(<2 x s32>) = COPY $vgpr0_vgpr1
265    %reg1:_(<2 x s32>) = COPY $vgpr2_vgpr3
266    %cond:_(<2 x s1>) = G_ICMP intpred(eq), %reg0, %reg1
267    %ten:_(s32) = G_CONSTANT i32 10
268    %twenty:_(s32) = G_CONSTANT i32 20
269    %undef:_(s32) = G_IMPLICIT_DEF
270    %const_vec0:_(<2 x s32>) = G_BUILD_VECTOR %undef, %twenty
271    %const_vec1:_(<2 x s32>) = G_BUILD_VECTOR %twenty, %undef
272    %select:_(<2 x s32>) = G_SELECT %cond, %const_vec0, %const_vec1
273    %thirty:_(s32) = G_CONSTANT i32 30
274    %const_vec3:_(<2 x s32>) = G_BUILD_VECTOR %thirty, %undef
275    %add:_(<2 x s32>) = G_ADD %select, %const_vec3
276    S_ENDPGM 0, implicit %add
277...
278
279---
280name: fold_sub_into_select_s32_0
281tracksRegLiveness: true
282body: |
283  bb.0:
284    liveins: $vgpr0
285    ; CHECK-LABEL: name: fold_sub_into_select_s32_0
286    ; CHECK: liveins: $vgpr0
287    ; CHECK-NEXT: {{  $}}
288    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
289    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
290    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
291    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 -20
292    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 -10
293    ; CHECK-NEXT: %sub:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]]
294    ; CHECK-NEXT: S_ENDPGM 0, implicit %sub(s32)
295    %reg:_(s32) = COPY $vgpr0
296    %zero:_(s32) = G_CONSTANT i32 0
297    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
298    %ten:_(s32) = G_CONSTANT i32 10
299    %twenty:_(s32) = G_CONSTANT i32 20
300    %select:_(s32) = G_SELECT %cond, %ten, %twenty
301    %thirty:_(s32) = G_CONSTANT i32 30
302    %sub:_(s32) = G_SUB %select, %thirty
303    S_ENDPGM 0, implicit %sub
304...
305
306---
307name: fold_sub_into_select_s32_1
308tracksRegLiveness: true
309body: |
310  bb.0:
311    liveins: $vgpr0
312    ; CHECK-LABEL: name: fold_sub_into_select_s32_1
313    ; CHECK: liveins: $vgpr0
314    ; CHECK-NEXT: {{  $}}
315    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
316    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
317    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
318    ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10
319    ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20
320    ; CHECK-NEXT: %sub:_(s32) = G_SELECT %cond(s1), %twenty, %ten
321    ; CHECK-NEXT: S_ENDPGM 0, implicit %sub(s32)
322    %reg:_(s32) = COPY $vgpr0
323    %zero:_(s32) = G_CONSTANT i32 0
324    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
325    %ten:_(s32) = G_CONSTANT i32 10
326    %twenty:_(s32) = G_CONSTANT i32 20
327    %select:_(s32) = G_SELECT %cond, %ten, %twenty
328    %thirty:_(s32) = G_CONSTANT i32 30
329    %sub:_(s32) = G_SUB %thirty, %select
330    S_ENDPGM 0, implicit %sub
331...
332
333---
334name: fold_ptr_add_into_select_p3_0
335tracksRegLiveness: true
336body: |
337  bb.0:
338    liveins: $vgpr0
339    ; CHECK-LABEL: name: fold_ptr_add_into_select_p3_0
340    ; CHECK: liveins: $vgpr0
341    ; CHECK-NEXT: {{  $}}
342    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
343    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
344    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
345    ; CHECK-NEXT: [[C:%[0-9]+]]:_(p3) = G_CONSTANT i32 40
346    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(p3) = G_CONSTANT i32 50
347    ; CHECK-NEXT: %ptr_add:_(p3) = G_SELECT %cond(s1), [[C]], [[C1]]
348    ; CHECK-NEXT: S_ENDPGM 0, implicit %ptr_add(p3)
349    %reg:_(s32) = COPY $vgpr0
350    %zero:_(s32) = G_CONSTANT i32 0
351    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
352    %ten:_(p3) = G_CONSTANT i32 10
353    %twenty:_(p3) = G_CONSTANT i32 20
354    %select:_(p3) = G_SELECT %cond, %ten, %twenty
355    %thirty:_(s32) = G_CONSTANT i32 30
356    %ptr_add:_(p3) = G_PTR_ADD %select, %thirty
357    S_ENDPGM 0, implicit %ptr_add
358...
359
360---
361name: fold_ptr_add_into_select_p3_1
362tracksRegLiveness: true
363body: |
364  bb.0:
365    liveins: $vgpr0
366    ; CHECK-LABEL: name: fold_ptr_add_into_select_p3_1
367    ; CHECK: liveins: $vgpr0
368    ; CHECK-NEXT: {{  $}}
369    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
370    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
371    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
372    ; CHECK-NEXT: [[C:%[0-9]+]]:_(p3) = G_CONSTANT i32 40
373    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(p3) = G_CONSTANT i32 50
374    ; CHECK-NEXT: %ptr_add:_(p3) = G_SELECT %cond(s1), [[C]], [[C1]]
375    ; CHECK-NEXT: S_ENDPGM 0, implicit %ptr_add(p3)
376    %reg:_(s32) = COPY $vgpr0
377    %zero:_(s32) = G_CONSTANT i32 0
378    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
379    %ten:_(s32) = G_CONSTANT i32 10
380    %twenty:_(s32) = G_CONSTANT i32 20
381    %select:_(s32) = G_SELECT %cond, %ten, %twenty
382    %thirty:_(p3) = G_CONSTANT i32 30
383    %ptr_add:_(p3) = G_PTR_ADD %thirty, %select
384    S_ENDPGM 0, implicit %ptr_add
385...
386
387---
388name: fold_shl_into_select_s64_0
389tracksRegLiveness: true
390body: |
391  bb.0:
392    liveins: $vgpr0
393    ; CHECK-LABEL: name: fold_shl_into_select_s64_0
394    ; CHECK: liveins: $vgpr0
395    ; CHECK-NEXT: {{  $}}
396    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
397    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
398    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
399    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1280
400    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2560
401    ; CHECK-NEXT: %shl:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]]
402    ; CHECK-NEXT: S_ENDPGM 0, implicit %shl(s64)
403    %reg:_(s32) = COPY $vgpr0
404    %zero:_(s32) = G_CONSTANT i32 0
405    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
406    %ten:_(s64) = G_CONSTANT i64 10
407    %twenty:_(s64) = G_CONSTANT i64 20
408    %select:_(s64) = G_SELECT %cond, %ten, %twenty
409    %seven:_(s32) = G_CONSTANT i32 7
410    %shl:_(s64) = G_SHL %select, %seven
411    S_ENDPGM 0, implicit %shl
412...
413
414---
415name: fold_shl_into_select_s64_1
416tracksRegLiveness: true
417body: |
418  bb.0:
419    liveins: $vgpr0
420    ; CHECK-LABEL: name: fold_shl_into_select_s64_1
421    ; CHECK: liveins: $vgpr0
422    ; CHECK-NEXT: {{  $}}
423    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
424    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
425    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
426    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8192
427    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 524288
428    ; CHECK-NEXT: %shl:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]]
429    ; CHECK-NEXT: S_ENDPGM 0, implicit %shl(s64)
430    %reg:_(s32) = COPY $vgpr0
431    %zero:_(s32) = G_CONSTANT i32 0
432    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
433    %ten:_(s32) = G_CONSTANT i32 10
434    %sixteen:_(s32) = G_CONSTANT i32 16
435    %select:_(s32) = G_SELECT %cond, %ten, %sixteen
436    %eight:_(s64) = G_CONSTANT i64 8
437    %shl:_(s64) = G_SHL %eight, %select
438    S_ENDPGM 0, implicit %shl
439...
440
441---
442name: fold_and_variable_into_select_zero_neg1_s32
443tracksRegLiveness: true
444body: |
445  bb.0:
446    liveins: $vgpr0, $vgpr1
447    ; CHECK-LABEL: name: fold_and_variable_into_select_zero_neg1_s32
448    ; CHECK: liveins: $vgpr0, $vgpr1
449    ; CHECK-NEXT: {{  $}}
450    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
451    ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0
452    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
453    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(ne), %reg(s32), %zero
454    ; CHECK-NEXT: %select:_(s32) = G_SEXT %cond(s1)
455    ; CHECK-NEXT: %and:_(s32) = G_AND %select, %variable
456    ; CHECK-NEXT: S_ENDPGM 0, implicit %and(s32)
457    %reg:_(s32) = COPY $vgpr0
458    %variable:_(s32) = COPY $vgpr0
459    %zero:_(s32) = G_CONSTANT i32 0
460    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
461    %neg1:_(s32) = G_CONSTANT i32 -1
462    %select:_(s32) = G_SELECT %cond, %zero, %neg1
463    %and:_(s32) = G_AND %select, %variable
464    S_ENDPGM 0, implicit %and
465...
466
467---
468name: fold_and_variable_into_select_neg1_zero_s32
469tracksRegLiveness: true
470body: |
471  bb.0:
472    liveins: $vgpr0, $vgpr1
473    ; CHECK-LABEL: name: fold_and_variable_into_select_neg1_zero_s32
474    ; CHECK: liveins: $vgpr0, $vgpr1
475    ; CHECK-NEXT: {{  $}}
476    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
477    ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0
478    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
479    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
480    ; CHECK-NEXT: %select:_(s32) = G_SEXT %cond(s1)
481    ; CHECK-NEXT: %and:_(s32) = G_AND %select, %variable
482    ; CHECK-NEXT: S_ENDPGM 0, implicit %and(s32)
483    %reg:_(s32) = COPY $vgpr0
484    %variable:_(s32) = COPY $vgpr0
485    %zero:_(s32) = G_CONSTANT i32 0
486    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
487    %neg1:_(s32) = G_CONSTANT i32 -1
488    %select:_(s32) = G_SELECT %cond, %neg1, %zero
489    %and:_(s32) = G_AND %select, %variable
490    S_ENDPGM 0, implicit %and
491...
492
493---
494name: fold_or_variable_into_select_zero_neg1_s32
495tracksRegLiveness: true
496body: |
497  bb.0:
498    liveins: $vgpr0, $vgpr1
499    ; CHECK-LABEL: name: fold_or_variable_into_select_zero_neg1_s32
500    ; CHECK: liveins: $vgpr0, $vgpr1
501    ; CHECK-NEXT: {{  $}}
502    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
503    ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0
504    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
505    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(ne), %reg(s32), %zero
506    ; CHECK-NEXT: %select:_(s32) = G_SEXT %cond(s1)
507    ; CHECK-NEXT: %or:_(s32) = G_OR %select, %variable
508    ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32)
509    %reg:_(s32) = COPY $vgpr0
510    %variable:_(s32) = COPY $vgpr0
511    %zero:_(s32) = G_CONSTANT i32 0
512    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
513    %neg1:_(s32) = G_CONSTANT i32 -1
514    %select:_(s32) = G_SELECT %cond, %zero, %neg1
515    %or:_(s32) = G_OR %select, %variable
516    S_ENDPGM 0, implicit %or
517...
518
519---
520name: fold_or_variable_into_select_neg1_zero_s32
521tracksRegLiveness: true
522body: |
523  bb.0:
524    liveins: $vgpr0, $vgpr1
525    ; CHECK-LABEL: name: fold_or_variable_into_select_neg1_zero_s32
526    ; CHECK: liveins: $vgpr0, $vgpr1
527    ; CHECK-NEXT: {{  $}}
528    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
529    ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0
530    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
531    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
532    ; CHECK-NEXT: %select:_(s32) = G_SEXT %cond(s1)
533    ; CHECK-NEXT: %or:_(s32) = G_OR %select, %variable
534    ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32)
535    %reg:_(s32) = COPY $vgpr0
536    %variable:_(s32) = COPY $vgpr0
537    %zero:_(s32) = G_CONSTANT i32 0
538    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
539    %neg1:_(s32) = G_CONSTANT i32 -1
540    %select:_(s32) = G_SELECT %cond, %neg1, %zero
541    %or:_(s32) = G_OR %select, %variable
542    S_ENDPGM 0, implicit %or
543...
544
545---
546name: fold_and_variable_into_select_undef_neg1_s32
547tracksRegLiveness: true
548body: |
549  bb.0:
550    liveins: $vgpr0, $vgpr1
551    ; CHECK-LABEL: name: fold_and_variable_into_select_undef_neg1_s32
552    ; CHECK: liveins: $vgpr0, $vgpr1
553    ; CHECK-NEXT: {{  $}}
554    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
555    ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0
556    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
557    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
558    ; CHECK-NEXT: %undef:_(s32) = G_IMPLICIT_DEF
559    ; CHECK-NEXT: %neg1:_(s32) = G_CONSTANT i32 -1
560    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %undef, %neg1
561    ; CHECK-NEXT: %and:_(s32) = G_AND %select, %variable
562    ; CHECK-NEXT: S_ENDPGM 0, implicit %and(s32)
563    %reg:_(s32) = COPY $vgpr0
564    %variable:_(s32) = COPY $vgpr0
565    %zero:_(s32) = G_CONSTANT i32 0
566    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
567    %undef:_(s32) = G_IMPLICIT_DEF
568    %neg1:_(s32) = G_CONSTANT i32 -1
569    %select:_(s32) = G_SELECT %cond, %undef, %neg1
570    %and:_(s32) = G_AND %select, %variable
571    S_ENDPGM 0, implicit %and
572...
573
574---
575name: fold_and_variable_into_select_undef_zero_s32
576tracksRegLiveness: true
577body: |
578  bb.0:
579    liveins: $vgpr0, $vgpr1
580    ; CHECK-LABEL: name: fold_and_variable_into_select_undef_zero_s32
581    ; CHECK: liveins: $vgpr0, $vgpr1
582    ; CHECK-NEXT: {{  $}}
583    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
584    ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0
585    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
586    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
587    ; CHECK-NEXT: %undef:_(s32) = G_IMPLICIT_DEF
588    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %undef, %zero
589    ; CHECK-NEXT: %and:_(s32) = G_AND %select, %variable
590    ; CHECK-NEXT: S_ENDPGM 0, implicit %and(s32)
591    %reg:_(s32) = COPY $vgpr0
592    %variable:_(s32) = COPY $vgpr0
593    %zero:_(s32) = G_CONSTANT i32 0
594    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
595    %undef:_(s32) = G_IMPLICIT_DEF
596    %select:_(s32) = G_SELECT %cond, %undef, %zero
597    %and:_(s32) = G_AND %select, %variable
598    S_ENDPGM 0, implicit %and
599...
600
601---
602name: fold_or_variable_into_select_neg1_fpzero_s32
603tracksRegLiveness: true
604body: |
605  bb.0:
606    liveins: $vgpr0, $vgpr1
607    ; CHECK-LABEL: name: fold_or_variable_into_select_neg1_fpzero_s32
608    ; CHECK: liveins: $vgpr0, $vgpr1
609    ; CHECK-NEXT: {{  $}}
610    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
611    ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0
612    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
613    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
614    ; CHECK-NEXT: %neg1:_(s32) = G_CONSTANT i32 -1
615    ; CHECK-NEXT: %fpzero:_(s32) = G_FCONSTANT float 0.000000e+00
616    ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR %fpzero, %variable
617    ; CHECK-NEXT: %or:_(s32) = G_SELECT %cond(s1), %neg1, [[OR]]
618    ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32)
619    %reg:_(s32) = COPY $vgpr0
620    %variable:_(s32) = COPY $vgpr0
621    %zero:_(s32) = G_CONSTANT i32 0
622    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
623    %neg1:_(s32) = G_CONSTANT i32 -1
624    %fpzero:_(s32) = G_FCONSTANT float 0.0
625    %select:_(s32) = G_SELECT %cond, %neg1, %fpzero
626    %or:_(s32) = G_OR %select, %variable
627    S_ENDPGM 0, implicit %or
628...
629
630---
631name: no_fold_or_variable_into_select_neg1_fpnegzero_s32
632tracksRegLiveness: true
633body: |
634  bb.0:
635    liveins: $vgpr0, $vgpr1
636    ; CHECK-LABEL: name: no_fold_or_variable_into_select_neg1_fpnegzero_s32
637    ; CHECK: liveins: $vgpr0, $vgpr1
638    ; CHECK-NEXT: {{  $}}
639    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
640    ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0
641    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
642    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
643    ; CHECK-NEXT: %neg1:_(s32) = G_CONSTANT i32 -1
644    ; CHECK-NEXT: %fpzero:_(s32) = G_FCONSTANT float -0.000000e+00
645    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %neg1, %fpzero
646    ; CHECK-NEXT: %or:_(s32) = G_OR %select, %variable
647    ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32)
648    %reg:_(s32) = COPY $vgpr0
649    %variable:_(s32) = COPY $vgpr0
650    %zero:_(s32) = G_CONSTANT i32 0
651    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
652    %neg1:_(s32) = G_CONSTANT i32 -1
653    %fpzero:_(s32) = G_FCONSTANT float -0.0
654    %select:_(s32) = G_SELECT %cond, %neg1, %fpzero
655    %or:_(s32) = G_OR %select, %variable
656    S_ENDPGM 0, implicit %or
657...
658
659---
660name: no_fold_or_variable_into_select_neg1_other_const_s32
661tracksRegLiveness: true
662body: |
663  bb.0:
664    liveins: $vgpr0, $vgpr1
665    ; CHECK-LABEL: name: no_fold_or_variable_into_select_neg1_other_const_s32
666    ; CHECK: liveins: $vgpr0, $vgpr1
667    ; CHECK-NEXT: {{  $}}
668    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
669    ; CHECK-NEXT: %variable:_(s32) = COPY $vgpr0
670    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
671    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
672    ; CHECK-NEXT: %otherconst:_(s32) = G_CONSTANT i32 123
673    ; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT %cond(s1)
674    ; CHECK-NEXT: %select:_(s32) = G_OR [[SEXT]], %otherconst
675    ; CHECK-NEXT: %or:_(s32) = G_OR %select, %variable
676    ; CHECK-NEXT: S_ENDPGM 0, implicit %or(s32)
677    %reg:_(s32) = COPY $vgpr0
678    %variable:_(s32) = COPY $vgpr0
679    %zero:_(s32) = G_CONSTANT i32 0
680    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
681    %neg1:_(s32) = G_CONSTANT i32 -1
682    %otherconst:_(s32) = G_CONSTANT i32 123
683    %select:_(s32) = G_SELECT %cond, %neg1, %otherconst
684    %or:_(s32) = G_OR %select, %variable
685    S_ENDPGM 0, implicit %or
686...
687
688---
689name: fold_xor_into_select_s32_0
690tracksRegLiveness: true
691body: |
692  bb.0:
693    liveins: $vgpr0
694    ; CHECK-LABEL: name: fold_xor_into_select_s32_0
695    ; CHECK: liveins: $vgpr0
696    ; CHECK-NEXT: {{  $}}
697    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
698    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
699    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
700    ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10
701    ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20
702    ; CHECK-NEXT: %xor:_(s32) = G_SELECT %cond(s1), %twenty, %ten
703    ; CHECK-NEXT: S_ENDPGM 0, implicit %xor(s32)
704    %reg:_(s32) = COPY $vgpr0
705    %zero:_(s32) = G_CONSTANT i32 0
706    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
707    %ten:_(s32) = G_CONSTANT i32 10
708    %twenty:_(s32) = G_CONSTANT i32 20
709    %select:_(s32) = G_SELECT %cond, %ten, %twenty
710    %thirty:_(s32) = G_CONSTANT i32 30
711    %xor:_(s32) = G_XOR %select, %thirty
712    S_ENDPGM 0, implicit %xor
713...
714
715---
716name: fold_sdiv_into_select_s32_0
717tracksRegLiveness: true
718body: |
719  bb.0:
720    liveins: $vgpr0
721    ; CHECK-LABEL: name: fold_sdiv_into_select_s32_0
722    ; CHECK: liveins: $vgpr0
723    ; CHECK-NEXT: {{  $}}
724    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
725    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
726    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
727    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 50
728    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 21
729    ; CHECK-NEXT: %sdiv:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]]
730    ; CHECK-NEXT: S_ENDPGM 0, implicit %sdiv(s32)
731    %reg:_(s32) = COPY $vgpr0
732    %zero:_(s32) = G_CONSTANT i32 0
733    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
734    %hundred:_(s32) = G_CONSTANT i32 100
735    %fortytwo:_(s32) = G_CONSTANT i32 42
736    %select:_(s32) = G_SELECT %cond, %hundred, %fortytwo
737    %two:_(s32) = G_CONSTANT i32 2
738    %sdiv:_(s32) = G_SDIV %select, %two
739    S_ENDPGM 0, implicit %sdiv
740...
741
742---
743name: fold_srem_into_select_s32_0
744tracksRegLiveness: true
745body: |
746  bb.0:
747    liveins: $vgpr0
748    ; CHECK-LABEL: name: fold_srem_into_select_s32_0
749    ; CHECK: liveins: $vgpr0
750    ; CHECK-NEXT: {{  $}}
751    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
752    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
753    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
754    ; CHECK-NEXT: %srem:_(s32) = G_ZEXT %cond(s1)
755    ; CHECK-NEXT: S_ENDPGM 0, implicit %srem(s32)
756    %reg:_(s32) = COPY $vgpr0
757    %zero:_(s32) = G_CONSTANT i32 0
758    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
759    %hundred:_(s32) = G_CONSTANT i32 100
760    %fortytwo:_(s32) = G_CONSTANT i32 42
761    %select:_(s32) = G_SELECT %cond, %hundred, %fortytwo
762    %three:_(s32) = G_CONSTANT i32 3
763    %srem:_(s32) = G_SREM %select, %three
764    S_ENDPGM 0, implicit %srem
765...
766
767---
768name: fold_udiv_into_select_s32_0
769tracksRegLiveness: true
770body: |
771  bb.0:
772    liveins: $vgpr0
773    ; CHECK-LABEL: name: fold_udiv_into_select_s32_0
774    ; CHECK: liveins: $vgpr0
775    ; CHECK-NEXT: {{  $}}
776    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
777    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
778    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
779    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 50
780    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 21
781    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]]
782    ; CHECK-NEXT: S_ENDPGM 0, implicit [[SELECT]](s32)
783    %reg:_(s32) = COPY $vgpr0
784    %zero:_(s32) = G_CONSTANT i32 0
785    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
786    %hundred:_(s32) = G_CONSTANT i32 100
787    %fortytwo:_(s32) = G_CONSTANT i32 42
788    %select:_(s32) = G_SELECT %cond, %hundred, %fortytwo
789    %two:_(s32) = G_CONSTANT i32 2
790    %udiv:_(s32) = G_UDIV %select, %two
791    S_ENDPGM 0, implicit %udiv
792...
793
794---
795name: fold_urem_into_select_s32_0
796tracksRegLiveness: true
797body: |
798  bb.0:
799    liveins: $vgpr0
800    ; CHECK-LABEL: name: fold_urem_into_select_s32_0
801    ; CHECK: liveins: $vgpr0
802    ; CHECK-NEXT: {{  $}}
803    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
804    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
805    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
806    ; CHECK-NEXT: %udiv:_(s32) = G_ZEXT %cond(s1)
807    ; CHECK-NEXT: S_ENDPGM 0, implicit %udiv(s32)
808    %reg:_(s32) = COPY $vgpr0
809    %zero:_(s32) = G_CONSTANT i32 0
810    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
811    %hundred:_(s32) = G_CONSTANT i32 100
812    %fortytwo:_(s32) = G_CONSTANT i32 42
813    %select:_(s32) = G_SELECT %cond, %hundred, %fortytwo
814    %three:_(s32) = G_CONSTANT i32 3
815    %udiv:_(s32) = G_UREM %select, %three
816    S_ENDPGM 0, implicit %udiv
817...
818
819---
820name: fold_lshr_into_select_s64_0
821tracksRegLiveness: true
822body: |
823  bb.0:
824    liveins: $vgpr0
825    ; CHECK-LABEL: name: fold_lshr_into_select_s64_0
826    ; CHECK: liveins: $vgpr0
827    ; CHECK-NEXT: {{  $}}
828    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
829    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
830    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
831    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 2
832    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 5
833    ; CHECK-NEXT: %lshr:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]]
834    ; CHECK-NEXT: S_ENDPGM 0, implicit %lshr(s64)
835    %reg:_(s32) = COPY $vgpr0
836    %zero:_(s32) = G_CONSTANT i32 0
837    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
838    %ten:_(s64) = G_CONSTANT i64 10
839    %twenty:_(s64) = G_CONSTANT i64 20
840    %select:_(s64) = G_SELECT %cond, %ten, %twenty
841    %two:_(s32) = G_CONSTANT i32 2
842    %lshr:_(s64) = G_LSHR %select, %two
843    S_ENDPGM 0, implicit %lshr
844...
845
846---
847name: fold_lshr_into_select_s64_1
848tracksRegLiveness: true
849body: |
850  bb.0:
851    liveins: $vgpr0
852    ; CHECK-LABEL: name: fold_lshr_into_select_s64_1
853    ; CHECK: liveins: $vgpr0
854    ; CHECK-NEXT: {{  $}}
855    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
856    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
857    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
858    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1012
859    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 253
860    ; CHECK-NEXT: %lshr:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]]
861    ; CHECK-NEXT: S_ENDPGM 0, implicit %lshr(s64)
862    %reg:_(s32) = COPY $vgpr0
863    %zero:_(s32) = G_CONSTANT i32 0
864    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
865    %three:_(s32) = G_CONSTANT i32 3
866    %five:_(s32) = G_CONSTANT i32 5
867    %select:_(s32) = G_SELECT %cond, %three, %five
868    %val:_(s64) = G_CONSTANT i64 8096
869    %lshr:_(s64) = G_LSHR %val, %select
870    S_ENDPGM 0, implicit %lshr
871...
872
873---
874name: fold_ashr_into_select_s64_0
875tracksRegLiveness: true
876body: |
877  bb.0:
878    liveins: $vgpr0
879    ; CHECK-LABEL: name: fold_ashr_into_select_s64_0
880    ; CHECK: liveins: $vgpr0
881    ; CHECK-NEXT: {{  $}}
882    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
883    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
884    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
885    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 2
886    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 5
887    ; CHECK-NEXT: %ashr:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]]
888    ; CHECK-NEXT: S_ENDPGM 0, implicit %ashr(s64)
889    %reg:_(s32) = COPY $vgpr0
890    %zero:_(s32) = G_CONSTANT i32 0
891    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
892    %ten:_(s64) = G_CONSTANT i64 10
893    %twenty:_(s64) = G_CONSTANT i64 20
894    %select:_(s64) = G_SELECT %cond, %ten, %twenty
895    %two:_(s32) = G_CONSTANT i32 2
896    %ashr:_(s64) = G_ASHR %select, %two
897    S_ENDPGM 0, implicit %ashr
898...
899
900---
901name: fold_ashr_into_select_s64_1
902tracksRegLiveness: true
903body: |
904  bb.0:
905    liveins: $vgpr0
906    ; CHECK-LABEL: name: fold_ashr_into_select_s64_1
907    ; CHECK: liveins: $vgpr0
908    ; CHECK-NEXT: {{  $}}
909    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
910    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
911    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
912    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 -1012
913    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 -253
914    ; CHECK-NEXT: %ashr:_(s64) = G_SELECT %cond(s1), [[C]], [[C1]]
915    ; CHECK-NEXT: S_ENDPGM 0, implicit %ashr(s64)
916    %reg:_(s32) = COPY $vgpr0
917    %zero:_(s32) = G_CONSTANT i32 0
918    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
919    %three:_(s32) = G_CONSTANT i32 3
920    %five:_(s32) = G_CONSTANT i32 5
921    %select:_(s32) = G_SELECT %cond, %three, %five
922    %val:_(s64) = G_CONSTANT i64 -8096
923    %ashr:_(s64) = G_ASHR %val, %select
924    S_ENDPGM 0, implicit %ashr
925...
926
927---
928name: fold_smin_into_select_s32_0
929tracksRegLiveness: true
930body: |
931  bb.0:
932    liveins: $vgpr0
933    ; CHECK-LABEL: name: fold_smin_into_select_s32_0
934    ; CHECK: liveins: $vgpr0
935    ; CHECK-NEXT: {{  $}}
936    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
937    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
938    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
939    ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10
940    ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20
941    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty
942    ; CHECK-NEXT: S_ENDPGM 0, implicit %select(s32)
943    %reg:_(s32) = COPY $vgpr0
944    %zero:_(s32) = G_CONSTANT i32 0
945    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
946    %ten:_(s32) = G_CONSTANT i32 10
947    %twenty:_(s32) = G_CONSTANT i32 20
948    %select:_(s32) = G_SELECT %cond, %ten, %twenty
949    %thirty:_(s32) = G_CONSTANT i32 30
950    %smin:_(s32) = G_SMIN %select, %thirty
951    S_ENDPGM 0, implicit %smin
952...
953
954---
955name: fold_smax_into_select_s32_0
956tracksRegLiveness: true
957body: |
958  bb.0:
959    liveins: $vgpr0
960    ; CHECK-LABEL: name: fold_smax_into_select_s32_0
961    ; CHECK: liveins: $vgpr0
962    ; CHECK-NEXT: {{  $}}
963    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
964    ; CHECK-NEXT: S_ENDPGM 0, implicit %thirty(s32)
965    %reg:_(s32) = COPY $vgpr0
966    %zero:_(s32) = G_CONSTANT i32 0
967    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
968    %ten:_(s32) = G_CONSTANT i32 10
969    %twenty:_(s32) = G_CONSTANT i32 20
970    %select:_(s32) = G_SELECT %cond, %ten, %twenty
971    %thirty:_(s32) = G_CONSTANT i32 30
972    %smax:_(s32) = G_SMAX %select, %thirty
973    S_ENDPGM 0, implicit %smax
974...
975
976---
977name: fold_umin_into_select_s32_0
978tracksRegLiveness: true
979body: |
980  bb.0:
981    liveins: $vgpr0
982    ; CHECK-LABEL: name: fold_umin_into_select_s32_0
983    ; CHECK: liveins: $vgpr0
984    ; CHECK-NEXT: {{  $}}
985    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
986    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
987    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
988    ; CHECK-NEXT: %ten:_(s32) = G_CONSTANT i32 10
989    ; CHECK-NEXT: %twenty:_(s32) = G_CONSTANT i32 20
990    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %ten, %twenty
991    ; CHECK-NEXT: S_ENDPGM 0, implicit %select(s32)
992    %reg:_(s32) = COPY $vgpr0
993    %zero:_(s32) = G_CONSTANT i32 0
994    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
995    %ten:_(s32) = G_CONSTANT i32 10
996    %twenty:_(s32) = G_CONSTANT i32 20
997    %select:_(s32) = G_SELECT %cond, %ten, %twenty
998    %thirty:_(s32) = G_CONSTANT i32 30
999    %umin:_(s32) = G_UMIN %select, %thirty
1000    S_ENDPGM 0, implicit %umin
1001...
1002
1003---
1004name: fold_umax_into_select_s32_0
1005tracksRegLiveness: true
1006body: |
1007  bb.0:
1008    liveins: $vgpr0
1009    ; CHECK-LABEL: name: fold_umax_into_select_s32_0
1010    ; CHECK: liveins: $vgpr0
1011    ; CHECK-NEXT: {{  $}}
1012    ; CHECK-NEXT: %thirty:_(s32) = G_CONSTANT i32 30
1013    ; CHECK-NEXT: S_ENDPGM 0, implicit %thirty(s32)
1014    %reg:_(s32) = COPY $vgpr0
1015    %zero:_(s32) = G_CONSTANT i32 0
1016    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1017    %ten:_(s32) = G_CONSTANT i32 10
1018    %twenty:_(s32) = G_CONSTANT i32 20
1019    %select:_(s32) = G_SELECT %cond, %ten, %twenty
1020    %thirty:_(s32) = G_CONSTANT i32 30
1021    %umax:_(s32) = G_UMAX %select, %thirty
1022    S_ENDPGM 0, implicit %umax
1023...
1024
1025---
1026name: fold_fadd_into_select_s32_0
1027tracksRegLiveness: true
1028body: |
1029  bb.0:
1030    liveins: $vgpr0
1031    ; CHECK-LABEL: name: fold_fadd_into_select_s32_0
1032    ; CHECK: liveins: $vgpr0
1033    ; CHECK-NEXT: {{  $}}
1034    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1035    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1036    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1037    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.800000e+01
1038    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 2.000000e+01
1039    ; CHECK-NEXT: %fadd:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]]
1040    ; CHECK-NEXT: S_ENDPGM 0, implicit %fadd(s32)
1041    %reg:_(s32) = COPY $vgpr0
1042    %zero:_(s32) = G_CONSTANT i32 0
1043    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1044    %two:_(s32) = G_FCONSTANT float 2.0
1045    %four:_(s32) = G_FCONSTANT float 4.0
1046    %select:_(s32) = G_SELECT %cond, %two, %four
1047    %sixteen:_(s32) = G_FCONSTANT float 16.0
1048    %fadd:_(s32) = nnan G_FADD %select, %sixteen
1049    S_ENDPGM 0, implicit %fadd
1050...
1051
1052---
1053name: fold_fadd_into_select_s32_1
1054tracksRegLiveness: true
1055body: |
1056  bb.0:
1057    liveins: $vgpr0
1058    ; CHECK-LABEL: name: fold_fadd_into_select_s32_1
1059    ; CHECK: liveins: $vgpr0
1060    ; CHECK-NEXT: {{  $}}
1061    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1062    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1063    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1064    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.800000e+01
1065    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 2.000000e+01
1066    ; CHECK-NEXT: %fadd:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]]
1067    ; CHECK-NEXT: S_ENDPGM 0, implicit %fadd(s32)
1068    %reg:_(s32) = COPY $vgpr0
1069    %zero:_(s32) = G_CONSTANT i32 0
1070    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1071    %two:_(s32) = G_FCONSTANT float 2.0
1072    %four:_(s32) = G_FCONSTANT float 4.0
1073    %select:_(s32) = G_SELECT %cond, %two, %four
1074    %sixteen:_(s32) = G_FCONSTANT float 16.0
1075    %fadd:_(s32) = nnan G_FADD %sixteen, %select
1076    S_ENDPGM 0, implicit %fadd
1077...
1078
1079---
1080name: fold_fsub_into_select_s32_0
1081tracksRegLiveness: true
1082body: |
1083  bb.0:
1084    liveins: $vgpr0
1085    ; CHECK-LABEL: name: fold_fsub_into_select_s32_0
1086    ; CHECK: liveins: $vgpr0
1087    ; CHECK-NEXT: {{  $}}
1088    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1089    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1090    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1091    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float -1.400000e+01
1092    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float -1.200000e+01
1093    ; CHECK-NEXT: %fsub:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]]
1094    ; CHECK-NEXT: S_ENDPGM 0, implicit %fsub(s32)
1095    %reg:_(s32) = COPY $vgpr0
1096    %zero:_(s32) = G_CONSTANT i32 0
1097    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1098    %two:_(s32) = G_FCONSTANT float 2.0
1099    %four:_(s32) = G_FCONSTANT float 4.0
1100    %select:_(s32) = G_SELECT %cond, %two, %four
1101    %sixteen:_(s32) = G_FCONSTANT float 16.0
1102    %fsub:_(s32) = nnan G_FSUB %select, %sixteen
1103    S_ENDPGM 0, implicit %fsub
1104...
1105
1106---
1107name: fold_fmul_into_select_s32_0
1108tracksRegLiveness: true
1109body: |
1110  bb.0:
1111    liveins: $vgpr0
1112    ; CHECK-LABEL: name: fold_fmul_into_select_s32_0
1113    ; CHECK: liveins: $vgpr0
1114    ; CHECK-NEXT: {{  $}}
1115    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1116    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1117    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1118    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 3.200000e+01
1119    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 6.400000e+01
1120    ; CHECK-NEXT: %fmul:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]]
1121    ; CHECK-NEXT: S_ENDPGM 0, implicit %fmul(s32)
1122    %reg:_(s32) = COPY $vgpr0
1123    %zero:_(s32) = G_CONSTANT i32 0
1124    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1125    %two:_(s32) = G_FCONSTANT float 2.0
1126    %four:_(s32) = G_FCONSTANT float 4.0
1127    %select:_(s32) = G_SELECT %cond, %two, %four
1128    %sixteen:_(s32) = G_FCONSTANT float 16.0
1129    %fmul:_(s32) = nnan G_FMUL %select, %sixteen
1130    S_ENDPGM 0, implicit %fmul
1131...
1132
1133---
1134name: fold_fdiv_into_select_s32_0
1135tracksRegLiveness: true
1136body: |
1137  bb.0:
1138    liveins: $vgpr0
1139    ; CHECK-LABEL: name: fold_fdiv_into_select_s32_0
1140    ; CHECK: liveins: $vgpr0
1141    ; CHECK-NEXT: {{  $}}
1142    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1143    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1144    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1145    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.250000e-01
1146    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_FCONSTANT float 2.500000e-01
1147    ; CHECK-NEXT: %fdiv:_(s32) = nnan G_SELECT %cond(s1), [[C]], [[C1]]
1148    ; CHECK-NEXT: S_ENDPGM 0, implicit %fdiv(s32)
1149    %reg:_(s32) = COPY $vgpr0
1150    %zero:_(s32) = G_CONSTANT i32 0
1151    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1152    %two:_(s32) = G_FCONSTANT float 2.0
1153    %four:_(s32) = G_FCONSTANT float 4.0
1154    %select:_(s32) = G_SELECT %cond, %two, %four
1155    %sixteen:_(s32) = G_FCONSTANT float 16.0
1156    %fdiv:_(s32) = nnan G_FDIV %select, %sixteen
1157    S_ENDPGM 0, implicit %fdiv
1158...
1159
1160---
1161name: fold_frem_into_select_s32_0
1162tracksRegLiveness: true
1163body: |
1164  bb.0:
1165    liveins: $vgpr0
1166    ; CHECK-LABEL: name: fold_frem_into_select_s32_0
1167    ; CHECK: liveins: $vgpr0
1168    ; CHECK-NEXT: {{  $}}
1169    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1170    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1171    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1172    ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00
1173    ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00
1174    ; CHECK-NEXT: %frem:_(s32) = nnan G_SELECT %cond(s1), %two, %four
1175    ; CHECK-NEXT: S_ENDPGM 0, implicit %frem(s32)
1176    %reg:_(s32) = COPY $vgpr0
1177    %zero:_(s32) = G_CONSTANT i32 0
1178    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1179    %two:_(s32) = G_FCONSTANT float 2.0
1180    %four:_(s32) = G_FCONSTANT float 4.0
1181    %select:_(s32) = G_SELECT %cond, %two, %four
1182    %sixteen:_(s32) = G_FCONSTANT float 16.0
1183    %frem:_(s32) = nnan G_FREM %select, %sixteen
1184    S_ENDPGM 0, implicit %frem
1185...
1186
1187---
1188name: fold_fpow_into_select_s32_0
1189tracksRegLiveness: true
1190body: |
1191  bb.0:
1192    liveins: $vgpr0
1193    ; CHECK-LABEL: name: fold_fpow_into_select_s32_0
1194    ; CHECK: liveins: $vgpr0
1195    ; CHECK-NEXT: {{  $}}
1196    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1197    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1198    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1199    ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00
1200    ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00
1201    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four
1202    ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01
1203    ; CHECK-NEXT: %fpow:_(s32) = nnan G_FPOW %select, %sixteen
1204    ; CHECK-NEXT: S_ENDPGM 0, implicit %fpow(s32)
1205    %reg:_(s32) = COPY $vgpr0
1206    %zero:_(s32) = G_CONSTANT i32 0
1207    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1208    %two:_(s32) = G_FCONSTANT float 2.0
1209    %four:_(s32) = G_FCONSTANT float 4.0
1210    %select:_(s32) = G_SELECT %cond, %two, %four
1211    %sixteen:_(s32) = G_FCONSTANT float 16.0
1212    %fpow:_(s32) = nnan G_FPOW %select, %sixteen
1213    S_ENDPGM 0, implicit %fpow
1214...
1215
1216---
1217name: fold_fminnum_into_select_s32_0
1218tracksRegLiveness: true
1219body: |
1220  bb.0:
1221    liveins: $vgpr0
1222    ; CHECK-LABEL: name: fold_fminnum_into_select_s32_0
1223    ; CHECK: liveins: $vgpr0
1224    ; CHECK-NEXT: {{  $}}
1225    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1226    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1227    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1228    ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00
1229    ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00
1230    ; CHECK-NEXT: %fminnum:_(s32) = nnan G_SELECT %cond(s1), %two, %four
1231    ; CHECK-NEXT: S_ENDPGM 0, implicit %fminnum(s32)
1232    %reg:_(s32) = COPY $vgpr0
1233    %zero:_(s32) = G_CONSTANT i32 0
1234    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1235    %two:_(s32) = G_FCONSTANT float 2.0
1236    %four:_(s32) = G_FCONSTANT float 4.0
1237    %select:_(s32) = G_SELECT %cond, %two, %four
1238    %sixteen:_(s32) = G_FCONSTANT float 16.0
1239    %fminnum:_(s32) = nnan G_FMINNUM %select, %sixteen
1240    S_ENDPGM 0, implicit %fminnum
1241...
1242
1243---
1244name: fold_fminnum_ieee_into_select_s32_0
1245tracksRegLiveness: true
1246body: |
1247  bb.0:
1248    liveins: $vgpr0
1249    ; CHECK-LABEL: name: fold_fminnum_ieee_into_select_s32_0
1250    ; CHECK: liveins: $vgpr0
1251    ; CHECK-NEXT: {{  $}}
1252    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1253    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1254    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1255    ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00
1256    ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00
1257    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four
1258    ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01
1259    ; CHECK-NEXT: %fminnum_ieee:_(s32) = nnan G_FMINNUM_IEEE %select, %sixteen
1260    ; CHECK-NEXT: S_ENDPGM 0, implicit %fminnum_ieee(s32)
1261    %reg:_(s32) = COPY $vgpr0
1262    %zero:_(s32) = G_CONSTANT i32 0
1263    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1264    %two:_(s32) = G_FCONSTANT float 2.0
1265    %four:_(s32) = G_FCONSTANT float 4.0
1266    %select:_(s32) = G_SELECT %cond, %two, %four
1267    %sixteen:_(s32) = G_FCONSTANT float 16.0
1268    %fminnum_ieee:_(s32) = nnan G_FMINNUM_IEEE %select, %sixteen
1269    S_ENDPGM 0, implicit %fminnum_ieee
1270...
1271
1272---
1273name: fold_fmaxnum_into_select_s32_0
1274tracksRegLiveness: true
1275body: |
1276  bb.0:
1277    liveins: $vgpr0
1278    ; CHECK-LABEL: name: fold_fmaxnum_into_select_s32_0
1279    ; CHECK: liveins: $vgpr0
1280    ; CHECK-NEXT: {{  $}}
1281    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1282    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1283    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1284    ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00
1285    ; CHECK-NEXT: %three:_(s32) = G_FCONSTANT float 3.000000e+00
1286    ; CHECK-NEXT: %fmaxnum:_(s32) = nnan G_SELECT %cond(s1), %three, %four
1287    ; CHECK-NEXT: S_ENDPGM 0, implicit %fmaxnum(s32)
1288    %reg:_(s32) = COPY $vgpr0
1289    %zero:_(s32) = G_CONSTANT i32 0
1290    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1291    %two:_(s32) = G_FCONSTANT float 2.0
1292    %four:_(s32) = G_FCONSTANT float 4.0
1293    %select:_(s32) = G_SELECT %cond, %two, %four
1294    %three:_(s32) = G_FCONSTANT float 3.0
1295    %fmaxnum:_(s32) = nnan G_FMAXNUM %select, %three
1296    S_ENDPGM 0, implicit %fmaxnum
1297...
1298
1299---
1300name: fold_fmaxnum_ieee_into_select_s32_0
1301tracksRegLiveness: true
1302body: |
1303  bb.0:
1304    liveins: $vgpr0
1305    ; CHECK-LABEL: name: fold_fmaxnum_ieee_into_select_s32_0
1306    ; CHECK: liveins: $vgpr0
1307    ; CHECK-NEXT: {{  $}}
1308    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1309    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1310    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1311    ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00
1312    ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00
1313    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four
1314    ; CHECK-NEXT: %three:_(s32) = G_FCONSTANT float 3.000000e+00
1315    ; CHECK-NEXT: %fmaxnum_ieee:_(s32) = nnan G_FMAXNUM_IEEE %select, %three
1316    ; CHECK-NEXT: S_ENDPGM 0, implicit %fmaxnum_ieee(s32)
1317    %reg:_(s32) = COPY $vgpr0
1318    %zero:_(s32) = G_CONSTANT i32 0
1319    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1320    %two:_(s32) = G_FCONSTANT float 2.0
1321    %four:_(s32) = G_FCONSTANT float 4.0
1322    %select:_(s32) = G_SELECT %cond, %two, %four
1323    %three:_(s32) = G_FCONSTANT float 3.0
1324    %fmaxnum_ieee:_(s32) = nnan G_FMAXNUM_IEEE %select, %three
1325    S_ENDPGM 0, implicit %fmaxnum_ieee
1326...
1327
1328---
1329name: fold_fminimum_into_select_s32_0
1330tracksRegLiveness: true
1331body: |
1332  bb.0:
1333    liveins: $vgpr0
1334    ; CHECK-LABEL: name: fold_fminimum_into_select_s32_0
1335    ; CHECK: liveins: $vgpr0
1336    ; CHECK-NEXT: {{  $}}
1337    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1338    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1339    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1340    ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00
1341    ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00
1342    ; CHECK-NEXT: %fminimum:_(s32) = nnan G_SELECT %cond(s1), %two, %four
1343    ; CHECK-NEXT: S_ENDPGM 0, implicit %fminimum(s32)
1344    %reg:_(s32) = COPY $vgpr0
1345    %zero:_(s32) = G_CONSTANT i32 0
1346    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1347    %two:_(s32) = G_FCONSTANT float 2.0
1348    %four:_(s32) = G_FCONSTANT float 4.0
1349    %select:_(s32) = G_SELECT %cond, %two, %four
1350    %sixteen:_(s32) = G_FCONSTANT float 16.0
1351    %fminimum:_(s32) = nnan G_FMINIMUM %select, %sixteen
1352    S_ENDPGM 0, implicit %fminimum
1353...
1354
1355---
1356name: fold_fmaximum_into_select_s32_0
1357tracksRegLiveness: true
1358body: |
1359  bb.0:
1360    liveins: $vgpr0
1361    ; CHECK-LABEL: name: fold_fmaximum_into_select_s32_0
1362    ; CHECK: liveins: $vgpr0
1363    ; CHECK-NEXT: {{  $}}
1364    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1365    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1366    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1367    ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00
1368    ; CHECK-NEXT: %three:_(s32) = G_FCONSTANT float 3.000000e+00
1369    ; CHECK-NEXT: %fmaximum:_(s32) = nnan G_SELECT %cond(s1), %three, %four
1370    ; CHECK-NEXT: S_ENDPGM 0, implicit %fmaximum(s32)
1371    %reg:_(s32) = COPY $vgpr0
1372    %zero:_(s32) = G_CONSTANT i32 0
1373    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1374    %two:_(s32) = G_FCONSTANT float 2.0
1375    %four:_(s32) = G_FCONSTANT float 4.0
1376    %select:_(s32) = G_SELECT %cond, %two, %four
1377    %three:_(s32) = G_FCONSTANT float 3.0
1378    %fmaximum:_(s32) = nnan G_FMAXIMUM %select, %three
1379    S_ENDPGM 0, implicit %fmaximum
1380...
1381
1382---
1383name: fold_fcopysign_into_select_s32_0
1384tracksRegLiveness: true
1385body: |
1386  bb.0:
1387    liveins: $vgpr0
1388    ; CHECK-LABEL: name: fold_fcopysign_into_select_s32_0
1389    ; CHECK: liveins: $vgpr0
1390    ; CHECK-NEXT: {{  $}}
1391    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1392    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1393    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1394    ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00
1395    ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00
1396    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four
1397    ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01
1398    ; CHECK-NEXT: %fcopysign:_(s32) = nnan G_FCOPYSIGN %select, %sixteen(s32)
1399    ; CHECK-NEXT: S_ENDPGM 0, implicit %fcopysign(s32)
1400    %reg:_(s32) = COPY $vgpr0
1401    %zero:_(s32) = G_CONSTANT i32 0
1402    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1403    %two:_(s32) = G_FCONSTANT float 2.0
1404    %four:_(s32) = G_FCONSTANT float 4.0
1405    %select:_(s32) = G_SELECT %cond, %two, %four
1406    %sixteen:_(s32) = G_FCONSTANT float 16.0
1407    %fcopysign:_(s32) = nnan G_FCOPYSIGN %select, %sixteen
1408    S_ENDPGM 0, implicit %fcopysign
1409...
1410
1411---
1412name: fold_fcopysign_into_select_s32_s64_0
1413tracksRegLiveness: true
1414body: |
1415  bb.0:
1416    liveins: $vgpr0
1417    ; CHECK-LABEL: name: fold_fcopysign_into_select_s32_s64_0
1418    ; CHECK: liveins: $vgpr0
1419    ; CHECK-NEXT: {{  $}}
1420    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1421    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1422    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1423    ; CHECK-NEXT: %two:_(s32) = G_FCONSTANT float 2.000000e+00
1424    ; CHECK-NEXT: %four:_(s32) = G_FCONSTANT float 4.000000e+00
1425    ; CHECK-NEXT: %select:_(s32) = G_SELECT %cond(s1), %two, %four
1426    ; CHECK-NEXT: %sixteen:_(s64) = G_FCONSTANT double 1.600000e+01
1427    ; CHECK-NEXT: %fcopysign:_(s32) = nnan G_FCOPYSIGN %select, %sixteen(s64)
1428    ; CHECK-NEXT: S_ENDPGM 0, implicit %fcopysign(s32)
1429    %reg:_(s32) = COPY $vgpr0
1430    %zero:_(s32) = G_CONSTANT i32 0
1431    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1432    %two:_(s32) = G_FCONSTANT float 2.0
1433    %four:_(s32) = G_FCONSTANT float 4.0
1434    %select:_(s32) = G_SELECT %cond, %two, %four
1435    %sixteen:_(s64) = G_FCONSTANT double 16.0
1436    %fcopysign:_(s32) = nnan G_FCOPYSIGN %select, %sixteen
1437    S_ENDPGM 0, implicit %fcopysign
1438...
1439
1440---
1441name: fold_fcopysign_into_select_s64_s32_0
1442tracksRegLiveness: true
1443body: |
1444  bb.0:
1445    liveins: $vgpr0
1446    ; CHECK-LABEL: name: fold_fcopysign_into_select_s64_s32_0
1447    ; CHECK: liveins: $vgpr0
1448    ; CHECK-NEXT: {{  $}}
1449    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1450    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1451    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1452    ; CHECK-NEXT: %two:_(s64) = G_FCONSTANT double 2.000000e+00
1453    ; CHECK-NEXT: %four:_(s64) = G_FCONSTANT double 4.000000e+00
1454    ; CHECK-NEXT: %select:_(s64) = G_SELECT %cond(s1), %two, %four
1455    ; CHECK-NEXT: %sixteen:_(s32) = G_FCONSTANT float 1.600000e+01
1456    ; CHECK-NEXT: %fcopysign:_(s64) = nnan G_FCOPYSIGN %select, %sixteen(s32)
1457    ; CHECK-NEXT: S_ENDPGM 0, implicit %fcopysign(s64)
1458    %reg:_(s32) = COPY $vgpr0
1459    %zero:_(s32) = G_CONSTANT i32 0
1460    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1461    %two:_(s64) = G_FCONSTANT double 2.0
1462    %four:_(s64) = G_FCONSTANT double 4.0
1463    %select:_(s64) = G_SELECT %cond, %two, %four
1464    %sixteen:_(s32) = G_FCONSTANT float 16.0
1465    %fcopysign:_(s64) = nnan G_FCOPYSIGN %select, %sixteen
1466    S_ENDPGM 0, implicit %fcopysign
1467...
1468
1469# Test handling of intermediate copy between add and select.
1470---
1471name: fold_add_copy_into_select_s32_0
1472tracksRegLiveness: true
1473body: |
1474  bb.0:
1475    liveins: $vgpr0
1476    ; CHECK-LABEL: name: fold_add_copy_into_select_s32_0
1477    ; CHECK: liveins: $vgpr0
1478    ; CHECK-NEXT: {{  $}}
1479    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1480    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1481    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1482    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40
1483    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50
1484    ; CHECK-NEXT: %add:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]]
1485    ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32)
1486    %reg:_(s32) = COPY $vgpr0
1487    %zero:_(s32) = G_CONSTANT i32 0
1488    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1489    %ten:_(s32) = G_CONSTANT i32 10
1490    %twenty:_(s32) = G_CONSTANT i32 20
1491    %select:_(s32) = G_SELECT %cond, %ten, %twenty
1492    %thirty:_(s32) = G_CONSTANT i32 30
1493    %copy_select:_(s32) = COPY %select
1494    %add:_(s32) = G_ADD %copy_select, %thirty
1495    S_ENDPGM 0, implicit %add
1496...
1497
1498---
1499name: fold_add_copy_into_select_s32_1
1500tracksRegLiveness: true
1501body: |
1502  bb.0:
1503    liveins: $vgpr0
1504    ; CHECK-LABEL: name: fold_add_copy_into_select_s32_1
1505    ; CHECK: liveins: $vgpr0
1506    ; CHECK-NEXT: {{  $}}
1507    ; CHECK-NEXT: %reg:_(s32) = COPY $vgpr0
1508    ; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
1509    ; CHECK-NEXT: %cond:_(s1) = G_ICMP intpred(eq), %reg(s32), %zero
1510    ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 40
1511    ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 50
1512    ; CHECK-NEXT: %add:_(s32) = G_SELECT %cond(s1), [[C]], [[C1]]
1513    ; CHECK-NEXT: S_ENDPGM 0, implicit %add(s32)
1514    %reg:_(s32) = COPY $vgpr0
1515    %zero:_(s32) = G_CONSTANT i32 0
1516    %cond:_(s1) = G_ICMP intpred(eq), %reg, %zero
1517    %ten:_(s32) = G_CONSTANT i32 10
1518    %twenty:_(s32) = G_CONSTANT i32 20
1519    %select:_(s32) = G_SELECT %cond, %ten, %twenty
1520    %thirty:_(s32) = G_CONSTANT i32 30
1521    %copy_select:_(s32) = COPY %select
1522    %add:_(s32) = G_ADD %thirty, %copy_select
1523    S_ENDPGM 0, implicit %add
1524...
1525