xref: /llvm-project/llvm/test/Transforms/InstCombine/select-and-cmp.ll (revision 62a25a4c7c3b291f0805894926419f1a64cd83f8)
1*62a25a4cSYihang Liu; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*62a25a4cSYihang Liu; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3*62a25a4cSYihang Liu
4*62a25a4cSYihang Liudefine i32 @select_and_icmp(i32 %x, i32 %y, i32 %z) {
5*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp(
6*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[X:%.*]]
7*62a25a4cSYihang Liu;
8*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
9*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
10*62a25a4cSYihang Liu  %C = and i1 %A, %B
11*62a25a4cSYihang Liu  %D = select i1 %C, i32 %z, i32 %x
12*62a25a4cSYihang Liu  ret i32 %D
13*62a25a4cSYihang Liu}
14*62a25a4cSYihang Liu
15*62a25a4cSYihang Liudefine <2 x i8> @select_and_icmp_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
16*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_vec(
17*62a25a4cSYihang Liu; CHECK-NEXT:    ret <2 x i8> [[X:%.*]]
18*62a25a4cSYihang Liu;
19*62a25a4cSYihang Liu  %A = icmp eq <2 x i8> %x, %z
20*62a25a4cSYihang Liu  %B = icmp eq <2 x i8> %y, %z
21*62a25a4cSYihang Liu  %C = and <2 x i1> %A, %B
22*62a25a4cSYihang Liu  %D = select <2 x i1> %C, <2 x i8> %z, <2 x i8> %x
23*62a25a4cSYihang Liu  ret <2 x i8> %D
24*62a25a4cSYihang Liu}
25*62a25a4cSYihang Liu
26*62a25a4cSYihang Liudefine i32 @select_and_icmp2(i32 %x, i32 %y, i32 %z) {
27*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp2(
28*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[Y:%.*]]
29*62a25a4cSYihang Liu;
30*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
31*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
32*62a25a4cSYihang Liu  %C = and i1 %A, %B
33*62a25a4cSYihang Liu  %D = select i1 %C, i32 %z, i32 %y
34*62a25a4cSYihang Liu  ret i32 %D
35*62a25a4cSYihang Liu}
36*62a25a4cSYihang Liu
37*62a25a4cSYihang Liudefine i32 @select_and_icmp_alt(i32 %x, i32 %y, i32 %z) {
38*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_alt(
39*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[Z:%.*]]
40*62a25a4cSYihang Liu;
41*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
42*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
43*62a25a4cSYihang Liu  %C = and i1 %A, %B
44*62a25a4cSYihang Liu  %D = select i1 %C, i32 %x, i32 %z
45*62a25a4cSYihang Liu  ret i32 %D
46*62a25a4cSYihang Liu}
47*62a25a4cSYihang Liu
48*62a25a4cSYihang Liudefine i32 @select_and_icmp_alt2(i32 %x, i32 %y, i32 %z) {
49*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_alt2(
50*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[Z:%.*]]
51*62a25a4cSYihang Liu;
52*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
53*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
54*62a25a4cSYihang Liu  %C = and i1 %A, %B
55*62a25a4cSYihang Liu  %D = select i1 %C, i32 %y, i32 %z
56*62a25a4cSYihang Liu  ret i32 %D
57*62a25a4cSYihang Liu}
58*62a25a4cSYihang Liu
59*62a25a4cSYihang Liudefine i32 @select_and_icmp_inv_alt(i32 %x, i32 %y, i32 %z) {
60*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_inv_alt(
61*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[Z:%.*]]
62*62a25a4cSYihang Liu;
63*62a25a4cSYihang Liu  %A = icmp eq i32 %z, %x
64*62a25a4cSYihang Liu  %B = icmp eq i32 %z, %y
65*62a25a4cSYihang Liu  %C = and i1 %A, %B
66*62a25a4cSYihang Liu  %D = select i1 %C, i32 %x, i32 %z
67*62a25a4cSYihang Liu  ret i32 %D
68*62a25a4cSYihang Liu}
69*62a25a4cSYihang Liu
70*62a25a4cSYihang Liudefine i32 @select_and_inv_icmp_alt(i32 %x, i32 %y, i32 %z) {
71*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_inv_icmp_alt(
72*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[Z:%.*]]
73*62a25a4cSYihang Liu;
74*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
75*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
76*62a25a4cSYihang Liu  %C = and i1 %B, %A
77*62a25a4cSYihang Liu  %D = select i1 %C, i32 %x, i32 %z
78*62a25a4cSYihang Liu  ret i32 %D
79*62a25a4cSYihang Liu}
80*62a25a4cSYihang Liu
81*62a25a4cSYihang Liudefine i32 @select_and_inv_icmp(i32 %x, i32 %y, i32 %z) {
82*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_inv_icmp(
83*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[X:%.*]]
84*62a25a4cSYihang Liu;
85*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
86*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
87*62a25a4cSYihang Liu  %C = and i1 %B , %A
88*62a25a4cSYihang Liu  %D = select i1 %C, i32 %z, i32 %x
89*62a25a4cSYihang Liu  ret i32 %D
90*62a25a4cSYihang Liu}
91*62a25a4cSYihang Liu
92*62a25a4cSYihang Liudefine <2 x i8> @select_and_icmp_alt_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
93*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_alt_vec(
94*62a25a4cSYihang Liu; CHECK-NEXT:    ret <2 x i8> [[Z:%.*]]
95*62a25a4cSYihang Liu;
96*62a25a4cSYihang Liu  %A = icmp eq <2 x i8> %x, %z
97*62a25a4cSYihang Liu  %B = icmp eq <2 x i8> %y, %z
98*62a25a4cSYihang Liu  %C = and <2 x i1> %A, %B
99*62a25a4cSYihang Liu  %D = select <2 x i1> %C, <2 x i8> %x, <2 x i8> %z
100*62a25a4cSYihang Liu  ret <2 x i8> %D
101*62a25a4cSYihang Liu}
102*62a25a4cSYihang Liu
103*62a25a4cSYihang Liudefine i32 @select_and_icmp_inv(i32 %x, i32 %y, i32 %z) {
104*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_inv(
105*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[X:%.*]]
106*62a25a4cSYihang Liu;
107*62a25a4cSYihang Liu  %A = icmp eq i32 %z, %x
108*62a25a4cSYihang Liu  %B = icmp eq i32 %z, %y
109*62a25a4cSYihang Liu  %C = and i1 %A, %B
110*62a25a4cSYihang Liu  %D = select i1 %C, i32 %z, i32 %x
111*62a25a4cSYihang Liu  ret i32 %D
112*62a25a4cSYihang Liu}
113*62a25a4cSYihang Liu
114*62a25a4cSYihang Liu
115*62a25a4cSYihang Liu; Below used to be negative tests in InstSimplify, but are no more negative cases here
116*62a25a4cSYihang Liu
117*62a25a4cSYihang Liudefine i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
118*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_pred_bad_1(
119*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[X]]
120*62a25a4cSYihang Liu;
121*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
122*62a25a4cSYihang Liu  %B = icmp ne i32 %y, %z
123*62a25a4cSYihang Liu  %C = and i1 %A, %B
124*62a25a4cSYihang Liu  %D = select i1 %C, i32 %z, i32 %x
125*62a25a4cSYihang Liu  ret i32 %D
126*62a25a4cSYihang Liu}
127*62a25a4cSYihang Liu
128*62a25a4cSYihang Liudefine i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
129*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_pred_bad_2(
130*62a25a4cSYihang Liu; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]
131*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[B]], i32 [[Z]], i32 [[X]]
132*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
133*62a25a4cSYihang Liu;
134*62a25a4cSYihang Liu  %A = icmp ne i32 %x, %z
135*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
136*62a25a4cSYihang Liu  %C = and i1 %A, %B
137*62a25a4cSYihang Liu  %D = select i1 %C, i32 %z, i32 %x
138*62a25a4cSYihang Liu  ret i32 %D
139*62a25a4cSYihang Liu}
140*62a25a4cSYihang Liu
141*62a25a4cSYihang Liudefine i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
142*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_pred_bad_3(
143*62a25a4cSYihang Liu; CHECK-NEXT:    [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
144*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[B_NOT]], i32 [[X]], i32 [[Z]]
145*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
146*62a25a4cSYihang Liu;
147*62a25a4cSYihang Liu  %A = icmp ne i32 %x, %z
148*62a25a4cSYihang Liu  %B = icmp ne i32 %y, %z
149*62a25a4cSYihang Liu  %C = and i1 %A, %B
150*62a25a4cSYihang Liu  %D = select i1 %C, i32 %z, i32 %x
151*62a25a4cSYihang Liu  ret i32 %D
152*62a25a4cSYihang Liu}
153*62a25a4cSYihang Liu
154*62a25a4cSYihang Liudefine i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
155*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_pred_bad_4(
156*62a25a4cSYihang Liu; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
157*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[B]], i32 [[Z]], i32 [[X]]
158*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
159*62a25a4cSYihang Liu;
160*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
161*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
162*62a25a4cSYihang Liu  %C = or i1 %A, %B
163*62a25a4cSYihang Liu  %D = select i1 %C, i32 %z, i32 %x
164*62a25a4cSYihang Liu  ret i32 %D
165*62a25a4cSYihang Liu}
166*62a25a4cSYihang Liu
167*62a25a4cSYihang Liudefine i32 @select_and_icmp_alt_bad_1(i32 %x, i32 %y, i32 %z) {
168*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_alt_bad_1(
169*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[Z]]
170*62a25a4cSYihang Liu;
171*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
172*62a25a4cSYihang Liu  %B = icmp ne i32 %y, %z
173*62a25a4cSYihang Liu  %C = and i1 %A, %B
174*62a25a4cSYihang Liu  %D = select i1 %C, i32 %x, i32 %z
175*62a25a4cSYihang Liu  ret i32 %D
176*62a25a4cSYihang Liu}
177*62a25a4cSYihang Liu
178*62a25a4cSYihang Liudefine i32 @select_and_icmp_alt_bad_2(i32 %x, i32 %y, i32 %z) {
179*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_alt_bad_2(
180*62a25a4cSYihang Liu; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
181*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[B]], i32 [[X]], i32 [[Z]]
182*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
183*62a25a4cSYihang Liu;
184*62a25a4cSYihang Liu  %A = icmp ne i32 %x, %z
185*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
186*62a25a4cSYihang Liu  %C = and i1 %A, %B
187*62a25a4cSYihang Liu  %D = select i1 %C, i32 %x, i32 %z
188*62a25a4cSYihang Liu  ret i32 %D
189*62a25a4cSYihang Liu}
190*62a25a4cSYihang Liu
191*62a25a4cSYihang Liu
192*62a25a4cSYihang Liudefine i32 @select_and_icmp_alt_bad_3(i32 %x, i32 %y, i32 %z) {
193*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_alt_bad_3(
194*62a25a4cSYihang Liu; CHECK-NEXT:    [[B_NOT:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
195*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[B_NOT]], i32 [[Z]], i32 [[X]]
196*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
197*62a25a4cSYihang Liu;
198*62a25a4cSYihang Liu  %A = icmp ne i32 %x, %z
199*62a25a4cSYihang Liu  %B = icmp ne i32 %y, %z
200*62a25a4cSYihang Liu  %C = and i1 %A, %B
201*62a25a4cSYihang Liu  %D = select i1 %C, i32 %x, i32 %z
202*62a25a4cSYihang Liu  ret i32 %D
203*62a25a4cSYihang Liu}
204*62a25a4cSYihang Liu
205*62a25a4cSYihang Liudefine i32 @select_and_icmp_alt_bad_4(i32 %x, i32 %y, i32 %z) {
206*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_alt_bad_4(
207*62a25a4cSYihang Liu; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
208*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[B]], i32 [[X]], i32 [[Z]]
209*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
210*62a25a4cSYihang Liu;
211*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
212*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
213*62a25a4cSYihang Liu  %C = or i1 %A, %B
214*62a25a4cSYihang Liu  %D = select i1 %C, i32 %x, i32 %z
215*62a25a4cSYihang Liu  ret i32 %D
216*62a25a4cSYihang Liu}
217*62a25a4cSYihang Liu
218*62a25a4cSYihang Liu
219*62a25a4cSYihang Liu; Negative tests
220*62a25a4cSYihang Liu
221*62a25a4cSYihang Liudefine i32 @select_and_icmp_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
222*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_bad_true_val(
223*62a25a4cSYihang Liu; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
224*62a25a4cSYihang Liu; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
225*62a25a4cSYihang Liu; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
226*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[X]]
227*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
228*62a25a4cSYihang Liu;
229*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
230*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
231*62a25a4cSYihang Liu  %C = and i1 %A, %B
232*62a25a4cSYihang Liu  %D = select i1 %C, i32 %k, i32 %x
233*62a25a4cSYihang Liu  ret i32 %D
234*62a25a4cSYihang Liu}
235*62a25a4cSYihang Liu
236*62a25a4cSYihang Liudefine i32 @select_and_icmp_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
237*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_bad_false_val(
238*62a25a4cSYihang Liu; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
239*62a25a4cSYihang Liu; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
240*62a25a4cSYihang Liu; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
241*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[K:%.*]]
242*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
243*62a25a4cSYihang Liu;
244*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
245*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
246*62a25a4cSYihang Liu  %C = and i1 %A, %B
247*62a25a4cSYihang Liu  %D = select i1 %C, i32 %z, i32 %k
248*62a25a4cSYihang Liu  ret i32 %D
249*62a25a4cSYihang Liu}
250*62a25a4cSYihang Liu
251*62a25a4cSYihang Liudefine i32 @select_and_icmp_bad_op(i32 %x, i32 %y, i32 %z, i32 %k) {
252*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_bad_op(
253*62a25a4cSYihang Liu; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[K:%.*]], [[Z:%.*]]
254*62a25a4cSYihang Liu; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
255*62a25a4cSYihang Liu; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
256*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X:%.*]]
257*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
258*62a25a4cSYihang Liu;
259*62a25a4cSYihang Liu  %A = icmp eq i32 %k, %z
260*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
261*62a25a4cSYihang Liu  %C = and i1 %A, %B
262*62a25a4cSYihang Liu  %D = select i1 %C, i32 %z, i32 %x
263*62a25a4cSYihang Liu  ret i32 %D
264*62a25a4cSYihang Liu}
265*62a25a4cSYihang Liu
266*62a25a4cSYihang Liudefine i32 @select_and_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {
267*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_bad_op_2(
268*62a25a4cSYihang Liu; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]
269*62a25a4cSYihang Liu; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]
270*62a25a4cSYihang Liu; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
271*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
272*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
273*62a25a4cSYihang Liu;
274*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %k
275*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
276*62a25a4cSYihang Liu  %C = and i1 %A, %B
277*62a25a4cSYihang Liu  %D = select i1 %C, i32 %z, i32 %x
278*62a25a4cSYihang Liu  ret i32 %D
279*62a25a4cSYihang Liu}
280*62a25a4cSYihang Liu
281*62a25a4cSYihang Liudefine i32 @select_and_icmp_alt_bad_5(i32 %x, i32 %y, i32 %z, i32 %k) {
282*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_alt_bad_5(
283*62a25a4cSYihang Liu; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[K:%.*]]
284*62a25a4cSYihang Liu; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z:%.*]]
285*62a25a4cSYihang Liu; CHECK-NEXT:    [[C:%.*]] = or i1 [[A]], [[B]]
286*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
287*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
288*62a25a4cSYihang Liu;
289*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %k
290*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
291*62a25a4cSYihang Liu  %C = or i1 %A, %B
292*62a25a4cSYihang Liu  %D = select i1 %C, i32 %x, i32 %z
293*62a25a4cSYihang Liu  ret i32 %D
294*62a25a4cSYihang Liu}
295*62a25a4cSYihang Liu
296*62a25a4cSYihang Liudefine i32 @select_and_icmp_alt_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
297*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_alt_bad_true_val(
298*62a25a4cSYihang Liu; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
299*62a25a4cSYihang Liu; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
300*62a25a4cSYihang Liu; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
301*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[Z]]
302*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
303*62a25a4cSYihang Liu;
304*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
305*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
306*62a25a4cSYihang Liu  %C = and i1 %A, %B
307*62a25a4cSYihang Liu  %D = select i1 %C, i32 %k, i32 %z
308*62a25a4cSYihang Liu  ret i32 %D
309*62a25a4cSYihang Liu}
310*62a25a4cSYihang Liu
311*62a25a4cSYihang Liudefine i32 @select_and_icmp_alt_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
312*62a25a4cSYihang Liu; CHECK-LABEL: @select_and_icmp_alt_bad_false_val(
313*62a25a4cSYihang Liu; CHECK-NEXT:    [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
314*62a25a4cSYihang Liu; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
315*62a25a4cSYihang Liu; CHECK-NEXT:    [[C:%.*]] = and i1 [[A]], [[B]]
316*62a25a4cSYihang Liu; CHECK-NEXT:    [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[K:%.*]]
317*62a25a4cSYihang Liu; CHECK-NEXT:    ret i32 [[D]]
318*62a25a4cSYihang Liu;
319*62a25a4cSYihang Liu  %A = icmp eq i32 %x, %z
320*62a25a4cSYihang Liu  %B = icmp eq i32 %y, %z
321*62a25a4cSYihang Liu  %C = and i1 %A, %B
322*62a25a4cSYihang Liu  %D = select i1 %C, i32 %x, i32 %k
323*62a25a4cSYihang Liu  ret i32 %D
324*62a25a4cSYihang Liu}
325