1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
6 define i8 @lshr_add(i8 %a, i8 %y) {
7 ; CHECK-LABEL: @lshr_add(
8 ; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42
9 ; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 5
10 ; CHECK-NEXT: [[R2:%.*]] = add i8 [[Y:%.*]], [[B1]]
11 ; CHECK-NEXT: [[L:%.*]] = and i8 [[R2]], -32
12 ; CHECK-NEXT: ret i8 [[L]]
14 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization
21 define <2 x i8> @lshr_add_commute_splat(<2 x i8> %a, <2 x i8> %y) {
22 ; CHECK-LABEL: @lshr_add_commute_splat(
23 ; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)
24 ; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 5)
25 ; CHECK-NEXT: [[R2:%.*]] = add <2 x i8> [[Y:%.*]], [[B1]]
26 ; CHECK-NEXT: [[L:%.*]] = and <2 x i8> [[R2]], splat (i8 -32)
27 ; CHECK-NEXT: ret <2 x i8> [[L]]
29 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization
30 %r = lshr <2 x i8> %y, <i8 5, i8 5>
31 %b = add <2 x i8> %x, %r
32 %l = shl <2 x i8> %b, <i8 5, i8 5>
36 define i8 @lshr_sub(i8 %a, i8 %y) {
37 ; CHECK-LABEL: @lshr_sub(
38 ; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42
39 ; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3
40 ; CHECK-NEXT: [[B:%.*]] = sub nsw i8 [[X]], [[R]]
41 ; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3
42 ; CHECK-NEXT: ret i8 [[L]]
44 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization
51 define <2 x i8> @lshr_sub_commute_splat(<2 x i8> %a, <2 x i8> %y) {
52 ; CHECK-LABEL: @lshr_sub_commute_splat(
53 ; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)
54 ; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 3)
55 ; CHECK-NEXT: [[R2:%.*]] = sub <2 x i8> [[Y:%.*]], [[B1]]
56 ; CHECK-NEXT: [[L:%.*]] = and <2 x i8> [[R2]], splat (i8 -8)
57 ; CHECK-NEXT: ret <2 x i8> [[L]]
59 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization
60 %r = lshr <2 x i8> %y, <i8 3, i8 3>
61 %b = sub <2 x i8> %r, %x
62 %l = shl <2 x i8> %b, <i8 3, i8 3>
66 define i8 @lshr_and(i8 %a, i8 %y) {
67 ; CHECK-LABEL: @lshr_and(
68 ; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42
69 ; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 6
70 ; CHECK-NEXT: [[R2:%.*]] = and i8 [[Y:%.*]], [[B1]]
71 ; CHECK-NEXT: ret i8 [[R2]]
73 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization
80 define <2 x i8> @lshr_and_commute_splat(<2 x i8> %a, <2 x i8> %y) {
81 ; CHECK-LABEL: @lshr_and_commute_splat(
82 ; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)
83 ; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 6)
84 ; CHECK-NEXT: [[R2:%.*]] = and <2 x i8> [[Y:%.*]], [[B1]]
85 ; CHECK-NEXT: ret <2 x i8> [[R2]]
87 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization
88 %r = lshr <2 x i8> %y, <i8 6, i8 6>
89 %b = and <2 x i8> %x, %r
90 %l = shl <2 x i8> %b, <i8 6, i8 6>
94 define i8 @lshr_or(i8 %a, i8 %y) {
95 ; CHECK-LABEL: @lshr_or(
96 ; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42
97 ; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 4
98 ; CHECK-NEXT: [[Y_MASKED:%.*]] = and i8 [[Y:%.*]], -16
99 ; CHECK-NEXT: [[L:%.*]] = or i8 [[Y_MASKED]], [[B1]]
100 ; CHECK-NEXT: ret i8 [[L]]
102 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization
109 define <2 x i8> @lshr_or_commute_splat(<2 x i8> %a, <2 x i8> %y) {
110 ; CHECK-LABEL: @lshr_or_commute_splat(
111 ; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)
112 ; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 4)
113 ; CHECK-NEXT: [[Y_MASKED:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 -16)
114 ; CHECK-NEXT: [[L:%.*]] = or <2 x i8> [[Y_MASKED]], [[B1]]
115 ; CHECK-NEXT: ret <2 x i8> [[L]]
117 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization
118 %r = lshr <2 x i8> %y, <i8 4, i8 4>
119 %b = or <2 x i8> %r, %x
120 %l = shl <2 x i8> %b, <i8 4, i8 4>
124 define i8 @lshr_xor(i8 %a, i8 %y) {
125 ; CHECK-LABEL: @lshr_xor(
126 ; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42
127 ; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 3
128 ; CHECK-NEXT: [[Y_MASKED:%.*]] = and i8 [[Y:%.*]], -8
129 ; CHECK-NEXT: [[L:%.*]] = xor i8 [[Y_MASKED]], [[B1]]
130 ; CHECK-NEXT: ret i8 [[L]]
132 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization
139 define <2 x i8> @lshr_xor_commute_splat(<2 x i8> %a, <2 x i8> %y) {
140 ; CHECK-LABEL: @lshr_xor_commute_splat(
141 ; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)
142 ; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 3)
143 ; CHECK-NEXT: [[Y_MASKED:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 -8)
144 ; CHECK-NEXT: [[L:%.*]] = xor <2 x i8> [[Y_MASKED]], [[B1]]
145 ; CHECK-NEXT: ret <2 x i8> [[L]]
147 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization
148 %r = lshr <2 x i8> %y, <i8 3, i8 3>
149 %b = xor <2 x i8> %x, %r
150 %l = shl <2 x i8> %b, <i8 3, i8 3>
154 define i8 @lshr_add_use1(i8 %x, i8 %y) {
155 ; CHECK-LABEL: @lshr_add_use1(
156 ; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 5
157 ; CHECK-NEXT: call void @use(i8 [[R]])
158 ; CHECK-NEXT: [[B:%.*]] = add i8 [[R]], [[X:%.*]]
159 ; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 5
160 ; CHECK-NEXT: ret i8 [[L]]
163 call void @use(i8 %r)
169 define i8 @lshr_add_use2(i8 %x, i8 %y) {
170 ; CHECK-LABEL: @lshr_add_use2(
171 ; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 5
172 ; CHECK-NEXT: [[B:%.*]] = add i8 [[R]], [[X:%.*]]
173 ; CHECK-NEXT: call void @use(i8 [[B]])
174 ; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 5
175 ; CHECK-NEXT: ret i8 [[L]]
179 call void @use(i8 %b)
184 define i8 @lshr_and_add(i8 %a, i8 %y) {
185 ; CHECK-LABEL: @lshr_and_add(
186 ; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42
187 ; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 3
188 ; CHECK-NEXT: [[Y_MASK:%.*]] = and i8 [[Y:%.*]], 96
189 ; CHECK-NEXT: [[L:%.*]] = add i8 [[Y_MASK]], [[B1]]
190 ; CHECK-NEXT: ret i8 [[L]]
192 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization
200 define <2 x i8> @lshr_and_add_commute_splat(<2 x i8> %a, <2 x i8> %y) {
201 ; CHECK-LABEL: @lshr_and_add_commute_splat(
202 ; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)
203 ; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 3)
204 ; CHECK-NEXT: [[Y_MASK:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 96)
205 ; CHECK-NEXT: [[L:%.*]] = add <2 x i8> [[Y_MASK]], [[B1]]
206 ; CHECK-NEXT: ret <2 x i8> [[L]]
208 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization
209 %r = lshr <2 x i8> %y, <i8 3, i8 3>
210 %m = and <2 x i8> %r, <i8 12, i8 12>
211 %b = add <2 x i8> %m, %x
212 %l = shl <2 x i8> %b, <i8 3, i8 3>
216 define i8 @lshr_and_sub(i8 %a, i8 %y) {
217 ; CHECK-LABEL: @lshr_and_sub(
218 ; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42
219 ; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 2
220 ; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 13
221 ; CHECK-NEXT: [[B:%.*]] = sub nsw i8 [[X]], [[M]]
222 ; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 2
223 ; CHECK-NEXT: ret i8 [[L]]
225 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization
233 define <2 x i8> @lshr_and_sub_commute_splat(<2 x i8> %a, <2 x i8> %y) {
234 ; CHECK-LABEL: @lshr_and_sub_commute_splat(
235 ; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)
236 ; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 2)
237 ; CHECK-NEXT: [[Y_MASK:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 52)
238 ; CHECK-NEXT: [[L:%.*]] = sub <2 x i8> [[Y_MASK]], [[B1]]
239 ; CHECK-NEXT: ret <2 x i8> [[L]]
241 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization
242 %r = lshr <2 x i8> %y, <i8 2, i8 2>
243 %m = and <2 x i8> %r, <i8 13, i8 13>
244 %b = sub <2 x i8> %m, %x
245 %l = shl <2 x i8> %b, <i8 2, i8 2>
249 define i8 @lshr_and_and(i8 %a, i8 %y) {
250 ; CHECK-LABEL: @lshr_and_and(
251 ; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42
252 ; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 2
253 ; CHECK-NEXT: [[Y_MASK:%.*]] = and i8 [[Y:%.*]], 52
254 ; CHECK-NEXT: [[L:%.*]] = and i8 [[Y_MASK]], [[B1]]
255 ; CHECK-NEXT: ret i8 [[L]]
257 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization
265 define <2 x i8> @lshr_and_and_commute_splat(<2 x i8> %a, <2 x i8> %y) {
266 ; CHECK-LABEL: @lshr_and_and_commute_splat(
267 ; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)
268 ; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 2)
269 ; CHECK-NEXT: [[Y_MASK:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 52)
270 ; CHECK-NEXT: [[L:%.*]] = and <2 x i8> [[Y_MASK]], [[B1]]
271 ; CHECK-NEXT: ret <2 x i8> [[L]]
273 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization
274 %r = lshr <2 x i8> %y, <i8 2, i8 2>
275 %m = and <2 x i8> %r, <i8 13, i8 13>
276 %b = and <2 x i8> %x, %m
277 %l = shl <2 x i8> %b, <i8 2, i8 2>
281 define i8 @lshr_and_or(i8 %a, i8 %y) {
282 ; CHECK-LABEL: @lshr_and_or(
283 ; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42
284 ; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 2
285 ; CHECK-NEXT: [[Y_MASK:%.*]] = and i8 [[Y:%.*]], 52
286 ; CHECK-NEXT: [[L:%.*]] = or i8 [[Y_MASK]], [[B1]]
287 ; CHECK-NEXT: ret i8 [[L]]
289 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization
297 define i8 @lshr_and_or_disjoint(i8 %a, i8 %y) {
298 ; CHECK-LABEL: @lshr_and_or_disjoint(
299 ; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42
300 ; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 2
301 ; CHECK-NEXT: [[Y_MASK:%.*]] = and i8 [[Y:%.*]], 52
302 ; CHECK-NEXT: [[L:%.*]] = or disjoint i8 [[Y_MASK]], [[B1]]
303 ; CHECK-NEXT: ret i8 [[L]]
305 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization
308 %b = or disjoint i8 %x, %m
313 define i8 @ashr_and_or_disjoint(i8 %a, i8 %y) {
314 ; CHECK-LABEL: @ashr_and_or_disjoint(
315 ; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42
316 ; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 2
317 ; CHECK-NEXT: [[Y_MASK:%.*]] = and i8 [[Y:%.*]], 52
318 ; CHECK-NEXT: [[L:%.*]] = or disjoint i8 [[Y_MASK]], [[B1]]
319 ; CHECK-NEXT: ret i8 [[L]]
321 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization
324 %b = or disjoint i8 %x, %m
330 define <2 x i8> @lshr_and_or_commute_splat(<2 x i8> %a, <2 x i8> %y) {
331 ; CHECK-LABEL: @lshr_and_or_commute_splat(
332 ; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)
333 ; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 2)
334 ; CHECK-NEXT: [[Y_MASK:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 52)
335 ; CHECK-NEXT: [[L:%.*]] = or <2 x i8> [[Y_MASK]], [[B1]]
336 ; CHECK-NEXT: ret <2 x i8> [[L]]
338 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization
339 %r = lshr <2 x i8> %y, <i8 2, i8 2>
340 %m = and <2 x i8> %r, <i8 13, i8 13>
341 %b = or <2 x i8> %m, %x
342 %l = shl <2 x i8> %b, <i8 2, i8 2>
346 define i8 @lshr_and_xor(i8 %a, i8 %y) {
347 ; CHECK-LABEL: @lshr_and_xor(
348 ; CHECK-NEXT: [[X:%.*]] = srem i8 [[A:%.*]], 42
349 ; CHECK-NEXT: [[B1:%.*]] = shl i8 [[X]], 2
350 ; CHECK-NEXT: [[Y_MASK:%.*]] = and i8 [[Y:%.*]], 52
351 ; CHECK-NEXT: [[L:%.*]] = xor i8 [[Y_MASK]], [[B1]]
352 ; CHECK-NEXT: ret i8 [[L]]
354 %x = srem i8 %a, 42 ; thwart complexity-based canonicalization
362 define <2 x i8> @lshr_and_xor_commute_splat(<2 x i8> %a, <2 x i8> %y) {
363 ; CHECK-LABEL: @lshr_and_xor_commute_splat(
364 ; CHECK-NEXT: [[X:%.*]] = srem <2 x i8> [[A:%.*]], splat (i8 42)
365 ; CHECK-NEXT: [[B1:%.*]] = shl <2 x i8> [[X]], splat (i8 2)
366 ; CHECK-NEXT: [[Y_MASK:%.*]] = and <2 x i8> [[Y:%.*]], splat (i8 52)
367 ; CHECK-NEXT: [[L:%.*]] = xor <2 x i8> [[Y_MASK]], [[B1]]
368 ; CHECK-NEXT: ret <2 x i8> [[L]]
370 %x = srem <2 x i8> %a, <i8 42, i8 42> ; thwart complexity-based canonicalization
371 %r = lshr <2 x i8> %y, <i8 2, i8 2>
372 %m = and <2 x i8> %r, <i8 13, i8 13>
373 %b = xor <2 x i8> %x, %m
374 %l = shl <2 x i8> %b, <i8 2, i8 2>
378 define i8 @lshr_and_add_use1(i8 %x, i8 %y) {
379 ; CHECK-LABEL: @lshr_and_add_use1(
380 ; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3
381 ; CHECK-NEXT: call void @use(i8 [[R]])
382 ; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 12
383 ; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[M]]
384 ; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3
385 ; CHECK-NEXT: ret i8 [[L]]
388 call void @use(i8 %r)
395 define i8 @lshr_and_add_use2(i8 %x, i8 %y) {
396 ; CHECK-LABEL: @lshr_and_add_use2(
397 ; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3
398 ; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 12
399 ; CHECK-NEXT: call void @use(i8 [[M]])
400 ; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[M]]
401 ; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3
402 ; CHECK-NEXT: ret i8 [[L]]
406 call void @use(i8 %m)
412 define i8 @lshr_and_add_use3(i8 %x, i8 %y) {
413 ; CHECK-LABEL: @lshr_and_add_use3(
414 ; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3
415 ; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 12
416 ; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[M]]
417 ; CHECK-NEXT: call void @use(i8 [[B]])
418 ; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3
419 ; CHECK-NEXT: ret i8 [[L]]
424 call void @use(i8 %b)
429 define i8 @lshr_and_add_use4(i8 %x, i8 %y) {
430 ; CHECK-LABEL: @lshr_and_add_use4(
431 ; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3
432 ; CHECK-NEXT: call void @use(i8 [[R]])
433 ; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 12
434 ; CHECK-NEXT: call void @use(i8 [[M]])
435 ; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[M]]
436 ; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3
437 ; CHECK-NEXT: ret i8 [[L]]
440 call void @use(i8 %r)
442 call void @use(i8 %m)
448 define i8 @lshr_and_add_use5(i8 %x, i8 %y) {
449 ; CHECK-LABEL: @lshr_and_add_use5(
450 ; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3
451 ; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 12
452 ; CHECK-NEXT: call void @use(i8 [[M]])
453 ; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[M]]
454 ; CHECK-NEXT: call void @use(i8 [[B]])
455 ; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3
456 ; CHECK-NEXT: ret i8 [[L]]
460 call void @use(i8 %m)
462 call void @use(i8 %b)
467 define i8 @lshr_and_add_use6(i8 %x, i8 %y) {
468 ; CHECK-LABEL: @lshr_and_add_use6(
469 ; CHECK-NEXT: [[R:%.*]] = lshr i8 [[Y:%.*]], 3
470 ; CHECK-NEXT: call void @use(i8 [[R]])
471 ; CHECK-NEXT: [[M:%.*]] = and i8 [[R]], 12
472 ; CHECK-NEXT: call void @use(i8 [[M]])
473 ; CHECK-NEXT: [[B:%.*]] = add i8 [[X:%.*]], [[M]]
474 ; CHECK-NEXT: [[L:%.*]] = shl i8 [[B]], 3
475 ; CHECK-NEXT: ret i8 [[L]]
478 call void @use(i8 %r)
480 call void @use(i8 %m)
486 define <2 x i8> @lshr_add_shl_v2i8_undef(<2 x i8> %x, <2 x i8> %y) {
487 ; CHECK-LABEL: @lshr_add_shl_v2i8_undef(
488 ; CHECK-NEXT: [[A:%.*]] = lshr <2 x i8> [[Y:%.*]], <i8 5, i8 undef>
489 ; CHECK-NEXT: [[B:%.*]] = add <2 x i8> [[A]], [[X:%.*]]
490 ; CHECK-NEXT: [[C:%.*]] = shl <2 x i8> [[B]], <i8 undef, i8 5>
491 ; CHECK-NEXT: ret <2 x i8> [[C]]
493 %a = lshr <2 x i8> %y, <i8 5, i8 undef>
494 %b = add <2 x i8> %a, %x
495 %c = shl <2 x i8> %b, <i8 undef, i8 5>
499 define <2 x i8> @lshr_add_shl_v2i8_nonuniform(<2 x i8> %x, <2 x i8> %y) {
500 ; CHECK-LABEL: @lshr_add_shl_v2i8_nonuniform(
501 ; CHECK-NEXT: [[A:%.*]] = lshr <2 x i8> [[Y:%.*]], <i8 5, i8 6>
502 ; CHECK-NEXT: [[B:%.*]] = add <2 x i8> [[A]], [[X:%.*]]
503 ; CHECK-NEXT: [[C:%.*]] = shl <2 x i8> [[B]], <i8 5, i8 6>
504 ; CHECK-NEXT: ret <2 x i8> [[C]]
506 %a = lshr <2 x i8> %y, <i8 5, i8 6>
507 %b = add <2 x i8> %a, %x
508 %c = shl <2 x i8> %b, <i8 5, i8 6>
512 define i32 @lshr_add_and_shl(i32 %x, i32 %y) {
513 ; CHECK-LABEL: @lshr_add_and_shl(
514 ; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[Y:%.*]], 5
515 ; CHECK-NEXT: [[X_MASK:%.*]] = and i32 [[X:%.*]], 4064
516 ; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[X_MASK]], [[TMP1]]
517 ; CHECK-NEXT: ret i32 [[TMP2]]
526 define <2 x i32> @lshr_add_and_shl_v2i32(<2 x i32> %x, <2 x i32> %y) {
527 ; CHECK-LABEL: @lshr_add_and_shl_v2i32(
528 ; CHECK-NEXT: [[TMP1:%.*]] = shl <2 x i32> [[Y:%.*]], splat (i32 5)
529 ; CHECK-NEXT: [[X_MASK:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 4064)
530 ; CHECK-NEXT: [[TMP2:%.*]] = add <2 x i32> [[X_MASK]], [[TMP1]]
531 ; CHECK-NEXT: ret <2 x i32> [[TMP2]]
533 %1 = lshr <2 x i32> %x, <i32 5, i32 5>
534 %2 = and <2 x i32> %1, <i32 127, i32 127>
535 %3 = add <2 x i32> %y, %2
536 %4 = shl <2 x i32> %3, <i32 5, i32 5>
540 define <2 x i32> @lshr_add_and_shl_v2i32_undef(<2 x i32> %x, <2 x i32> %y) {
541 ; CHECK-LABEL: @lshr_add_and_shl_v2i32_undef(
542 ; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 undef, i32 5>
543 ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], splat (i32 127)
544 ; CHECK-NEXT: [[TMP3:%.*]] = add <2 x i32> [[Y:%.*]], [[TMP2]]
545 ; CHECK-NEXT: [[TMP4:%.*]] = shl <2 x i32> [[TMP3]], <i32 5, i32 undef>
546 ; CHECK-NEXT: ret <2 x i32> [[TMP4]]
548 %1 = lshr <2 x i32> %x, <i32 undef, i32 5>
549 %2 = and <2 x i32> %1, <i32 127, i32 127>
550 %3 = add <2 x i32> %y, %2
551 %4 = shl <2 x i32> %3, <i32 5, i32 undef>
555 define <2 x i32> @lshr_add_and_shl_v2i32_nonuniform(<2 x i32> %x, <2 x i32> %y) {
556 ; CHECK-LABEL: @lshr_add_and_shl_v2i32_nonuniform(
557 ; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 5, i32 6>
558 ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], <i32 127, i32 255>
559 ; CHECK-NEXT: [[TMP3:%.*]] = add <2 x i32> [[Y:%.*]], [[TMP2]]
560 ; CHECK-NEXT: [[TMP4:%.*]] = shl <2 x i32> [[TMP3]], <i32 5, i32 6>
561 ; CHECK-NEXT: ret <2 x i32> [[TMP4]]
563 %1 = lshr <2 x i32> %x, <i32 5, i32 6>
564 %2 = and <2 x i32> %1, <i32 127, i32 255>
565 %3 = add <2 x i32> %y, %2
566 %4 = shl <2 x i32> %3, <i32 5, i32 6>
570 define i32 @shl_add_and_lshr(i32 %x, i32 %y) {
571 ; CHECK-LABEL: @shl_add_and_lshr(
572 ; CHECK-NEXT: [[C1:%.*]] = shl i32 [[Y:%.*]], 4
573 ; CHECK-NEXT: [[X_MASK:%.*]] = and i32 [[X:%.*]], 128
574 ; CHECK-NEXT: [[D:%.*]] = add i32 [[X_MASK]], [[C1]]
575 ; CHECK-NEXT: ret i32 [[D]]
584 define <2 x i32> @shl_add_and_lshr_v2i32(<2 x i32> %x, <2 x i32> %y) {
585 ; CHECK-LABEL: @shl_add_and_lshr_v2i32(
586 ; CHECK-NEXT: [[C1:%.*]] = shl <2 x i32> [[Y:%.*]], splat (i32 4)
587 ; CHECK-NEXT: [[X_MASK:%.*]] = and <2 x i32> [[X:%.*]], splat (i32 128)
588 ; CHECK-NEXT: [[D:%.*]] = add <2 x i32> [[X_MASK]], [[C1]]
589 ; CHECK-NEXT: ret <2 x i32> [[D]]
591 %a = lshr <2 x i32> %x, <i32 4, i32 4>
592 %b = and <2 x i32> %a, <i32 8, i32 8>
593 %c = add <2 x i32> %b, %y
594 %d = shl <2 x i32> %c, <i32 4, i32 4>
598 define <2 x i32> @shl_add_and_lshr_v2i32_undef(<2 x i32> %x, <2 x i32> %y) {
599 ; CHECK-LABEL: @shl_add_and_lshr_v2i32_undef(
600 ; CHECK-NEXT: [[A:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 4, i32 undef>
601 ; CHECK-NEXT: [[B:%.*]] = and <2 x i32> [[A]], <i32 8, i32 undef>
602 ; CHECK-NEXT: [[C:%.*]] = add <2 x i32> [[B]], [[Y:%.*]]
603 ; CHECK-NEXT: [[D:%.*]] = shl <2 x i32> [[C]], <i32 4, i32 undef>
604 ; CHECK-NEXT: ret <2 x i32> [[D]]
606 %a = lshr <2 x i32> %x, <i32 4, i32 undef>
607 %b = and <2 x i32> %a, <i32 8, i32 undef>
608 %c = add <2 x i32> %b, %y
609 %d = shl <2 x i32> %c, <i32 4, i32 undef>
613 define <2 x i32> @shl_add_and_lshr_v2i32_nonuniform(<2 x i32> %x, <2 x i32> %y) {
614 ; CHECK-LABEL: @shl_add_and_lshr_v2i32_nonuniform(
615 ; CHECK-NEXT: [[A:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 4, i32 5>
616 ; CHECK-NEXT: [[B:%.*]] = and <2 x i32> [[A]], <i32 8, i32 9>
617 ; CHECK-NEXT: [[C:%.*]] = add <2 x i32> [[B]], [[Y:%.*]]
618 ; CHECK-NEXT: [[D:%.*]] = shl <2 x i32> [[C]], <i32 4, i32 5>
619 ; CHECK-NEXT: ret <2 x i32> [[D]]
621 %a = lshr <2 x i32> %x, <i32 4, i32 5>
622 %b = and <2 x i32> %a, <i32 8, i32 9>
623 %c = add <2 x i32> %b, %y
624 %d = shl <2 x i32> %c, <i32 4, i32 5>
628 define <4 x i32> @test_FoldShiftByConstant_CreateSHL(<4 x i32> %in) {
629 ; CHECK-LABEL: @test_FoldShiftByConstant_CreateSHL(
630 ; CHECK-NEXT: [[VSHL_N:%.*]] = mul <4 x i32> [[IN:%.*]], <i32 0, i32 -32, i32 0, i32 -32>
631 ; CHECK-NEXT: ret <4 x i32> [[VSHL_N]]
633 %mul.i = mul <4 x i32> %in, <i32 0, i32 -1, i32 0, i32 -1>
634 %vshl_n = shl <4 x i32> %mul.i, <i32 5, i32 5, i32 5, i32 5>
635 ret <4 x i32> %vshl_n
638 define <8 x i16> @test_FoldShiftByConstant_CreateSHL2(<8 x i16> %in) {
639 ; CHECK-LABEL: @test_FoldShiftByConstant_CreateSHL2(
640 ; CHECK-NEXT: [[VSHL_N:%.*]] = mul <8 x i16> [[IN:%.*]], <i16 0, i16 -32, i16 0, i16 -32, i16 0, i16 -32, i16 0, i16 -32>
641 ; CHECK-NEXT: ret <8 x i16> [[VSHL_N]]
643 %mul.i = mul <8 x i16> %in, <i16 0, i16 -1, i16 0, i16 -1, i16 0, i16 -1, i16 0, i16 -1>
644 %vshl_n = shl <8 x i16> %mul.i, <i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5, i16 5>
645 ret <8 x i16> %vshl_n
648 define <16 x i8> @test_FoldShiftByConstant_CreateAnd(<16 x i8> %in0) {
649 ; CHECK-LABEL: @test_FoldShiftByConstant_CreateAnd(
650 ; CHECK-NEXT: [[VSRA_N2:%.*]] = mul <16 x i8> [[IN0:%.*]], splat (i8 33)
651 ; CHECK-NEXT: [[VSHL_N:%.*]] = and <16 x i8> [[VSRA_N2]], splat (i8 -32)
652 ; CHECK-NEXT: ret <16 x i8> [[VSHL_N]]
654 %vsra_n = ashr <16 x i8> %in0, <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>
655 %tmp = add <16 x i8> %in0, %vsra_n
656 %vshl_n = shl <16 x i8> %tmp, <i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5, i8 5>
657 ret <16 x i8> %vshl_n