xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/x86-pshufb.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Verify that instcombine is able to fold identity shuffles.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @identity_test(<16 x i8> %InVec) {
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @identity_test(
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> %InVec
9*9880d681SAndroid Build Coastguard Worker;
10*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>)
11*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @identity_test_avx2(<32 x i8> %InVec) {
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @identity_test_avx2(
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> %InVec
17*9880d681SAndroid Build Coastguard Worker;
18*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>)
19*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker; Verify that instcombine is able to fold byte shuffles with zero masks.
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @fold_to_zero_vector(<16 x i8> %InVec) {
25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_to_zero_vector(
26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> zeroinitializer
27*9880d681SAndroid Build Coastguard Worker;
28*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>)
29*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @fold_to_zero_vector_avx2(<32 x i8> %InVec) {
33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_to_zero_vector_avx2(
34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> zeroinitializer
35*9880d681SAndroid Build Coastguard Worker;
36*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>)
37*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; Instcombine should be able to fold the following byte shuffle to a builtin shufflevector
41*9880d681SAndroid Build Coastguard Worker; with a shuffle mask of all zeroes.
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @splat_test(<16 x i8> %InVec) {
44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @splat_test(
45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> undef, <16 x i32> zeroinitializer
46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
47*9880d681SAndroid Build Coastguard Worker;
48*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> zeroinitializer)
49*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
50*9880d681SAndroid Build Coastguard Worker}
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; In the test case below, elements in the low 128-bit lane of the result
53*9880d681SAndroid Build Coastguard Worker; vector are equal to the lower byte of %InVec (shuffle index 0).
54*9880d681SAndroid Build Coastguard Worker; Elements in the high 128-bit lane of the result vector are equal to
55*9880d681SAndroid Build Coastguard Worker; the lower byte in the high 128-bit lane of %InVec (shuffle index 16).
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @splat_test_avx2(<32 x i8> %InVec) {
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @splat_test_avx2(
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> undef, <32 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> [[TMP1]]
61*9880d681SAndroid Build Coastguard Worker;
62*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> zeroinitializer)
63*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; Each of the byte shuffles in the following tests is equivalent to a blend between
67*9880d681SAndroid Build Coastguard Worker; vector %InVec and a vector of all zeroes.
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @blend1(<16 x i8> %InVec) {
70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend1(
71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 16, i32 1, i32 16, i32 3, i32 16, i32 5, i32 16, i32 7, i32 16, i32 9, i32 16, i32 11, i32 16, i32 13, i32 16, i32 15>
72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
73*9880d681SAndroid Build Coastguard Worker;
74*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 -128, i8 1, i8 -128, i8 3, i8 -128, i8 5, i8 -128, i8 7, i8 -128, i8 9, i8 -128, i8 11, i8 -128, i8 13, i8 -128, i8 15>)
75*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @blend2(<16 x i8> %InVec) {
79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend2(
80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 16, i32 16, i32 2, i32 3, i32 16, i32 16, i32 6, i32 7, i32 16, i32 16, i32 10, i32 11, i32 16, i32 16, i32 14, i32 15>
81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
82*9880d681SAndroid Build Coastguard Worker;
83*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 -128, i8 -128, i8 2, i8 3, i8 -128, i8 -128, i8 6, i8 7, i8 -128, i8 -128, i8 10, i8 11, i8 -128, i8 -128, i8 14, i8 15>)
84*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @blend3(<16 x i8> %InVec) {
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend3(
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 16, i32 16, i32 16, i32 16, i32 4, i32 5, i32 6, i32 7, i32 16, i32 16, i32 16, i32 16, i32 12, i32 13, i32 14, i32 15>
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
91*9880d681SAndroid Build Coastguard Worker;
92*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 4, i8 5, i8 6, i8 7, i8 -128, i8 -128, i8 -128, i8 -128, i8 12, i8 13, i8 14, i8 15>)
93*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @blend4(<16 x i8> %InVec) {
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend4(
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
100*9880d681SAndroid Build Coastguard Worker;
101*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>)
102*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @blend5(<16 x i8> %InVec) {
106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend5(
107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
109*9880d681SAndroid Build Coastguard Worker;
110*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>)
111*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @blend6(<16 x i8> %InVec) {
115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend6(
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 0, i32 1, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
118*9880d681SAndroid Build Coastguard Worker;
119*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 0, i8 1, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>)
120*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @blend1_avx2(<32 x i8> %InVec) {
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend1_avx2(
125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 32, i32 1, i32 32, i32 3, i32 32, i32 5, i32 32, i32 7, i32 32, i32 9, i32 32, i32 11, i32 32, i32 13, i32 32, i32 15, i32 48, i32 17, i32 48, i32 19, i32 48, i32 21, i32 48, i32 23, i32 48, i32 25, i32 48, i32 27, i32 48, i32 29, i32 48, i32 31>
126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> [[TMP1]]
127*9880d681SAndroid Build Coastguard Worker;
128*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 -128, i8 1, i8 -128, i8 3, i8 -128, i8 5, i8 -128, i8 7, i8 -128, i8 9, i8 -128, i8 11, i8 -128, i8 13, i8 -128, i8 15, i8 -128, i8 1, i8 -128, i8 3, i8 -128, i8 5, i8 -128, i8 7, i8 -128, i8 9, i8 -128, i8 11, i8 -128, i8 13, i8 -128, i8 15>)
129*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
130*9880d681SAndroid Build Coastguard Worker}
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @blend2_avx2(<32 x i8> %InVec) {
133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend2_avx2(
134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 32, i32 32, i32 2, i32 3, i32 32, i32 32, i32 6, i32 7, i32 32, i32 32, i32 10, i32 11, i32 32, i32 32, i32 14, i32 15, i32 48, i32 48, i32 18, i32 19, i32 48, i32 48, i32 22, i32 23, i32 48, i32 48, i32 26, i32 27, i32 48, i32 48, i32 30, i32 31>
135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> [[TMP1]]
136*9880d681SAndroid Build Coastguard Worker;
137*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 -128, i8 -128, i8 2, i8 3, i8 -128, i8 -128, i8 6, i8 7, i8 -128, i8 -128, i8 10, i8 11, i8 -128, i8 -128, i8 14, i8 15, i8 -128, i8 -128, i8 2, i8 3, i8 -128, i8 -128, i8 6, i8 7, i8 -128, i8 -128, i8 10, i8 11, i8 -128, i8 -128, i8 14, i8 15>)
138*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
139*9880d681SAndroid Build Coastguard Worker}
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @blend3_avx2(<32 x i8> %InVec) {
142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend3_avx2(
143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 32, i32 32, i32 32, i32 32, i32 4, i32 5, i32 6, i32 7, i32 32, i32 32, i32 32, i32 32, i32 12, i32 13, i32 14, i32 15, i32 48, i32 48, i32 48, i32 48, i32 20, i32 21, i32 22, i32 23, i32 48, i32 48, i32 48, i32 48, i32 28, i32 29, i32 30, i32 31>
144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> [[TMP1]]
145*9880d681SAndroid Build Coastguard Worker;
146*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 4, i8 5, i8 6, i8 7, i8 -128, i8 -128, i8 -128, i8 -128, i8 12, i8 13, i8 14, i8 15, i8 -128, i8 -128, i8 -128, i8 -128, i8 4, i8 5, i8 6, i8 7, i8 -128, i8 -128, i8 -128, i8 -128, i8 12, i8 13, i8 14, i8 15>)
147*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
148*9880d681SAndroid Build Coastguard Worker}
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @blend4_avx2(<32 x i8> %InVec) {
151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend4_avx2(
152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> [[TMP1]]
154*9880d681SAndroid Build Coastguard Worker;
155*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15>)
156*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
157*9880d681SAndroid Build Coastguard Worker}
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @blend5_avx2(<32 x i8> %InVec) {
160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend5_avx2(
161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 16, i32 17, i32 18, i32 19, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48>
162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> [[TMP1]]
163*9880d681SAndroid Build Coastguard Worker;
164*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 0, i8 1, i8 2, i8 3, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 0, i8 1, i8 2, i8 3, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>)
165*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @blend6_avx2(<32 x i8> %InVec) {
169*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @blend6_avx2(
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 0, i32 1, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 16, i32 17, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48>
171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> [[TMP1]]
172*9880d681SAndroid Build Coastguard Worker;
173*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 0, i8 1, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 0, i8 1, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>)
174*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
175*9880d681SAndroid Build Coastguard Worker}
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker; movq idiom.
178*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @movq_idiom(<16 x i8> %InVec) {
179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @movq_idiom(
180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
182*9880d681SAndroid Build Coastguard Worker;
183*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>)
184*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @movq_idiom_avx2(<32 x i8> %InVec) {
188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @movq_idiom_avx2(
189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 32, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48, i32 48>
190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> [[TMP1]]
191*9880d681SAndroid Build Coastguard Worker;
192*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128>)
193*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
194*9880d681SAndroid Build Coastguard Worker}
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker; Vector permutations using byte shuffles.
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @permute1(<16 x i8> %InVec) {
199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @permute1(
200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15, i32 12, i32 13, i32 14, i32 15>
201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
202*9880d681SAndroid Build Coastguard Worker;
203*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 4, i8 5, i8 6, i8 7, i8 4, i8 5, i8 6, i8 7, i8 12, i8 13, i8 14, i8 15, i8 12, i8 13, i8 14, i8 15>)
204*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
205*9880d681SAndroid Build Coastguard Worker}
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @permute2(<16 x i8> %InVec) {
208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @permute2(
209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
211*9880d681SAndroid Build Coastguard Worker;
212*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7>)
213*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
214*9880d681SAndroid Build Coastguard Worker}
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @permute1_avx2(<32 x i8> %InVec) {
217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @permute1_avx2(
218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15, i32 12, i32 13, i32 14, i32 15, i32 20, i32 21, i32 22, i32 23, i32 20, i32 21, i32 22, i32 23, i32 28, i32 29, i32 30, i32 31, i32 28, i32 29, i32 30, i32 31>
219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> [[TMP1]]
220*9880d681SAndroid Build Coastguard Worker;
221*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 4, i8 5, i8 6, i8 7, i8 4, i8 5, i8 6, i8 7, i8 12, i8 13, i8 14, i8 15, i8 12, i8 13, i8 14, i8 15, i8 4, i8 5, i8 6, i8 7, i8 4, i8 5, i8 6, i8 7, i8 12, i8 13, i8 14, i8 15, i8 12, i8 13, i8 14, i8 15>)
222*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
223*9880d681SAndroid Build Coastguard Worker}
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @permute2_avx2(<32 x i8> %InVec) {
226*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @permute2_avx2(
227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> undef, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23>
228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> [[TMP1]]
229*9880d681SAndroid Build Coastguard Worker;
230*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7>)
231*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
232*9880d681SAndroid Build Coastguard Worker}
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Worker; Test that instcombine correctly folds a pshufb with values that
235*9880d681SAndroid Build Coastguard Worker; are not -128 and that are not encoded in four bits.
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @identity_test2_2(<16 x i8> %InVec) {
238*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @identity_test2_2(
239*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> %InVec
240*9880d681SAndroid Build Coastguard Worker;
241*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 23, i8 24, i8 25, i8 26, i8 27, i8 28, i8 29, i8 30, i8 31>)
242*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
243*9880d681SAndroid Build Coastguard Worker}
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @identity_test_avx2_2(<32 x i8> %InVec) {
246*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @identity_test_avx2_2(
247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> %InVec
248*9880d681SAndroid Build Coastguard Worker;
249*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 16, i8 33, i8 66, i8 19, i8 36, i8 69, i8 22, i8 39, i8 72, i8 25, i8 42, i8 75, i8 28, i8 45, i8 78, i8 31, i8 48, i8 81, i8 34, i8 51, i8 84, i8 37, i8 54, i8 87, i8 40, i8 57, i8 90, i8 43, i8 60, i8 93, i8 46, i8 63>)
250*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @fold_to_zero_vector_2(<16 x i8> %InVec) {
254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_to_zero_vector_2(
255*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> zeroinitializer
256*9880d681SAndroid Build Coastguard Worker;
257*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 -125, i8 -1, i8 -53, i8 -32, i8 -4, i8 -7, i8 -33, i8 -66, i8 -99, i8 -120, i8 -100, i8 -22, i8 -17, i8 -1, i8 -11, i8 -15>)
258*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
259*9880d681SAndroid Build Coastguard Worker}
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @fold_to_zero_vector_avx2_2(<32 x i8> %InVec) {
262*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_to_zero_vector_avx2_2(
263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> zeroinitializer
264*9880d681SAndroid Build Coastguard Worker;
265*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 -127, i8 -1, i8 -53, i8 -32, i8 -4, i8 -7, i8 -33, i8 -66, i8 -99, i8 -120, i8 -100, i8 -22, i8 -17, i8 -1, i8 -11, i8 -15, i8 -126, i8 -2, i8 -52, i8 -31, i8 -5, i8 -8, i8 -34, i8 -67, i8 -100, i8 -119, i8 -101, i8 -23, i8 -16, i8 -2, i8 -12, i8 -16>)
266*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @permute3(<16 x i8> %InVec) {
270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @permute3(
271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
273*9880d681SAndroid Build Coastguard Worker;
274*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 48, i8 17, i8 34, i8 51, i8 20, i8 37, i8 54, i8 23, i8 16, i8 49, i8 66, i8 19, i8 52, i8 69, i8 22, i8 55>)
275*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
276*9880d681SAndroid Build Coastguard Worker}
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @permute3_avx2(<32 x i8> %InVec) {
279*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @permute3_avx2(
280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 12, i32 13, i32 14, i32 15, i32 12, i32 13, i32 14, i32 15, i32 20, i32 21, i32 22, i32 23, i32 20, i32 21, i32 22, i32 23, i32 28, i32 29, i32 30, i32 31, i32 28, i32 29, i32 30, i32 31>
281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> [[TMP1]]
282*9880d681SAndroid Build Coastguard Worker;
283*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 52, i8 21, i8 38, i8 55, i8 20, i8 37, i8 54, i8 23, i8 28, i8 61, i8 78, i8 31, i8 60, i8 29, i8 30, i8 79, i8 52, i8 21, i8 38, i8 55, i8 20, i8 53, i8 102, i8 23, i8 92, i8 93, i8 94, i8 95, i8 108, i8 109, i8 110, i8 111>)
284*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
285*9880d681SAndroid Build Coastguard Worker}
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Worker; FIXME: Verify that instcombine is able to fold constant byte shuffles with undef mask elements.
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @fold_with_undef_elts(<16 x i8> %InVec) {
290*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_with_undef_elts(
291*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %InVec, <16 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 0, i32 16, i32 undef, i32 16, i32 1, i32 16, i32 undef, i32 16, i32 2, i32 16, i32 undef, i32 16, i32 3, i32 16, i32 undef, i32 16>
292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
293*9880d681SAndroid Build Coastguard Worker;
294*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> <i8 0, i8 -128, i8 undef, i8 -128, i8 1, i8 -128, i8 undef, i8 -128, i8 2, i8 -128, i8 undef, i8 -128, i8 3, i8 -128, i8 undef, i8 -128>)
295*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
296*9880d681SAndroid Build Coastguard Worker}
297*9880d681SAndroid Build Coastguard Worker
298*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @fold_with_undef_elts_avx2(<32 x i8> %InVec) {
299*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_with_undef_elts_avx2(
300*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <32 x i8> %InVec, <32 x i8> <i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <32 x i32> <i32 0, i32 32, i32 undef, i32 32, i32 1, i32 32, i32 undef, i32 32, i32 2, i32 32, i32 undef, i32 32, i32 3, i32 32, i32 undef, i32 32, i32 16, i32 48, i32 undef, i32 48, i32 17, i32 48, i32 undef, i32 48, i32 18, i32 48, i32 undef, i32 48, i32 19, i32 48, i32 undef, i32 48>
301*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> [[TMP1]]
302*9880d681SAndroid Build Coastguard Worker;
303*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> <i8 0, i8 -128, i8 undef, i8 -128, i8 1, i8 -128, i8 undef, i8 -128, i8 2, i8 -128, i8 undef, i8 -128, i8 3, i8 -128, i8 undef, i8 -128, i8 0, i8 -128, i8 undef, i8 -128, i8 1, i8 -128, i8 undef, i8 -128, i8 2, i8 -128, i8 undef, i8 -128, i8 3, i8 -128, i8 undef, i8 -128>)
304*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
305*9880d681SAndroid Build Coastguard Worker}
306*9880d681SAndroid Build Coastguard Worker
307*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @fold_with_allundef_elts(<16 x i8> %InVec) {
308*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_with_allundef_elts(
309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> undef
310*9880d681SAndroid Build Coastguard Worker;
311*9880d681SAndroid Build Coastguard Worker  %1 = tail call <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8> %InVec, <16 x i8> undef)
312*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %1
313*9880d681SAndroid Build Coastguard Worker}
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Workerdefine <32 x i8> @fold_with_allundef_elts_avx2(<32 x i8> %InVec) {
316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fold_with_allundef_elts_avx2(
317*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <32 x i8> undef
318*9880d681SAndroid Build Coastguard Worker;
319*9880d681SAndroid Build Coastguard Worker  %1 = tail call <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8> %InVec, <32 x i8> undef)
320*9880d681SAndroid Build Coastguard Worker  ret <32 x i8> %1
321*9880d681SAndroid Build Coastguard Worker}
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Workerdeclare <16 x i8> @llvm.x86.ssse3.pshuf.b.128(<16 x i8>, <16 x i8>)
324*9880d681SAndroid Build Coastguard Workerdeclare <32 x i8> @llvm.x86.avx2.pshuf.b(<32 x i8>, <32 x i8>)
325