@@ -249,13 +249,13 @@ define <8 x i64> @PR30630(<8 x i64> %x) {
249
249
; ret <2 x float> zeroinitializer
250
250
define <2 x float > @PR32872 (<2 x float > %x ) {
251
251
; CHECK-LABEL: @PR32872(
252
- ; CHECK-NEXT: [[TMP1 :%.*]] = shufflevector <2 x float> [[X:%.*]], <2 x float> zeroinitializer, <4 x i32> <i32 2, i32 2, i32 0, i32 1>
253
- ; CHECK-NEXT: [[TMP4 :%.*]] = shufflevector <4 x float> zeroinitializer, <4 x float> [[TMP1 ]], <2 x i32> <i32 4, i32 5>
254
- ; CHECK-NEXT: ret <2 x float> [[TMP4 ]]
252
+ ; CHECK-NEXT: [[SHUF :%.*]] = shufflevector <2 x float> [[X:%.*]], <2 x float> zeroinitializer, <4 x i32> <i32 2, i32 2, i32 0, i32 1>
253
+ ; CHECK-NEXT: [[SHUF2 :%.*]] = shufflevector <4 x float> zeroinitializer, <4 x float> [[SHUF ]], <2 x i32> <i32 4, i32 5>
254
+ ; CHECK-NEXT: ret <2 x float> [[SHUF2 ]]
255
255
;
256
- %tmp1 = shufflevector <2 x float > %x , <2 x float > zeroinitializer , <4 x i32 > <i32 2 , i32 2 , i32 0 , i32 1 >
257
- %tmp4 = shufflevector <4 x float > zeroinitializer , <4 x float > %tmp1 , <2 x i32 > <i32 4 , i32 5 >
258
- ret <2 x float > %tmp4
256
+ %shuf = shufflevector <2 x float > %x , <2 x float > zeroinitializer , <4 x i32 > <i32 2 , i32 2 , i32 0 , i32 1 >
257
+ %shuf2 = shufflevector <4 x float > zeroinitializer , <4 x float > %shuf , <2 x i32 > <i32 4 , i32 5 >
258
+ ret <2 x float > %shuf2
259
259
}
260
260
261
261
define <5 x i8 > @splat_inserted_constant (<4 x i8 > %x ) {
@@ -284,3 +284,227 @@ define <2 x i8> @splat_inserted_constant_not_canonical(<3 x i8> %x, <3 x i8> %y)
284
284
%splat2 = shufflevector <3 x i8 > %y , <3 x i8 > %ins2 , <2 x i32 > <i32 undef , i32 5 >
285
285
ret <2 x i8 > %splat2
286
286
}
287
+
288
+ define <4 x i32 > @fold_identity (<4 x i32 > %x ) {
289
+ ; CHECK-LABEL: @fold_identity(
290
+ ; CHECK-NEXT: ret <4 x i32> [[X:%.*]]
291
+ ;
292
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
293
+ %revshuf = shufflevector <4 x i32 > %shuf , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
294
+ ret <4 x i32 > %revshuf
295
+ }
296
+
297
+ define <4 x i32 > @fold_identity2 (<4 x i32 > %x ) {
298
+ ; CHECK-LABEL: @fold_identity2(
299
+ ; CHECK-NEXT: [[SHL:%.*]] = shl <4 x i32> [[X:%.*]], <i32 1, i32 1, i32 1, i32 1>
300
+ ; CHECK-NEXT: ret <4 x i32> [[SHL]]
301
+ ;
302
+ %shl = shl <4 x i32 > %x , <i32 1 , i32 1 , i32 1 , i32 1 >
303
+ %shuf = shufflevector <4 x i32 > %shl , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
304
+ %revshuf = shufflevector <4 x i32 > %shuf , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
305
+ ret <4 x i32 > %revshuf
306
+ }
307
+
308
+ define <4 x i32 > @fold_identity3 (<4 x i32 > %x ) {
309
+ ; CHECK-LABEL: @fold_identity3(
310
+ ; CHECK-NEXT: [[SHL:%.*]] = shl <4 x i32> [[X:%.*]], [[X]]
311
+ ; CHECK-NEXT: ret <4 x i32> [[SHL]]
312
+ ;
313
+ %shl = shl <4 x i32 > %x , %x
314
+ %shuf = shufflevector <4 x i32 > %shl , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
315
+ %revshuf = shufflevector <4 x i32 > %shuf , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
316
+ ret <4 x i32 > %revshuf
317
+ }
318
+
319
+ define <4 x i32 > @not_fold_identity (<4 x i32 > %x ) {
320
+ ; CHECK-LABEL: @not_fold_identity(
321
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 0, i32 1>
322
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[SHUF]], <4 x i32> poison, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
323
+ ; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
324
+ ;
325
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 2 , i32 3 , i32 0 , i32 1 >
326
+ %revshuf = shufflevector <4 x i32 > %shuf , <4 x i32 > poison, <4 x i32 > <i32 1 , i32 0 , i32 3 , i32 2 >
327
+ ret <4 x i32 > %revshuf
328
+ }
329
+
330
+ define <4 x i32 > @not_fold_identity2 (<4 x i32 > %x ) {
331
+ ; CHECK-LABEL: @not_fold_identity2(
332
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
333
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[SHUF]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
334
+ ; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
335
+ ;
336
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 2 , i32 3 , i32 1 , i32 0 >
337
+ %revshuf = shufflevector <4 x i32 > %shuf , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
338
+ ret <4 x i32 > %revshuf
339
+ }
340
+
341
+ define <4 x i64 > @fold_lookthrough_cast (<4 x i32 > %x ) {
342
+ ; CHECK-LABEL: @fold_lookthrough_cast(
343
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
344
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[SHUF]] to <4 x i64>
345
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[ZEXT]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
346
+ ; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
347
+ ;
348
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
349
+ %zext = zext <4 x i32 > %shuf to <4 x i64 >
350
+ %revshuf = shufflevector <4 x i64 > %zext , <4 x i64 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
351
+ ret <4 x i64 > %revshuf
352
+ }
353
+
354
+ define <4 x i64 > @not_fold_lookthrough_cast (<4 x i32 > %x ) {
355
+ ; CHECK-LABEL: @not_fold_lookthrough_cast(
356
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[X:%.*]] to <4 x i64>
357
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[ZEXT]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
358
+ ; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
359
+ ;
360
+ %zext = zext <4 x i32 > %x to <4 x i64 >
361
+ %revshuf = shufflevector <4 x i64 > %zext , <4 x i64 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
362
+ ret <4 x i64 > %revshuf
363
+ }
364
+
365
+ define <4 x i64 > @not_fold_lookthrough_cast2 (<4 x i32 > %x ) {
366
+ ; CHECK-LABEL: @not_fold_lookthrough_cast2(
367
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
368
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[SHUF]] to <4 x i64>
369
+ ; CHECK-NEXT: ret <4 x i64> [[ZEXT]]
370
+ ;
371
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
372
+ %zext = zext <4 x i32 > %shuf to <4 x i64 >
373
+ ret <4 x i64 > %zext
374
+ }
375
+
376
+ define i32 @not_fold_lookthrough_bitcast (<4 x i8 > %x ) {
377
+ ; CHECK-LABEL: @not_fold_lookthrough_bitcast(
378
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
379
+ ; CHECK-NEXT: [[BITCAST:%.*]] = bitcast <4 x i8> [[SHUF]] to i32
380
+ ; CHECK-NEXT: ret i32 [[BITCAST]]
381
+ ;
382
+ %shuf = shufflevector <4 x i8 > %x , <4 x i8 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
383
+ %bitcast = bitcast <4 x i8 > %shuf to i32
384
+ ret i32 %bitcast
385
+ }
386
+
387
+ define <8 x i16 > @not_fold_lookthrough_bitcast2 (<4 x i32 > %x , <8 x i16 > %y ) {
388
+ ; CHECK-LABEL: @not_fold_lookthrough_bitcast2(
389
+ ; CHECK-NEXT: [[CAST:%.*]] = bitcast <4 x i32> [[X:%.*]] to <8 x i16>
390
+ ; CHECK-NEXT: [[OUT:%.*]] = shufflevector <8 x i16> [[Y:%.*]], <8 x i16> [[CAST]], <8 x i32> <i32 8, i32 1, i32 10, i32 3, i32 12, i32 5, i32 14, i32 7>
391
+ ; CHECK-NEXT: ret <8 x i16> [[OUT]]
392
+ ;
393
+ %cast = bitcast <4 x i32 > %x to <8 x i16 >
394
+ %out = shufflevector <8 x i16 > %y , <8 x i16 > %cast , <8 x i32 > <i32 8 , i32 1 , i32 10 , i32 3 , i32 12 , i32 5 , i32 14 , i32 7 >
395
+ ret <8 x i16 > %out
396
+ }
397
+
398
+ define <4 x i32 > @fold_lookthrough_binop_same_operands (<4 x i32 > %x ) {
399
+ ; CHECK-LABEL: @fold_lookthrough_binop_same_operands(
400
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
401
+ ; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[SHUF]]
402
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
403
+ ; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
404
+ ;
405
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
406
+ %add = add <4 x i32 > %shuf , %shuf
407
+ %revshuf = shufflevector <4 x i32 > %add , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
408
+ ret <4 x i32 > %revshuf
409
+ }
410
+
411
+ define <4 x i32 > @fold_lookthrough_binop_different_operands (<4 x i32 > %x , <4 x i32 > %y ) {
412
+ ; CHECK-LABEL: @fold_lookthrough_binop_different_operands(
413
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
414
+ ; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[Y:%.*]]
415
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
416
+ ; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
417
+ ;
418
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
419
+ %add = add <4 x i32 > %shuf , %y
420
+ %revshuf = shufflevector <4 x i32 > %add , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
421
+ ret <4 x i32 > %revshuf
422
+ }
423
+
424
+ define <4 x i32 > @fold_lookthrough_binop_multiuse (<4 x i32 > %x ) {
425
+ ; CHECK-LABEL: @fold_lookthrough_binop_multiuse(
426
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
427
+ ; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[SHUF]]
428
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
429
+ ; CHECK-NEXT: [[ADD2:%.*]] = add <4 x i32> [[SHUF]], [[REVSHUF]]
430
+ ; CHECK-NEXT: ret <4 x i32> [[ADD2]]
431
+ ;
432
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
433
+ %add = add <4 x i32 > %shuf , %shuf
434
+ %revshuf = shufflevector <4 x i32 > %add , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
435
+ %add2 = add <4 x i32 > %shuf , %revshuf
436
+ ret <4 x i32 > %add2
437
+ }
438
+
439
+ define <4 x i64 > @fold_lookthrough_cast_chain (<4 x i16 > %x ) {
440
+ ; CHECK-LABEL: @fold_lookthrough_cast_chain(
441
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i16> [[X:%.*]], <4 x i16> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
442
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i16> [[SHUF]] to <4 x i32>
443
+ ; CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i32> [[ZEXT]] to <4 x i64>
444
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[SEXT]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
445
+ ; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
446
+ ;
447
+ %shuf = shufflevector <4 x i16 > %x , <4 x i16 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
448
+ %zext = zext <4 x i16 > %shuf to <4 x i32 >
449
+ %sext = sext <4 x i32 > %zext to <4 x i64 >
450
+ %revshuf = shufflevector <4 x i64 > %sext , <4 x i64 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
451
+ ret <4 x i64 > %revshuf
452
+ }
453
+
454
+ define <4 x i32 > @fold_lookthrough_binop_chain (<4 x i32 > %x ) {
455
+ ; CHECK-LABEL: @fold_lookthrough_binop_chain(
456
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
457
+ ; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[SHUF]]
458
+ ; CHECK-NEXT: [[ADD2:%.*]] = add <4 x i32> [[ADD]], [[ADD]]
459
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD2]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
460
+ ; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
461
+ ;
462
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
463
+ %add = add <4 x i32 > %shuf , %shuf
464
+ %add2 = add <4 x i32 > %add , %add
465
+ %revshuf = shufflevector <4 x i32 > %add2 , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
466
+ ret <4 x i32 > %revshuf
467
+ }
468
+
469
+ define <4 x i64 > @fold_lookthrough_cast_binop_chain (<4 x i32 > %x ) {
470
+ ; CHECK-LABEL: @fold_lookthrough_cast_binop_chain(
471
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
472
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[SHUF]] to <4 x i64>
473
+ ; CHECK-NEXT: [[ADD:%.*]] = add <4 x i64> [[ZEXT]], [[ZEXT]]
474
+ ; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[ADD]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
475
+ ; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
476
+ ;
477
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
478
+ %zext = zext <4 x i32 > %shuf to <4 x i64 >
479
+ %add = add <4 x i64 > %zext , %zext
480
+ %revshuf = shufflevector <4 x i64 > %add , <4 x i64 > poison, <4 x i32 > <i32 3 , i32 2 , i32 1 , i32 0 >
481
+ ret <4 x i64 > %revshuf
482
+ }
483
+
484
+ define <4 x i64 > @not_fold_cast_mismatched_types (<4 x i32 > %x ) {
485
+ ; CHECK-LABEL: @not_fold_cast_mismatched_types(
486
+ ; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>
487
+ ; CHECK-NEXT: [[ZEXT:%.*]] = zext <2 x i32> [[SHUF]] to <2 x i64>
488
+ ; CHECK-NEXT: [[EXTSHUF:%.*]] = shufflevector <2 x i64> [[ZEXT]], <2 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
489
+ ; CHECK-NEXT: ret <4 x i64> [[EXTSHUF]]
490
+ ;
491
+ %shuf = shufflevector <4 x i32 > %x , <4 x i32 > poison, <2 x i32 > <i32 0 , i32 2 >
492
+ %zext = zext <2 x i32 > %shuf to <2 x i64 >
493
+ %extshuf = shufflevector <2 x i64 > %zext , <2 x i64 > poison, <4 x i32 > <i32 0 , i32 2 , i32 1 , i32 3 >
494
+ ret <4 x i64 > %extshuf
495
+ }
496
+
497
+ define <4 x float > @not_fold_binop_mismatched_types (<4 x float > %x , <4 x float > %y ) {
498
+ ; CHECK-LABEL: @not_fold_binop_mismatched_types(
499
+ ; CHECK-NEXT: [[SHUF_X:%.*]] = shufflevector <4 x float> [[X:%.*]], <4 x float> poison, <2 x i32> <i32 0, i32 2>
500
+ ; CHECK-NEXT: [[SHUF_Y:%.*]] = shufflevector <4 x float> [[Y:%.*]], <4 x float> poison, <2 x i32> <i32 1, i32 3>
501
+ ; CHECK-NEXT: [[FADD:%.*]] = fadd fast <2 x float> [[SHUF_X]], [[SHUF_Y]]
502
+ ; CHECK-NEXT: [[EXTSHUF:%.*]] = shufflevector <2 x float> [[FADD]], <2 x float> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
503
+ ; CHECK-NEXT: ret <4 x float> [[EXTSHUF]]
504
+ ;
505
+ %shuf.x = shufflevector <4 x float > %x , <4 x float > poison, <2 x i32 > <i32 0 , i32 2 >
506
+ %shuf.y = shufflevector <4 x float > %y , <4 x float > poison, <2 x i32 > <i32 1 , i32 3 >
507
+ %fadd = fadd fast <2 x float > %shuf.x , %shuf.y
508
+ %extshuf = shufflevector <2 x float > %fadd , <2 x float > poison, <4 x i32 > <i32 0 , i32 2 , i32 1 , i32 3 >
509
+ ret <4 x float > %extshuf
510
+ }
0 commit comments