Skip to content

Commit 63d8131

Browse files
authored
VectorCombine: add tests written for InstSimplify (#92776)
2141907 (InstSimplify: increase shufflevector test coverage) was recently merged as a pre-commit test for some work that was misguided. It turns out that InstSimplify can never work on those tests, but the tests are useful nevertheless; move them to VectorCombine to support the development of VectorCombine::foldShuffleToIdentity.
1 parent c4d6867 commit 63d8131

File tree

2 files changed

+162
-175
lines changed

2 files changed

+162
-175
lines changed

llvm/test/Transforms/InstSimplify/shufflevector.ll

Lines changed: 0 additions & 171 deletions
Original file line numberDiff line numberDiff line change
@@ -337,174 +337,3 @@ define <4 x i32> @not_fold_identity2(<4 x i32> %x) {
337337
%revshuf = shufflevector <4 x i32> %shuf, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
338338
ret <4 x i32> %revshuf
339339
}
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-
}

llvm/test/Transforms/VectorCombine/AArch64/shuffletoidentity.ll

Lines changed: 162 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,21 @@ define <8 x i8> @trivial(<8 x i8> %a) {
1313
ret <8 x i8> %r
1414
}
1515

16-
define <8 x i8> @add(<8 x i8> %a, <8 x i8> %b) {
17-
; CHECK-LABEL: @add(
16+
define <4 x i32> @add_same_operands(<4 x i32> %x) {
17+
; CHECK-LABEL: @add_same_operands(
18+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
19+
; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[SHUF]]
20+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
21+
; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
22+
;
23+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
24+
%add = add <4 x i32> %shuf, %shuf
25+
%revshuf = shufflevector <4 x i32> %add, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
26+
ret <4 x i32> %revshuf
27+
}
28+
29+
define <8 x i8> @add_different_operands(<8 x i8> %a, <8 x i8> %b) {
30+
; CHECK-LABEL: @add_different_operands(
1831
; CHECK-NEXT: [[R:%.*]] = add <8 x i8> [[A:%.*]], [[B:%.*]]
1932
; CHECK-NEXT: ret <8 x i8> [[R]]
2033
;
@@ -356,8 +369,23 @@ define <8 x i8> @inner_shuffle(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) {
356369
ret <8 x i8> %r
357370
}
358371

359-
define <8 x i8> @extrause_add(<8 x i8> %a, <8 x i8> %b) {
360-
; CHECK-LABEL: @extrause_add(
372+
define <4 x i32> @extrause_add_same_operands(<4 x i32> %x) {
373+
; CHECK-LABEL: @extrause_add_same_operands(
374+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
375+
; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[SHUF]]
376+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
377+
; CHECK-NEXT: [[ADD2:%.*]] = add <4 x i32> [[SHUF]], [[REVSHUF]]
378+
; CHECK-NEXT: ret <4 x i32> [[ADD2]]
379+
;
380+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
381+
%add = add <4 x i32> %shuf, %shuf
382+
%revshuf = shufflevector <4 x i32> %add, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
383+
%add2 = add <4 x i32> %shuf, %revshuf
384+
ret <4 x i32> %add2
385+
}
386+
387+
define <8 x i8> @extrause_add_different_operands(<8 x i8> %a, <8 x i8> %b) {
388+
; CHECK-LABEL: @extrause_add_different_operands(
361389
; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x i8> [[A:%.*]], <8 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
362390
; CHECK-NEXT: [[AT:%.*]] = shufflevector <8 x i8> [[A]], <8 x i8> poison, <4 x i32> <i32 7, i32 6, i32 5, i32 4>
363391
; CHECK-NEXT: [[BB:%.*]] = shufflevector <8 x i8> [[B:%.*]], <8 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
@@ -513,6 +541,63 @@ define <8 x half> @fma(<8 x half> %a, <8 x half> %b, <8 x half> %c) {
513541
ret <8 x half> %r
514542
}
515543

544+
define <4 x i64> @single_zext(<4 x i32> %x) {
545+
; CHECK-LABEL: @single_zext(
546+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
547+
; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[SHUF]] to <4 x i64>
548+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[ZEXT]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
549+
; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
550+
;
551+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
552+
%zext = zext <4 x i32> %shuf to <4 x i64>
553+
%revshuf = shufflevector <4 x i64> %zext, <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
554+
ret <4 x i64> %revshuf
555+
}
556+
557+
define <4 x i64> @not_zext(<4 x i32> %x) {
558+
; CHECK-LABEL: @not_zext(
559+
; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[X:%.*]] to <4 x i64>
560+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[ZEXT]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
561+
; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
562+
;
563+
%zext = zext <4 x i32> %x to <4 x i64>
564+
%revshuf = shufflevector <4 x i64> %zext, <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
565+
ret <4 x i64> %revshuf
566+
}
567+
568+
define <4 x i64> @not_zext2(<4 x i32> %x) {
569+
; CHECK-LABEL: @not_zext2(
570+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
571+
; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[SHUF]] to <4 x i64>
572+
; CHECK-NEXT: ret <4 x i64> [[ZEXT]]
573+
;
574+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
575+
%zext = zext <4 x i32> %shuf to <4 x i64>
576+
ret <4 x i64> %zext
577+
}
578+
579+
define i32 @not_bitcast(<4 x i8> %x) {
580+
; CHECK-LABEL: @not_bitcast(
581+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
582+
; CHECK-NEXT: [[BITCAST:%.*]] = bitcast <4 x i8> [[SHUF]] to i32
583+
; CHECK-NEXT: ret i32 [[BITCAST]]
584+
;
585+
%shuf = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
586+
%bitcast = bitcast <4 x i8> %shuf to i32
587+
ret i32 %bitcast
588+
}
589+
590+
define <8 x i16> @not_bitcast2(<4 x i32> %x, <8 x i16> %y) {
591+
; CHECK-LABEL: @not_bitcast2(
592+
; CHECK-NEXT: [[CAST:%.*]] = bitcast <4 x i32> [[X:%.*]] to <8 x i16>
593+
; 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>
594+
; CHECK-NEXT: ret <8 x i16> [[OUT]]
595+
;
596+
%cast = bitcast <4 x i32> %x to <8 x i16>
597+
%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>
598+
ret <8 x i16> %out
599+
}
600+
516601
define void @exttrunc(<8 x i32> %a, <8 x i32> %b, ptr %p) {
517602
; CHECK-LABEL: @exttrunc(
518603
; CHECK-NEXT: [[AB:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
@@ -667,6 +752,51 @@ define void @trunc(<8 x i64> %a, <8 x i64> %b, ptr %p) {
667752
ret void
668753
}
669754

755+
define <4 x i64> @zext_chain(<4 x i16> %x) {
756+
; CHECK-LABEL: @zext_chain(
757+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i16> [[X:%.*]], <4 x i16> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
758+
; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i16> [[SHUF]] to <4 x i32>
759+
; CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i32> [[ZEXT]] to <4 x i64>
760+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[SEXT]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
761+
; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
762+
;
763+
%shuf = shufflevector <4 x i16> %x, <4 x i16> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
764+
%zext = zext <4 x i16> %shuf to <4 x i32>
765+
%sext = sext <4 x i32> %zext to <4 x i64>
766+
%revshuf = shufflevector <4 x i64> %sext, <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
767+
ret <4 x i64> %revshuf
768+
}
769+
770+
define <4 x i32> @add_chain(<4 x i32> %x) {
771+
; CHECK-LABEL: @add_chain(
772+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
773+
; CHECK-NEXT: [[ADD:%.*]] = add <4 x i32> [[SHUF]], [[SHUF]]
774+
; CHECK-NEXT: [[ADD2:%.*]] = add <4 x i32> [[ADD]], [[ADD]]
775+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i32> [[ADD2]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
776+
; CHECK-NEXT: ret <4 x i32> [[REVSHUF]]
777+
;
778+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
779+
%add = add <4 x i32> %shuf, %shuf
780+
%add2 = add <4 x i32> %add, %add
781+
%revshuf = shufflevector <4 x i32> %add2, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
782+
ret <4 x i32> %revshuf
783+
}
784+
785+
define <4 x i64> @zext_add_chain(<4 x i32> %x) {
786+
; CHECK-LABEL: @zext_add_chain(
787+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
788+
; CHECK-NEXT: [[ZEXT:%.*]] = zext <4 x i32> [[SHUF]] to <4 x i64>
789+
; CHECK-NEXT: [[ADD:%.*]] = add <4 x i64> [[ZEXT]], [[ZEXT]]
790+
; CHECK-NEXT: [[REVSHUF:%.*]] = shufflevector <4 x i64> [[ADD]], <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
791+
; CHECK-NEXT: ret <4 x i64> [[REVSHUF]]
792+
;
793+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
794+
%zext = zext <4 x i32> %shuf to <4 x i64>
795+
%add = add <4 x i64> %zext, %zext
796+
%revshuf = shufflevector <4 x i64> %add, <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
797+
ret <4 x i64> %revshuf
798+
}
799+
670800
define <8 x i8> @intrinsics_minmax(<8 x i8> %a, <8 x i8> %b) {
671801
; CHECK-LABEL: @intrinsics_minmax(
672802
; CHECK-NEXT: [[TMP1:%.*]] = call <8 x i8> @llvm.smin.v8i8(<8 x i8> [[A:%.*]], <8 x i8> [[B:%.*]])
@@ -847,5 +977,33 @@ define <4 x i8> @singleop(<4 x i8> %a, <4 x i8> %b) {
847977
ret <4 x i8> %r
848978
}
849979

980+
define <4 x i64> @cast_mismatched_types(<4 x i32> %x) {
981+
; CHECK-LABEL: @cast_mismatched_types(
982+
; CHECK-NEXT: [[SHUF:%.*]] = shufflevector <4 x i32> [[X:%.*]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>
983+
; CHECK-NEXT: [[ZEXT:%.*]] = zext <2 x i32> [[SHUF]] to <2 x i64>
984+
; CHECK-NEXT: [[EXTSHUF:%.*]] = shufflevector <2 x i64> [[ZEXT]], <2 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
985+
; CHECK-NEXT: ret <4 x i64> [[EXTSHUF]]
986+
;
987+
%shuf = shufflevector <4 x i32> %x, <4 x i32> poison, <2 x i32> <i32 0, i32 2>
988+
%zext = zext <2 x i32> %shuf to <2 x i64>
989+
%extshuf = shufflevector <2 x i64> %zext, <2 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
990+
ret <4 x i64> %extshuf
991+
}
992+
993+
define <4 x float> @fadd_mismatched_types(<4 x float> %x, <4 x float> %y) {
994+
; CHECK-LABEL: @fadd_mismatched_types(
995+
; CHECK-NEXT: [[SHUF_X:%.*]] = shufflevector <4 x float> [[X:%.*]], <4 x float> poison, <2 x i32> <i32 0, i32 2>
996+
; CHECK-NEXT: [[SHUF_Y:%.*]] = shufflevector <4 x float> [[Y:%.*]], <4 x float> poison, <2 x i32> <i32 1, i32 3>
997+
; CHECK-NEXT: [[FADD:%.*]] = fadd fast <2 x float> [[SHUF_X]], [[SHUF_Y]]
998+
; CHECK-NEXT: [[EXTSHUF:%.*]] = shufflevector <2 x float> [[FADD]], <2 x float> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
999+
; CHECK-NEXT: ret <4 x float> [[EXTSHUF]]
1000+
;
1001+
%shuf.x = shufflevector <4 x float> %x, <4 x float> poison, <2 x i32> <i32 0, i32 2>
1002+
%shuf.y = shufflevector <4 x float> %y, <4 x float> poison, <2 x i32> <i32 1, i32 3>
1003+
%fadd = fadd fast <2 x float> %shuf.x, %shuf.y
1004+
%extshuf = shufflevector <2 x float> %fadd, <2 x float> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
1005+
ret <4 x float> %extshuf
1006+
}
1007+
8501008

8511009
declare void @use(<4 x i8>)

0 commit comments

Comments
 (0)