1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -instcombine -S | FileCheck %s
3
4declare void @use(<2 x i1>)
5declare void @use2(i1)
6
7define i32 @select_xor_icmp(i32 %x, i32 %y, i32 %z) {
8; CHECK-LABEL: @select_xor_icmp(
9; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
10; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]]
11; CHECK-NEXT:    ret i32 [[C]]
12;
13  %A = icmp eq i32 %x, 0
14  %B = xor i32 %x, %z
15  %C = select i1 %A, i32 %B, i32 %y
16  ret i32 %C
17}
18
19define i32 @select_xor_icmp2(i32 %x, i32 %y, i32 %z) {
20; CHECK-LABEL: @select_xor_icmp2(
21; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
22; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]]
23; CHECK-NEXT:    ret i32 [[C]]
24;
25  %A = icmp ne i32 %x, 0
26  %B = xor i32 %x, %z
27  %C = select i1 %A, i32 %y, i32 %B
28  ret i32 %C
29}
30
31define i32 @select_xor_icmp_meta(i32 %x, i32 %y, i32 %z) {
32; CHECK-LABEL: @select_xor_icmp_meta(
33; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
34; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]], !prof !0
35; CHECK-NEXT:    ret i32 [[C]]
36;
37  %A = icmp eq i32 %x, 0
38  %B = xor i32 %x, %z
39  %C = select i1 %A, i32 %B, i32 %y, !prof !0
40  ret i32 %C
41}
42
43define i32 @select_mul_icmp(i32 %x, i32 %y, i32 %z) {
44; CHECK-LABEL: @select_mul_icmp(
45; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 1
46; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]]
47; CHECK-NEXT:    ret i32 [[C]]
48;
49  %A = icmp eq i32 %x, 1
50  %B = mul i32 %x, %z
51  %C = select i1 %A, i32 %B, i32 %y
52  ret i32 %C
53}
54
55define i32 @select_add_icmp(i32 %x, i32 %y, i32 %z) {
56; CHECK-LABEL: @select_add_icmp(
57; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
58; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]]
59; CHECK-NEXT:    ret i32 [[C]]
60;
61  %A = icmp eq i32 %x, 0
62  %B = add i32 %x, %z
63  %C = select i1 %A, i32 %B, i32 %y
64  ret i32 %C
65}
66
67define i32 @select_or_icmp(i32 %x, i32 %y, i32 %z) {
68; CHECK-LABEL: @select_or_icmp(
69; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
70; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]]
71; CHECK-NEXT:    ret i32 [[C]]
72;
73  %A = icmp eq i32 %x, 0
74  %B = or i32 %x, %z
75  %C = select i1 %A, i32 %B, i32 %y
76  ret i32 %C
77}
78
79define i32 @select_and_icmp(i32 %x, i32 %y, i32 %z) {
80; CHECK-LABEL: @select_and_icmp(
81; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], -1
82; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]]
83; CHECK-NEXT:    ret i32 [[C]]
84;
85  %A = icmp eq i32 %x, -1
86  %B = and i32 %x, %z
87  %C = select i1 %A, i32 %B, i32 %y
88  ret i32 %C
89}
90
91define <2 x i8> @select_xor_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
92; CHECK-LABEL: @select_xor_icmp_vec(
93; CHECK-NEXT:    [[A:%.*]] = icmp eq <2 x i8> [[X:%.*]], zeroinitializer
94; CHECK-NEXT:    [[C:%.*]] = select <2 x i1> [[A]], <2 x i8> [[Z:%.*]], <2 x i8> [[Y:%.*]]
95; CHECK-NEXT:    ret <2 x i8> [[C]]
96;
97  %A = icmp eq <2 x i8>  %x, <i8 0, i8 0>
98  %B = xor <2 x i8>  %x, %z
99  %C = select <2 x i1>  %A, <2 x i8>  %B, <2 x i8>  %y
100  ret <2 x i8>  %C
101}
102
103define <2 x i8> @select_xor_icmp_vec_use(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
104; CHECK-LABEL: @select_xor_icmp_vec_use(
105; CHECK-NEXT:    [[A:%.*]] = icmp ne <2 x i8> [[X:%.*]], zeroinitializer
106; CHECK-NEXT:    call void @use(<2 x i1> [[A]])
107; CHECK-NEXT:    [[C:%.*]] = select <2 x i1> [[A]], <2 x i8> [[Y:%.*]], <2 x i8> [[Z:%.*]]
108; CHECK-NEXT:    ret <2 x i8> [[C]]
109;
110  %A = icmp ne <2 x i8>  %x, <i8 0, i8 0>
111  call void @use(<2 x i1> %A)
112  %B = xor <2 x i8>  %x, %z
113  %C = select <2 x i1>  %A, <2 x i8>  %y, <2 x i8>  %B
114  ret <2 x i8>  %C
115}
116
117define i32 @select_xor_inv_icmp(i32 %x, i32 %y, i32 %z) {
118; CHECK-LABEL: @select_xor_inv_icmp(
119; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
120; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]]
121; CHECK-NEXT:    ret i32 [[C]]
122;
123  %A = icmp eq i32 %x, 0
124  %B = xor i32 %z, %x
125  %C = select i1 %A, i32 %B, i32 %y
126  ret i32 %C
127}
128
129define i32 @select_xor_inv_icmp2(i32 %x, i32 %y, i32 %z) {
130; CHECK-LABEL: @select_xor_inv_icmp2(
131; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], 0
132; CHECK-NEXT:    call void @use2(i1 [[A]])
133; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Y:%.*]], i32 [[Z:%.*]]
134; CHECK-NEXT:    ret i32 [[C]]
135;
136  %A = icmp ne i32 %x, 0
137  call void @use2(i1 %A) ; thwart predicate canonicalization
138  %B = xor i32 %x, %z
139  %C = select i1 %A, i32 %y, i32 %B
140  ret i32 %C
141}
142
143define float @select_fadd_fcmp(float %x, float %y, float %z) {
144; CHECK-LABEL: @select_fadd_fcmp(
145; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], -0.000000e+00
146; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Z:%.*]], float [[Y:%.*]]
147; CHECK-NEXT:    ret float [[C]]
148;
149  %A = fcmp oeq float %x, -0.0
150  %B = fadd nsz float %x, %z
151  %C = select i1 %A, float %B, float %y
152  ret float %C
153}
154
155define float @select_fadd_fcmp_2(float %x, float %y, float %v) {
156; CHECK-LABEL: @select_fadd_fcmp_2(
157; CHECK-NEXT:    [[A:%.*]] = fcmp une float [[X:%.*]], -0.000000e+00
158; CHECK-NEXT:    [[Z:%.*]] = fadd float [[V:%.*]], 0.000000e+00
159; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[Z]]
160; CHECK-NEXT:    ret float [[C]]
161;
162  %A = fcmp une float %x, -0.0
163  %z = fadd float %v, 0.0 ; cannot produce -0.0
164  %B = fadd float %z, %x
165  %C = select i1 %A, float %y, float %B
166  ret float %C
167}
168
169define float @select_fadd_fcmp_3(float %x, float %y) {
170; CHECK-LABEL: @select_fadd_fcmp_3(
171; CHECK-NEXT:    [[A:%.*]] = fcmp une float [[X:%.*]], -0.000000e+00
172; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float 6.000000e+00
173; CHECK-NEXT:    ret float [[C]]
174;
175  %A = fcmp une float %x, -0.0
176  %B = fadd float 6.0, %x
177  %C = select i1 %A, float %y, float %B
178  ret float %C
179}
180
181define float @select_fadd_fcmp_4(float %x, float %y, float %z) {
182; CHECK-LABEL: @select_fadd_fcmp_4(
183; CHECK-NEXT:    [[A:%.*]] = fcmp une float [[X:%.*]], -0.000000e+00
184; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[Z:%.*]]
185; CHECK-NEXT:    ret float [[C]]
186;
187  %A = fcmp une float %x, -0.0
188  %B = fadd nsz float %z, %x
189  %C = select i1 %A, float %y, float %B
190  ret float %C
191}
192
193define float @select_fadd_fcmp_5(float %x, float %y, float %v) {
194; CHECK-LABEL: @select_fadd_fcmp_5(
195; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], -0.000000e+00
196; CHECK-NEXT:    [[Z:%.*]] = fadd float [[V:%.*]], 0.000000e+00
197; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Z]], float [[Y:%.*]]
198; CHECK-NEXT:    ret float [[C]]
199;
200  %A = fcmp oeq float %x, -0.0
201  %z = fadd float %v, 0.0 ; cannot produce -0.0
202  %B = fadd float %z, %x
203  %C = select i1 %A, float %B, float %y
204  ret float %C
205}
206
207define float @select_fadd_fcmp_6(float %x, float %y, float %z) {
208; CHECK-LABEL: @select_fadd_fcmp_6(
209; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], -0.000000e+00
210; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float 6.000000e+00, float [[Y:%.*]]
211; CHECK-NEXT:    ret float [[C]]
212;
213  %A = fcmp oeq float %x, -0.0
214  %B = fadd float %x, 6.0
215  %C = select i1 %A, float %B, float %y
216  ret float %C
217}
218
219define float @select_fmul_fcmp(float %x, float %y, float %z) {
220; CHECK-LABEL: @select_fmul_fcmp(
221; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00
222; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Z:%.*]], float [[Y:%.*]]
223; CHECK-NEXT:    ret float [[C]]
224;
225  %A = fcmp oeq float %x, 1.0
226  %B = fmul nsz float %x, %z
227  %C = select i1 %A, float %B, float %y
228  ret float %C
229}
230
231define float @select_fsub_fcmp(float %x, float %y, float %z) {
232; CHECK-LABEL: @select_fsub_fcmp(
233; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
234; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Z:%.*]], float [[Y:%.*]]
235; CHECK-NEXT:    ret float [[C]]
236;
237  %A = fcmp oeq float %x, 0.0
238  %B = fsub nsz float %z, %x
239  %C = select i1 %A, float %B, float %y
240  ret float %C
241}
242
243define float @select_fdiv_fcmp(float %x, float %y, float %z) {
244; CHECK-LABEL: @select_fdiv_fcmp(
245; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00
246; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Z:%.*]], float [[Y:%.*]]
247; CHECK-NEXT:    ret float [[C]]
248;
249  %A = fcmp oeq float %x, 1.0
250  %B = fdiv nsz float %z, %x
251  %C = select i1 %A, float %B, float %y
252  ret float %C
253}
254
255define i32 @select_sub_icmp(i32 %x, i32 %y, i32 %z) {
256; CHECK-LABEL: @select_sub_icmp(
257; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
258; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]]
259; CHECK-NEXT:    ret i32 [[C]]
260;
261  %A = icmp eq i32 %x, 0
262  %B = sub i32 %z, %x
263  %C = select i1 %A, i32 %B, i32 %y
264  ret i32 %C
265}
266
267define i32 @select_sub_icmp_2(i32 %x, i32 %y, i32 %z) {
268; CHECK-LABEL: @select_sub_icmp_2(
269; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
270; CHECK-NEXT:    call void @use2(i1 [[A]])
271; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]]
272; CHECK-NEXT:    ret i32 [[C]]
273;
274  %A = icmp eq i32 %x, 0
275  call void @use2(i1 %A)
276  %B = sub i32 %z, %x
277  %C = select i1 %A, i32 %B, i32 %y
278  ret i32 %C
279}
280
281define i32 @select_sub_icmp_3(i32 %x, i32 %y, i32 %z) {
282; CHECK-LABEL: @select_sub_icmp_3(
283; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], 0
284; CHECK-NEXT:    call void @use2(i1 [[A]])
285; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Y:%.*]], i32 [[Z:%.*]]
286; CHECK-NEXT:    ret i32 [[C]]
287;
288  %A = icmp ne i32 %x, 0
289  call void @use2(i1 %A)
290  %B = sub i32 %z, %x
291  %C = select i1 %A, i32 %y, i32 %B
292  ret i32 %C
293}
294
295define <2 x i8> @select_sub_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
296; CHECK-LABEL: @select_sub_icmp_vec(
297; CHECK-NEXT:    [[A:%.*]] = icmp eq <2 x i8> [[X:%.*]], zeroinitializer
298; CHECK-NEXT:    [[C:%.*]] = select <2 x i1> [[A]], <2 x i8> [[Z:%.*]], <2 x i8> [[Y:%.*]]
299; CHECK-NEXT:    ret <2 x i8> [[C]]
300;
301  %A = icmp eq <2 x i8>  %x, <i8 0, i8 0>
302  %B = sub <2 x i8>  %z, %x
303  %C = select <2 x i1>  %A, <2 x i8>  %B, <2 x i8>  %y
304  ret <2 x i8>  %C
305}
306
307define i32 @select_shl_icmp(i32 %x, i32 %y, i32 %z) {
308; CHECK-LABEL: @select_shl_icmp(
309; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], 0
310; CHECK-NEXT:    call void @use2(i1 [[A]])
311; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Y:%.*]], i32 [[Z:%.*]]
312; CHECK-NEXT:    ret i32 [[C]]
313;
314  %A = icmp ne i32 %x, 0
315  call void @use2(i1 %A) ; thwart predicate canonicalization
316  %B = shl i32 %z, %x
317  %C = select i1 %A, i32 %y, i32 %B
318  ret i32 %C
319}
320
321define i32 @select_lshr_icmp(i32 %x, i32 %y, i32 %z) {
322; CHECK-LABEL: @select_lshr_icmp(
323; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
324; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]]
325; CHECK-NEXT:    ret i32 [[C]]
326;
327  %A = icmp eq i32 %x, 0
328  %B = lshr i32 %z, %x
329  %C = select i1 %A, i32 %B, i32 %y
330  ret i32 %C
331}
332
333define i32 @select_ashr_icmp(i32 %x, i32 %y, i32 %z) {
334; CHECK-LABEL: @select_ashr_icmp(
335; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], 0
336; CHECK-NEXT:    call void @use2(i1 [[A]])
337; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Y:%.*]], i32 [[Z:%.*]]
338; CHECK-NEXT:    ret i32 [[C]]
339;
340  %A = icmp ne i32 %x, 0
341  call void @use2(i1 %A) ; thwart predicate canonicalization
342  %B = ashr i32 %z, %x
343  %C = select i1 %A, i32 %y, i32 %B
344  ret i32 %C
345}
346
347define i32 @select_udiv_icmp(i32 %x, i32 %y, i32 %z) {
348; CHECK-LABEL: @select_udiv_icmp(
349; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 1
350; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Z:%.*]], i32 [[Y:%.*]]
351; CHECK-NEXT:    ret i32 [[C]]
352;
353  %A = icmp eq i32 %x, 1
354  %B = udiv i32 %z, %x
355  %C = select i1 %A, i32 %B, i32 %y
356  ret i32 %C
357}
358
359define i32 @select_sdiv_icmp(i32 %x, i32 %y, i32 %z) {
360; CHECK-LABEL: @select_sdiv_icmp(
361; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], 1
362; CHECK-NEXT:    call void @use2(i1 [[A]])
363; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Y:%.*]], i32 [[Z:%.*]]
364; CHECK-NEXT:    ret i32 [[C]]
365;
366  %A = icmp ne i32 %x, 1
367  call void @use2(i1 %A) ; thwart predicate canonicalization
368  %B = sdiv i32 %z, %x
369  %C = select i1 %A, i32 %y, i32 %B
370  ret i32 %C
371}
372
373; Negative tests
374define i32 @select_xor_icmp_bad_1(i32 %x, i32 %y, i32 %z, i32 %k) {
375; CHECK-LABEL: @select_xor_icmp_bad_1(
376; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]
377; CHECK-NEXT:    [[B:%.*]] = xor i32 [[X]], [[Z:%.*]]
378; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
379; CHECK-NEXT:    ret i32 [[C]]
380;
381  %A = icmp eq i32 %x, %k
382  %B = xor i32 %x, %z
383  %C = select i1 %A, i32 %B, i32 %y
384  ret i32 %C
385}
386
387define i32 @select_xor_icmp_bad_2(i32 %x, i32 %y, i32 %z, i32 %k) {
388; CHECK-LABEL: @select_xor_icmp_bad_2(
389; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
390; CHECK-NEXT:    [[B:%.*]] = xor i32 [[K:%.*]], [[Z:%.*]]
391; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
392; CHECK-NEXT:    ret i32 [[C]]
393;
394  %A = icmp eq i32 %x, 0
395  %B = xor i32 %k, %z
396  %C = select i1 %A, i32 %B, i32 %y
397  ret i32 %C
398}
399
400define i32 @select_xor_icmp_bad_3(i32 %x, i32 %y, i32 %z) {
401; CHECK-LABEL: @select_xor_icmp_bad_3(
402; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 3
403; CHECK-NEXT:    [[B:%.*]] = xor i32 [[X]], [[Z:%.*]]
404; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
405; CHECK-NEXT:    ret i32 [[C]]
406;
407  %A = icmp eq i32 %x, 3
408  %B = xor i32 %x, %z
409  %C = select i1 %A, i32 %B, i32 %y
410  ret i32 %C
411}
412
413define i32 @select_xor_fcmp_bad_4(i32 %x, i32 %y, i32 %z, float %k) {
414; CHECK-LABEL: @select_xor_fcmp_bad_4(
415; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[K:%.*]], 0.000000e+00
416; CHECK-NEXT:    [[B:%.*]] = xor i32 [[X:%.*]], [[Z:%.*]]
417; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
418; CHECK-NEXT:    ret i32 [[C]]
419;
420  %A = fcmp oeq float %k, 0.0
421  %B = xor i32 %x, %z
422  %C = select i1 %A, i32 %B, i32 %y
423  ret i32 %C
424}
425
426define i32 @select_xor_icmp_bad_5(i32 %x, i32 %y, i32 %z) {
427; CHECK-LABEL: @select_xor_icmp_bad_5(
428; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
429; CHECK-NEXT:    [[B:%.*]] = xor i32 [[X]], [[Z:%.*]]
430; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[Y:%.*]], i32 [[B]]
431; CHECK-NEXT:    ret i32 [[C]]
432;
433  %A = icmp ne i32 %x, 0
434  %B = xor i32 %x, %z
435  %C = select i1 %A, i32 %B, i32 %y
436  ret i32 %C
437}
438
439define i32 @select_xor_icmp_bad_6(i32 %x, i32 %y, i32 %z) {
440; CHECK-LABEL: @select_xor_icmp_bad_6(
441; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 1
442; CHECK-NEXT:    [[B:%.*]] = xor i32 [[X]], [[Z:%.*]]
443; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
444; CHECK-NEXT:    ret i32 [[C]]
445;
446  %A = icmp ne i32 %x, 1
447  %B = xor i32 %x, %z
448  %C = select i1 %A, i32 %y, i32 %B
449  ret i32 %C
450}
451
452define <2 x i8> @select_xor_icmp_vec_bad(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
453; CHECK-LABEL: @select_xor_icmp_vec_bad(
454; CHECK-NEXT:    [[A:%.*]] = icmp eq <2 x i8> [[X:%.*]], <i8 5, i8 3>
455; CHECK-NEXT:    [[B:%.*]] = xor <2 x i8> [[X]], [[Z:%.*]]
456; CHECK-NEXT:    [[C:%.*]] = select <2 x i1> [[A]], <2 x i8> [[B]], <2 x i8> [[Y:%.*]]
457; CHECK-NEXT:    ret <2 x i8> [[C]]
458;
459  %A = icmp eq <2 x i8>  %x, <i8 5, i8 3>
460  %B = xor <2 x i8>  %x, %z
461  %C = select <2 x i1>  %A, <2 x i8>  %B, <2 x i8>  %y
462  ret <2 x i8>  %C
463}
464
465; TODO: support for undefs, check for an identity constant does not handle them yet
466define <2 x i8> @select_xor_icmp_vec_bad_2(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
467; CHECK-LABEL: @select_xor_icmp_vec_bad_2(
468; CHECK-NEXT:    [[A:%.*]] = icmp eq <2 x i8> [[X:%.*]], <i8 0, i8 undef>
469; CHECK-NEXT:    [[B:%.*]] = xor <2 x i8> [[X]], [[Z:%.*]]
470; CHECK-NEXT:    [[C:%.*]] = select <2 x i1> [[A]], <2 x i8> [[B]], <2 x i8> [[Y:%.*]]
471; CHECK-NEXT:    ret <2 x i8> [[C]]
472;
473  %A = icmp eq <2 x i8>  %x, <i8 0, i8 undef>
474  %B = xor <2 x i8>  %x, %z
475  %C = select <2 x i1>  %A, <2 x i8>  %B, <2 x i8>  %y
476  ret <2 x i8>  %C
477}
478
479define i32 @select_mul_icmp_bad(i32 %x, i32 %y, i32 %z, i32 %k) {
480; CHECK-LABEL: @select_mul_icmp_bad(
481; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 3
482; CHECK-NEXT:    [[B:%.*]] = mul i32 [[X]], [[Z:%.*]]
483; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
484; CHECK-NEXT:    ret i32 [[C]]
485;
486  %A = icmp eq i32 %x, 3
487  %B = mul i32 %x, %z
488  %C = select i1 %A, i32 %B, i32 %y
489  ret i32 %C
490}
491
492define i32 @select_add_icmp_bad(i32 %x, i32 %y, i32 %z) {
493; CHECK-LABEL: @select_add_icmp_bad(
494; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 1
495; CHECK-NEXT:    [[B:%.*]] = add i32 [[X]], [[Z:%.*]]
496; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
497; CHECK-NEXT:    ret i32 [[C]]
498;
499  %A = icmp eq i32 %x, 1
500  %B = add i32 %x, %z
501  %C = select i1 %A, i32 %B, i32 %y
502  ret i32 %C
503}
504
505define i32 @select_and_icmp_bad(i32 %x, i32 %y, i32 %z) {
506; CHECK-LABEL: @select_and_icmp_bad(
507; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
508; CHECK-NEXT:    [[B:%.*]] = and i32 [[X]], [[Z:%.*]]
509; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
510; CHECK-NEXT:    ret i32 [[C]]
511;
512  %A = icmp eq i32 %x, 0
513  %B = and i32 %x, %z
514  %C = select i1 %A, i32 %B, i32 %y
515  ret i32 %C
516}
517
518define i32 @select_or_icmp_bad(i32 %x, i32 %y, i32 %z) {
519; CHECK-LABEL: @select_or_icmp_bad(
520; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 3
521; CHECK-NEXT:    [[B:%.*]] = or i32 [[X]], [[Z:%.*]]
522; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
523; CHECK-NEXT:    ret i32 [[C]]
524;
525  %A = icmp eq i32 %x, 3
526  %B = or i32 %x, %z
527  %C = select i1 %A, i32 %B, i32 %y
528  ret i32 %C
529}
530
531; Invalid identity constant for FP op
532define float @select_fadd_fcmp_bad(float %x, float %y, float %z) {
533; CHECK-LABEL: @select_fadd_fcmp_bad(
534; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], -1.000000e+00
535; CHECK-NEXT:    [[B:%.*]] = fadd nsz float [[X]], [[Z:%.*]]
536; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
537; CHECK-NEXT:    ret float [[C]]
538;
539  %A = fcmp oeq float %x, -1.0
540  %B = fadd nsz float %x, %z
541  %C = select i1 %A, float %B, float %y
542  ret float %C
543}
544
545; Invalid comparison type
546define float @select_fadd_fcmp_bad_2(float %x, float %y, float %z) {
547; CHECK-LABEL: @select_fadd_fcmp_bad_2(
548; CHECK-NEXT:    [[A:%.*]] = fcmp ueq float [[X:%.*]], -1.000000e+00
549; CHECK-NEXT:    [[B:%.*]] = fadd float [[X]], [[Z:%.*]]
550; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
551; CHECK-NEXT:    ret float [[C]]
552;
553  %A = fcmp ueq float %x, -1.0
554  %B = fadd float %x, %z
555  %C = select i1 %A, float %B, float %y
556  ret float %C
557}
558
559; Invalid comparison type
560define float @select_fadd_fcmp_bad_3(float %x, float %y, float %z, float %k) {
561; CHECK-LABEL: @select_fadd_fcmp_bad_3(
562; CHECK-NEXT:    [[A:%.*]] = fcmp one float [[X:%.*]], [[K:%.*]]
563; CHECK-NEXT:    [[B:%.*]] = fadd float [[X]], [[Z:%.*]]
564; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]]
565; CHECK-NEXT:    ret float [[C]]
566;
567  %A = fcmp one float %x, %k
568  %B = fadd float %x, %z
569  %C = select i1 %A, float %y, float %B
570  ret float %C
571}
572
573; Invalid order of operands of select
574define float @select_fadd_fcmp_bad_4(float %x, float %y, float %z) {
575; CHECK-LABEL: @select_fadd_fcmp_bad_4(
576; CHECK-NEXT:    [[A:%.*]] = fcmp une float [[X:%.*]], -0.000000e+00
577; CHECK-NEXT:    [[B:%.*]] = fadd float [[X]], [[Z:%.*]]
578; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
579; CHECK-NEXT:    ret float [[C]]
580;
581  %A = fcmp une float %x, -0.0
582  %B = fadd float %x, %z
583  %C = select i1 %A, float %B, float %y
584  ret float %C
585}
586
587; Invalid comparison type
588define float @select_fadd_fcmp_bad_5(float %x, float %y, float %z) {
589; CHECK-LABEL: @select_fadd_fcmp_bad_5(
590; CHECK-NEXT:    [[A:%.*]] = fcmp one float [[X:%.*]], -0.000000e+00
591; CHECK-NEXT:    [[B:%.*]] = fadd nsz float [[Z:%.*]], [[X]]
592; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]]
593; CHECK-NEXT:    ret float [[C]]
594;
595  %A = fcmp one float %x, -0.0
596  %B = fadd nsz float %z, %x
597  %C = select i1 %A, float %y, float %B
598  ret float %C
599}
600
601; Invalid order of operands of select
602define float @select_fadd_fcmp_bad_6(float %x, float %y, float %z) {
603; CHECK-LABEL: @select_fadd_fcmp_bad_6(
604; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], -0.000000e+00
605; CHECK-NEXT:    [[B:%.*]] = fadd nsz float [[Z:%.*]], [[X]]
606; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]]
607; CHECK-NEXT:    ret float [[C]]
608;
609  %A = fcmp oeq float %x, -0.0
610  %B = fadd nsz float %z, %x
611  %C = select i1 %A, float %y, float %B
612  ret float %C
613}
614
615; Do not transform if we have signed zeros and if Z is possibly negative zero
616define float @select_fadd_fcmp_bad_7(float %x, float %y, float %z) {
617; CHECK-LABEL: @select_fadd_fcmp_bad_7(
618; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], -0.000000e+00
619; CHECK-NEXT:    [[B:%.*]] = fadd float [[X]], [[Z:%.*]]
620; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
621; CHECK-NEXT:    ret float [[C]]
622;
623  %A = fcmp oeq float %x, -0.0
624  %B = fadd float %x, %z
625  %C = select i1 %A, float %B, float %y
626  ret float %C
627}
628
629; Invalid comparison type
630define float @select_fadd_fcmp_bad_8(float %x, float %y, float %v) {
631; CHECK-LABEL: @select_fadd_fcmp_bad_8(
632; CHECK-NEXT:    [[A:%.*]] = fcmp one float [[X:%.*]], -0.000000e+00
633; CHECK-NEXT:    [[Z:%.*]] = fadd float [[V:%.*]], -1.000000e+00
634; CHECK-NEXT:    [[B:%.*]] = fadd float [[Z]], [[X]]
635; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]]
636; CHECK-NEXT:    ret float [[C]]
637;
638  %A = fcmp one float %x, -0.0
639  %z = fadd float %v, -1.0
640  %B = fadd float %z, %x
641  %C = select i1 %A, float %y, float %B
642  ret float %C
643}
644
645; Invalid comparison type
646define float @select_fadd_fcmp_bad_9(float %x, float %y, float %z) {
647; CHECK-LABEL: @select_fadd_fcmp_bad_9(
648; CHECK-NEXT:    [[A:%.*]] = fcmp one float [[X:%.*]], -0.000000e+00
649; CHECK-NEXT:    [[B:%.*]] = fadd nsz float [[Z:%.*]], [[X]]
650; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]]
651; CHECK-NEXT:    ret float [[C]]
652;
653  %A = fcmp one float %x, -0.0
654  %B = fadd nsz float %z, %x
655  %C = select i1 %A, float %y, float %B
656  ret float %C
657}
658
659; Invalid comparison type
660define float @select_fadd_fcmp_bad_10(float %x, float %y, float %v) {
661; CHECK-LABEL: @select_fadd_fcmp_bad_10(
662; CHECK-NEXT:    [[A:%.*]] = fcmp one float [[X:%.*]], -0.000000e+00
663; CHECK-NEXT:    [[Z:%.*]] = fadd float [[V:%.*]], 0.000000e+00
664; CHECK-NEXT:    [[B:%.*]] = fadd float [[Z]], [[X]]
665; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]]
666; CHECK-NEXT:    ret float [[C]]
667;
668  %A = fcmp one float %x, -0.0
669  %z = fadd float %v, 0.0 ; cannot produce -0.0
670  %B = fadd float %z, %x
671  %C = select i1 %A, float %y, float %B
672  ret float %C
673}
674
675; Do not transform if Z is possibly negative zero
676define float @select_fadd_fcmp_bad_11(float %x, float %y, float %v) {
677; CHECK-LABEL: @select_fadd_fcmp_bad_11(
678; CHECK-NEXT:    [[A:%.*]] = fcmp une float [[X:%.*]], -0.000000e+00
679; CHECK-NEXT:    [[Z:%.*]] = fadd float [[V:%.*]], -1.000000e+00
680; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[Z]]
681; CHECK-NEXT:    ret float [[C]]
682;
683  %A = fcmp une float %x, -0.0
684  %z = fadd float %v, -1.0
685  %B = fadd nsz float %z, %x
686  %C = select i1 %A, float %y, float %B
687  ret float %C
688}
689
690; Do not transform if we have signed zeros and if Z is possibly negative zero
691define float @select_fadd_fcmp_bad_12(float %x, float %y, float %z) {
692; CHECK-LABEL: @select_fadd_fcmp_bad_12(
693; CHECK-NEXT:    [[A:%.*]] = fcmp une float [[X:%.*]], -0.000000e+00
694; CHECK-NEXT:    [[B:%.*]] = fadd float [[Z:%.*]], [[X]]
695; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]]
696; CHECK-NEXT:    ret float [[C]]
697;
698  %A = fcmp une float %x, -0.0
699  %B = fadd float %z, %x
700  %C = select i1 %A, float %y, float %B
701  ret float %C
702}
703
704; Invalid order of operands of select
705define float @select_fadd_fcmp_bad_13(float %x, float %y, float %z) {
706; CHECK-LABEL: @select_fadd_fcmp_bad_13(
707; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], -0.000000e+00
708; CHECK-NEXT:    [[B:%.*]] = fadd nsz float [[X]], [[Z:%.*]]
709; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]]
710; CHECK-NEXT:    ret float [[C]]
711;
712  %A = fcmp oeq float %x, -0.0
713  %B = fadd nsz float %x, %z
714  %C = select i1 %A, float %y, float %B
715  ret float %C
716}
717
718; Invalid identity constant for FP op
719define float @select_fadd_fcmp_bad_14(float %x, float %y, float %z) {
720; CHECK-LABEL: @select_fadd_fcmp_bad_14(
721; CHECK-NEXT:    [[A:%.*]] = fcmp une float [[X:%.*]], -1.000000e+00
722; CHECK-NEXT:    [[B:%.*]] = fadd nsz float [[X]], [[Z:%.*]]
723; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]]
724; CHECK-NEXT:    ret float [[C]]
725;
726  %A = fcmp une float %x, -1.0
727  %B = fadd nsz float %x, %z
728  %C = select i1 %A, float %y, float %B
729  ret float %C
730}
731
732; Invalid identity constant for FP op
733define float @select_fadd_fcmp_bad_15(float %x, float %y, float %z) {
734; CHECK-LABEL: @select_fadd_fcmp_bad_15(
735; CHECK-NEXT:    [[A:%.*]] = fcmp une float [[X:%.*]], 0.000000e+00
736; CHECK-NEXT:    [[B:%.*]] = fadd nsz float [[Z:%.*]], [[X]]
737; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]]
738; CHECK-NEXT:    ret float [[C]]
739;
740  %A = fcmp une float %x, 0.0
741  %B = fadd nsz float %z, %x
742  %C = select i1 %A, float %y, float %B
743  ret float %C
744}
745
746; Invalid identity constant for FP op
747define float @select_fadd_fcmp_bad_16(float %x, float %y, float %z) {
748; CHECK-LABEL: @select_fadd_fcmp_bad_16(
749; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
750; CHECK-NEXT:    [[B:%.*]] = fadd nsz float [[Z:%.*]], [[X]]
751; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
752; CHECK-NEXT:    ret float [[C]]
753;
754  %A = fcmp oeq float %x, 0.0
755  %B = fadd nsz float %z, %x
756  %C = select i1 %A, float %B, float %y
757  ret float %C
758}
759
760define float @select_fmul_fcmp_bad(float %x, float %y, float %z) {
761; CHECK-LABEL: @select_fmul_fcmp_bad(
762; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], 3.000000e+00
763; CHECK-NEXT:    [[B:%.*]] = fmul nsz float [[X]], [[Z:%.*]]
764; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
765; CHECK-NEXT:    ret float [[C]]
766;
767  %A = fcmp oeq float %x, 3.0
768  %B = fmul nsz float %x, %z
769  %C = select i1 %A, float %B, float %y
770  ret float %C
771}
772
773define float @select_fmul_fcmp_bad_2(float %x, float %y, float %z) {
774; CHECK-LABEL: @select_fmul_fcmp_bad_2(
775; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00
776; CHECK-NEXT:    [[B:%.*]] = fmul float [[X]], [[Z:%.*]]
777; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
778; CHECK-NEXT:    ret float [[C]]
779;
780  %A = fcmp oeq float %x, 1.0
781  %B = fmul float %x, %z
782  %C = select i1 %A, float %B, float %y
783  ret float %C
784}
785
786define float @select_fmul_icmp_bad(float %x, float %y, float %z, i32 %k) {
787; CHECK-LABEL: @select_fmul_icmp_bad(
788; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[K:%.*]], 0
789; CHECK-NEXT:    [[B:%.*]] = fmul float [[X:%.*]], [[Z:%.*]]
790; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
791; CHECK-NEXT:    ret float [[C]]
792;
793  %A = icmp eq i32 %k, 0
794  %B = fmul float %x, %z
795  %C = select i1 %A, float %B, float %y
796  ret float %C
797}
798
799define float @select_fmul_icmp_bad_2(float %x, float %y, float %z, i32 %k) {
800; CHECK-LABEL: @select_fmul_icmp_bad_2(
801; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[K:%.*]], 0
802; CHECK-NEXT:    [[B:%.*]] = fmul nsz float [[X:%.*]], [[Z:%.*]]
803; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
804; CHECK-NEXT:    ret float [[C]]
805;
806  %A = icmp eq i32 %k, 0
807  %B = fmul nsz float %x, %z
808  %C = select i1 %A, float %B, float %y
809  ret float %C
810}
811
812define float @select_fdiv_fcmp_bad(float %x, float %y, float %z) {
813; CHECK-LABEL: @select_fdiv_fcmp_bad(
814; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00
815; CHECK-NEXT:    [[B:%.*]] = fdiv float [[X]], [[Z:%.*]]
816; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
817; CHECK-NEXT:    ret float [[C]]
818;
819  %A = fcmp oeq float %x, 1.0
820  %B = fdiv float %x, %z
821  %C = select i1 %A, float %B, float %y
822  ret float %C
823}
824
825define float @select_fdiv_fcmp_bad_2(float %x, float %y, float %z) {
826; CHECK-LABEL: @select_fdiv_fcmp_bad_2(
827; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], 3.000000e+00
828; CHECK-NEXT:    [[B:%.*]] = fdiv nsz float [[X]], [[Z:%.*]]
829; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
830; CHECK-NEXT:    ret float [[C]]
831;
832  %A = fcmp oeq float %x, 3.0
833  %B = fdiv nsz float %x, %z
834  %C = select i1 %A, float %B, float %y
835  ret float %C
836}
837
838define float @select_fsub_fcmp_bad(float %x, float %y, float %z) {
839; CHECK-LABEL: @select_fsub_fcmp_bad(
840; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
841; CHECK-NEXT:    [[B:%.*]] = fsub float [[X]], [[Z:%.*]]
842; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
843; CHECK-NEXT:    ret float [[C]]
844;
845  %A = fcmp oeq float %x, 0.0
846  %B = fsub float %x, %z
847  %C = select i1 %A, float %B, float %y
848  ret float %C
849}
850
851define float @select_fsub_fcmp_bad_2(float %x, float %y, float %z) {
852; CHECK-LABEL: @select_fsub_fcmp_bad_2(
853; CHECK-NEXT:    [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00
854; CHECK-NEXT:    [[B:%.*]] = fsub nsz float [[X]], [[Z:%.*]]
855; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
856; CHECK-NEXT:    ret float [[C]]
857;
858  %A = fcmp oeq float %x, 1.0
859  %B = fsub nsz float %x, %z
860  %C = select i1 %A, float %B, float %y
861  ret float %C
862}
863
864define i32 @select_sub_icmp_bad(i32 %x, i32 %y, i32 %z) {
865; CHECK-LABEL: @select_sub_icmp_bad(
866; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
867; CHECK-NEXT:    [[B:%.*]] = sub i32 [[X]], [[Z:%.*]]
868; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
869; CHECK-NEXT:    ret i32 [[C]]
870;
871  %A = icmp eq i32 %x, 0
872  %B = sub i32 %x, %z
873  %C = select i1 %A, i32 %B, i32 %y
874  ret i32 %C
875}
876
877define i32 @select_sub_icmp_bad_2(i32 %x, i32 %y, i32 %z) {
878; CHECK-LABEL: @select_sub_icmp_bad_2(
879; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 1
880; CHECK-NEXT:    [[B:%.*]] = sub i32 [[Z:%.*]], [[X]]
881; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
882; CHECK-NEXT:    ret i32 [[C]]
883;
884  %A = icmp eq i32 %x, 1
885  %B = sub i32 %z, %x
886  %C = select i1 %A, i32 %B, i32 %y
887  ret i32 %C
888}
889
890define i32 @select_sub_icmp_bad_3(i32 %x, i32 %y, i32 %z) {
891; CHECK-LABEL: @select_sub_icmp_bad_3(
892; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], 0
893; CHECK-NEXT:    call void @use2(i1 [[A]])
894; CHECK-NEXT:    [[B:%.*]] = sub i32 [[Z:%.*]], [[X]]
895; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
896; CHECK-NEXT:    ret i32 [[C]]
897;
898  %A = icmp ne i32 %x, 0
899  call void @use2(i1 %A)
900  %B = sub i32 %z, %x
901  %C = select i1 %A, i32 %B, i32 %y
902  ret i32 %C
903}
904
905define i32 @select_sub_icmp_4(i32 %x, i32 %y, i32 %z) {
906; CHECK-LABEL: @select_sub_icmp_4(
907; CHECK-NEXT:    [[A:%.*]] = icmp ne i32 [[X:%.*]], 0
908; CHECK-NEXT:    call void @use2(i1 [[A]])
909; CHECK-NEXT:    [[B:%.*]] = sub i32 [[Z:%.*]], [[X]]
910; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
911; CHECK-NEXT:    ret i32 [[C]]
912;
913  %A = icmp ne i32 %x, 0
914  call void @use2(i1 %A)
915  %B = sub i32 %z, %x
916  %C = select i1 %A, i32 %B, i32 %y
917  ret i32 %C
918}
919
920define i32 @select_sub_icmp_bad_4(i32 %x, i32 %y, i32 %z, i32 %k) {
921; CHECK-LABEL: @select_sub_icmp_bad_4(
922; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 0
923; CHECK-NEXT:    [[B:%.*]] = sub i32 [[Z:%.*]], [[K:%.*]]
924; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
925; CHECK-NEXT:    ret i32 [[C]]
926;
927  %A = icmp eq i32 %x, 0
928  %B = sub i32 %z, %k
929  %C = select i1 %A, i32 %B, i32 %y
930  ret i32 %C
931}
932
933define i32 @select_sub_icmp_bad_5(i32 %x, i32 %y, i32 %z, i32 %k) {
934; CHECK-LABEL: @select_sub_icmp_bad_5(
935; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]
936; CHECK-NEXT:    [[B:%.*]] = sub i32 [[Z:%.*]], [[X]]
937; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
938; CHECK-NEXT:    ret i32 [[C]]
939;
940  %A = icmp eq i32 %x, %k
941  %B = sub i32 %z, %x
942  %C = select i1 %A, i32 %B, i32 %y
943  ret i32 %C
944}
945
946define i32 @select_shl_icmp_bad(i32 %x, i32 %y, i32 %z) {
947; CHECK-LABEL: @select_shl_icmp_bad(
948; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 1
949; CHECK-NEXT:    [[B:%.*]] = shl i32 [[Z:%.*]], [[X]]
950; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
951; CHECK-NEXT:    ret i32 [[C]]
952;
953  %A = icmp eq i32 %x, 1
954  %B = shl i32 %z, %x
955  %C = select i1 %A, i32 %B, i32 %y
956  ret i32 %C
957}
958
959define i32 @select_lshr_icmp_bad(i32 %x, i32 %y, i32 %z) {
960; CHECK-LABEL: @select_lshr_icmp_bad(
961; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 1
962; CHECK-NEXT:    [[B:%.*]] = lshr i32 [[Z:%.*]], [[X]]
963; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
964; CHECK-NEXT:    ret i32 [[C]]
965;
966  %A = icmp eq i32 %x, 1
967  %B = lshr i32 %z, %x
968  %C = select i1 %A, i32 %B, i32 %y
969  ret i32 %C
970}
971
972define i32 @select_ashr_icmp_bad(i32 %x, i32 %y, i32 %z) {
973; CHECK-LABEL: @select_ashr_icmp_bad(
974; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 1
975; CHECK-NEXT:    [[B:%.*]] = ashr i32 [[Z:%.*]], [[X]]
976; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
977; CHECK-NEXT:    ret i32 [[C]]
978;
979  %A = icmp eq i32 %x, 1
980  %B = ashr i32 %z, %x
981  %C = select i1 %A, i32 %B, i32 %y
982  ret i32 %C
983}
984
985define i32 @select_udiv_icmp_bad(i32 %x, i32 %y, i32 %z) {
986; CHECK-LABEL: @select_udiv_icmp_bad(
987; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 3
988; CHECK-NEXT:    [[B:%.*]] = udiv i32 [[Z:%.*]], [[X]]
989; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
990; CHECK-NEXT:    ret i32 [[C]]
991;
992  %A = icmp eq i32 %x, 3
993  %B = udiv i32 %z, %x
994  %C = select i1 %A, i32 %B, i32 %y
995  ret i32 %C
996}
997
998define i32 @select_sdiv_icmp_bad(i32 %x, i32 %y, i32 %z) {
999; CHECK-LABEL: @select_sdiv_icmp_bad(
1000; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], 3
1001; CHECK-NEXT:    [[B:%.*]] = sdiv i32 [[Z:%.*]], [[X]]
1002; CHECK-NEXT:    [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 [[Y:%.*]]
1003; CHECK-NEXT:    ret i32 [[C]]
1004;
1005  %A = icmp eq i32 %x, 3
1006  %B = sdiv i32 %z, %x
1007  %C = select i1 %A, i32 %B, i32 %y
1008  ret i32 %C
1009}
1010
1011!0 = !{!"branch_weights", i32 2, i32 10}
1012