1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instsimplify -S | FileCheck %s
4 define i32 @select_or_icmp(i32 %x, i32 %y, i32 %z) {
5 ; CHECK-LABEL: @select_or_icmp(
6 ; CHECK-NEXT: ret i32 [[Z:%.*]]
8 %A = icmp ne i32 %x, %z
9 %B = icmp ne i32 %y, %z
11 %D = select i1 %C, i32 %z, i32 %x
15 define <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:%.*]]
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
26 define i32 @select_or_icmp2(i32 %x, i32 %y, i32 %z) {
27 ; CHECK-LABEL: @select_or_icmp2(
28 ; CHECK-NEXT: ret i32 [[Z:%.*]]
30 %A = icmp ne i32 %x, %z
31 %B = icmp ne i32 %y, %z
33 %D = select i1 %C, i32 %z, i32 %y
37 define i32 @select_or_icmp_alt(i32 %x, i32 %y, i32 %z) {
38 ; CHECK-LABEL: @select_or_icmp_alt(
39 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
40 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
41 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
42 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
43 ; CHECK-NEXT: ret i32 [[D]]
45 %A = icmp ne i32 %x, %z
46 %B = icmp ne i32 %y, %z
48 %D = select i1 %C, i32 %x, i32 %z
52 define i32 @select_or_icmp_alt2(i32 %x, i32 %y, i32 %z) {
53 ; CHECK-LABEL: @select_or_icmp_alt2(
54 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
55 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
56 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
57 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Y]], i32 [[Z]]
58 ; CHECK-NEXT: ret i32 [[D]]
60 %A = icmp ne i32 %x, %z
61 %B = icmp ne i32 %y, %z
63 %D = select i1 %C, i32 %y, i32 %z
67 define i32 @select_or_icmp_inv_alt(i32 %x, i32 %y, i32 %z) {
68 ; CHECK-LABEL: @select_or_icmp_inv_alt(
69 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[Z:%.*]], [[X:%.*]]
70 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Z]], [[Y:%.*]]
71 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
72 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
73 ; CHECK-NEXT: ret i32 [[D]]
75 %A = icmp ne i32 %z, %x
76 %B = icmp ne i32 %z, %y
78 %D = select i1 %C, i32 %x, i32 %z
82 define i32 @select_or_inv_icmp_alt(i32 %x, i32 %y, i32 %z) {
83 ; CHECK-LABEL: @select_or_inv_icmp_alt(
84 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[Z:%.*]], [[X:%.*]]
85 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Z]], [[Y:%.*]]
86 ; CHECK-NEXT: [[C:%.*]] = or i1 [[B]], [[A]]
87 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
88 ; CHECK-NEXT: ret i32 [[D]]
90 %A = icmp ne i32 %z, %x
91 %B = icmp ne i32 %z, %y
93 %D = select i1 %C, i32 %x, i32 %z
97 define <2 x i8> @select_or_icmp_alt_vec(<2 x i8> %x, <2 x i8> %y, <2 x i8> %z) {
98 ; CHECK-LABEL: @select_or_icmp_alt_vec(
99 ; CHECK-NEXT: [[A:%.*]] = icmp ne <2 x i8> [[X:%.*]], [[Z:%.*]]
100 ; CHECK-NEXT: [[B:%.*]] = icmp ne <2 x i8> [[Y:%.*]], [[Z]]
101 ; CHECK-NEXT: [[C:%.*]] = or <2 x i1> [[A]], [[B]]
102 ; CHECK-NEXT: [[D:%.*]] = select <2 x i1> [[C]], <2 x i8> [[X]], <2 x i8> [[Z]]
103 ; CHECK-NEXT: ret <2 x i8> [[D]]
105 %A = icmp ne <2 x i8> %x, %z
106 %B = icmp ne <2 x i8> %y, %z
107 %C = or <2 x i1> %A, %B
108 %D = select <2 x i1> %C, <2 x i8> %x, <2 x i8> %z
112 define i32 @select_or_inv_icmp(i32 %x, i32 %y, i32 %z) {
113 ; CHECK-LABEL: @select_or_inv_icmp(
114 ; CHECK-NEXT: ret i32 [[Z:%.*]]
116 %A = icmp ne i32 %x, %z
117 %B = icmp ne i32 %y, %z
119 %D = select i1 %C, i32 %z, i32 %x
123 define i32 @select_or_icmp_inv(i32 %x, i32 %y, i32 %z) {
124 ; CHECK-LABEL: @select_or_icmp_inv(
125 ; CHECK-NEXT: ret i32 [[Z:%.*]]
127 %A = icmp ne i32 %z, %x
128 %B = icmp ne i32 %z, %y
130 %D = select i1 %C, i32 %z, i32 %x
135 define i32 @select_and_icmp_pred_bad_1(i32 %x, i32 %y, i32 %z) {
136 ; CHECK-LABEL: @select_and_icmp_pred_bad_1(
137 ; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
138 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
139 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
140 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
141 ; CHECK-NEXT: ret i32 [[D]]
143 %A = icmp eq i32 %x, %z
144 %B = icmp ne i32 %y, %z
146 %D = select i1 %C, i32 %z, i32 %x
150 define i32 @select_and_icmp_pred_bad_2(i32 %x, i32 %y, i32 %z) {
151 ; CHECK-LABEL: @select_and_icmp_pred_bad_2(
152 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
153 ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
154 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
155 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
156 ; CHECK-NEXT: ret i32 [[D]]
158 %A = icmp ne i32 %x, %z
159 %B = icmp eq i32 %y, %z
161 %D = select i1 %C, i32 %z, i32 %x
165 define i32 @select_and_icmp_pred_bad_3(i32 %x, i32 %y, i32 %z) {
166 ; CHECK-LABEL: @select_and_icmp_pred_bad_3(
167 ; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
168 ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
169 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
170 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
171 ; CHECK-NEXT: ret i32 [[D]]
173 %A = icmp eq i32 %x, %z
174 %B = icmp eq i32 %y, %z
176 %D = select i1 %C, i32 %z, i32 %x
180 define i32 @select_and_icmp_pred_bad_4(i32 %x, i32 %y, i32 %z) {
181 ; CHECK-LABEL: @select_and_icmp_pred_bad_4(
182 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
183 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
184 ; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
185 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
186 ; CHECK-NEXT: ret i32 [[D]]
188 %A = icmp ne i32 %x, %z
189 %B = icmp ne i32 %y, %z
191 %D = select i1 %C, i32 %z, i32 %x
195 define i32 @select_or_icmp_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
196 ; CHECK-LABEL: @select_or_icmp_bad_true_val(
197 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
198 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
199 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
200 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[X]]
201 ; CHECK-NEXT: ret i32 [[D]]
203 %A = icmp ne i32 %x, %z
204 %B = icmp ne i32 %y, %z
206 %D = select i1 %C, i32 %k, i32 %x
210 define i32 @select_or_icmp_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
211 ; CHECK-LABEL: @select_or_icmp_bad_false_val(
212 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
213 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
214 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
215 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[K:%.*]]
216 ; CHECK-NEXT: ret i32 [[D]]
218 %A = icmp ne i32 %x, %z
219 %B = icmp ne i32 %y, %z
221 %D = select i1 %C, i32 %z, i32 %k
225 define i32 @select_or_icmp_bad_op(i32 %x, i32 %y, i32 %z, i32 %k) {
226 ; CHECK-LABEL: @select_or_icmp_bad_op(
227 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[K:%.*]], [[Z:%.*]]
228 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
229 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
230 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X:%.*]]
231 ; CHECK-NEXT: ret i32 [[D]]
233 %A = icmp ne i32 %k, %z
234 %B = icmp ne i32 %y, %z
236 %D = select i1 %C, i32 %z, i32 %x
241 define i32 @select_or_icmp_bad_op_2(i32 %x, i32 %y, i32 %z, i32 %k) {
242 ; CHECK-LABEL: @select_or_icmp_bad_op_2(
243 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]]
244 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z:%.*]]
245 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
246 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[Z]], i32 [[X]]
247 ; CHECK-NEXT: ret i32 [[D]]
249 %A = icmp ne i32 %x, %k
250 %B = icmp ne i32 %y, %z
252 %D = select i1 %C, i32 %z, i32 %x
256 define i32 @select_or_icmp_alt_bad_1(i32 %x, i32 %y, i32 %z) {
257 ; CHECK-LABEL: @select_or_icmp_alt_bad_1(
258 ; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
259 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
260 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
261 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
262 ; CHECK-NEXT: ret i32 [[D]]
264 %A = icmp eq i32 %x, %z
265 %B = icmp ne i32 %y, %z
267 %D = select i1 %C, i32 %x, i32 %z
271 define i32 @select_or_icmp_alt_bad_2(i32 %x, i32 %y, i32 %z) {
272 ; CHECK-LABEL: @select_or_icmp_alt_bad_2(
273 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
274 ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
275 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
276 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
277 ; CHECK-NEXT: ret i32 [[D]]
279 %A = icmp ne i32 %x, %z
280 %B = icmp eq i32 %y, %z
282 %D = select i1 %C, i32 %x, i32 %z
286 define i32 @select_or_icmp_alt_bad_3(i32 %x, i32 %y, i32 %z) {
287 ; CHECK-LABEL: @select_or_icmp_alt_bad_3(
288 ; CHECK-NEXT: [[A:%.*]] = icmp eq i32 [[X:%.*]], [[Z:%.*]]
289 ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[Y:%.*]], [[Z]]
290 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
291 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
292 ; CHECK-NEXT: ret i32 [[D]]
294 %A = icmp eq i32 %x, %z
295 %B = icmp eq i32 %y, %z
297 %D = select i1 %C, i32 %x, i32 %z
301 define i32 @select_or_icmp_alt_bad_4(i32 %x, i32 %y, i32 %z) {
302 ; CHECK-LABEL: @select_or_icmp_alt_bad_4(
303 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
304 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
305 ; CHECK-NEXT: [[C:%.*]] = and i1 [[A]], [[B]]
306 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
307 ; CHECK-NEXT: ret i32 [[D]]
309 %A = icmp ne i32 %x, %z
310 %B = icmp ne i32 %y, %z
312 %D = select i1 %C, i32 %x, i32 %z
316 define i32 @select_or_icmp_alt_bad_5(i32 %x, i32 %y, i32 %z, i32 %k) {
317 ; CHECK-LABEL: @select_or_icmp_alt_bad_5(
318 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[K:%.*]]
319 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z:%.*]]
320 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
321 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[Z]]
322 ; CHECK-NEXT: ret i32 [[D]]
324 %A = icmp ne i32 %x, %k
325 %B = icmp ne i32 %y, %z
327 %D = select i1 %C, i32 %x, i32 %z
331 define i32 @select_or_icmp_alt_bad_true_val(i32 %x, i32 %y, i32 %z, i32 %k) {
332 ; CHECK-LABEL: @select_or_icmp_alt_bad_true_val(
333 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
334 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
335 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
336 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[K:%.*]], i32 [[Z]]
337 ; CHECK-NEXT: ret i32 [[D]]
339 %A = icmp ne i32 %x, %z
340 %B = icmp ne i32 %y, %z
342 %D = select i1 %C, i32 %k, i32 %z
346 define i32 @select_or_icmp_alt_bad_false_val(i32 %x, i32 %y, i32 %z, i32 %k) {
347 ; CHECK-LABEL: @select_or_icmp_alt_bad_false_val(
348 ; CHECK-NEXT: [[A:%.*]] = icmp ne i32 [[X:%.*]], [[Z:%.*]]
349 ; CHECK-NEXT: [[B:%.*]] = icmp ne i32 [[Y:%.*]], [[Z]]
350 ; CHECK-NEXT: [[C:%.*]] = or i1 [[A]], [[B]]
351 ; CHECK-NEXT: [[D:%.*]] = select i1 [[C]], i32 [[X]], i32 [[K:%.*]]
352 ; CHECK-NEXT: ret i32 [[D]]
354 %A = icmp ne i32 %x, %z
355 %B = icmp ne i32 %y, %z
357 %D = select i1 %C, i32 %x, i32 %k