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