xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/vector-shuffle-combining.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=x86-64 -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3
4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
6*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
7*9880d681SAndroid Build Coastguard Worker;
8*9880d681SAndroid Build Coastguard Worker; Verify that the DAG combiner correctly folds bitwise operations across
9*9880d681SAndroid Build Coastguard Worker; shuffles, nested shuffles with undef, pairs of nested shuffles, and other
10*9880d681SAndroid Build Coastguard Worker; basic and always-safe patterns. Also test that the DAG combiner will combine
11*9880d681SAndroid Build Coastguard Worker; target-specific shuffle instructions where reasonable.
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-unknown"
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32>, i8)
16*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16>, i8)
17*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16>, i8)
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_pshufd1(<4 x i32> %a) {
20*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_pshufd1:
21*9880d681SAndroid Build Coastguard Worker; ALL:       # BB#0: # %entry
22*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
23*9880d681SAndroid Build Coastguard Workerentry:
24*9880d681SAndroid Build Coastguard Worker  %b = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 27)
25*9880d681SAndroid Build Coastguard Worker  %c = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %b, i8 27)
26*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %c
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_pshufd2(<4 x i32> %a) {
30*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_pshufd2:
31*9880d681SAndroid Build Coastguard Worker; ALL:       # BB#0: # %entry
32*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
33*9880d681SAndroid Build Coastguard Workerentry:
34*9880d681SAndroid Build Coastguard Worker  %b = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 27)
35*9880d681SAndroid Build Coastguard Worker  %b.cast = bitcast <4 x i32> %b to <8 x i16>
36*9880d681SAndroid Build Coastguard Worker  %c = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %b.cast, i8 -28)
37*9880d681SAndroid Build Coastguard Worker  %c.cast = bitcast <8 x i16> %c to <4 x i32>
38*9880d681SAndroid Build Coastguard Worker  %d = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %c.cast, i8 27)
39*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %d
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_pshufd3(<4 x i32> %a) {
43*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_pshufd3:
44*9880d681SAndroid Build Coastguard Worker; ALL:       # BB#0: # %entry
45*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
46*9880d681SAndroid Build Coastguard Workerentry:
47*9880d681SAndroid Build Coastguard Worker  %b = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 27)
48*9880d681SAndroid Build Coastguard Worker  %b.cast = bitcast <4 x i32> %b to <8 x i16>
49*9880d681SAndroid Build Coastguard Worker  %c = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %b.cast, i8 -28)
50*9880d681SAndroid Build Coastguard Worker  %c.cast = bitcast <8 x i16> %c to <4 x i32>
51*9880d681SAndroid Build Coastguard Worker  %d = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %c.cast, i8 27)
52*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %d
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_pshufd4(<4 x i32> %a) {
56*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_pshufd4:
57*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0: # %entry
58*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
59*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
60*9880d681SAndroid Build Coastguard Worker;
61*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_pshufd4:
62*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
63*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
64*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
65*9880d681SAndroid Build Coastguard Workerentry:
66*9880d681SAndroid Build Coastguard Worker  %b = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 -31)
67*9880d681SAndroid Build Coastguard Worker  %b.cast = bitcast <4 x i32> %b to <8 x i16>
68*9880d681SAndroid Build Coastguard Worker  %c = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %b.cast, i8 27)
69*9880d681SAndroid Build Coastguard Worker  %c.cast = bitcast <8 x i16> %c to <4 x i32>
70*9880d681SAndroid Build Coastguard Worker  %d = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %c.cast, i8 -31)
71*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %d
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_pshufd5(<4 x i32> %a) {
75*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_pshufd5:
76*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0: # %entry
77*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
78*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
79*9880d681SAndroid Build Coastguard Worker;
80*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_pshufd5:
81*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
82*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
83*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
84*9880d681SAndroid Build Coastguard Workerentry:
85*9880d681SAndroid Build Coastguard Worker  %b = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 -76)
86*9880d681SAndroid Build Coastguard Worker  %b.cast = bitcast <4 x i32> %b to <8 x i16>
87*9880d681SAndroid Build Coastguard Worker  %c = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %b.cast, i8 27)
88*9880d681SAndroid Build Coastguard Worker  %c.cast = bitcast <8 x i16> %c to <4 x i32>
89*9880d681SAndroid Build Coastguard Worker  %d = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %c.cast, i8 -76)
90*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %d
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_pshufd6(<4 x i32> %a) {
94*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_pshufd6:
95*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0: # %entry
96*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
97*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
98*9880d681SAndroid Build Coastguard Worker;
99*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_pshufd6:
100*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0: # %entry
101*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
102*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
103*9880d681SAndroid Build Coastguard Worker;
104*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_pshufd6:
105*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0: # %entry
106*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vbroadcastss %xmm0, %xmm0
107*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
108*9880d681SAndroid Build Coastguard Workerentry:
109*9880d681SAndroid Build Coastguard Worker  %b = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 0)
110*9880d681SAndroid Build Coastguard Worker  %c = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %b, i8 8)
111*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %c
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @combine_pshuflw1(<8 x i16> %a) {
115*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_pshuflw1:
116*9880d681SAndroid Build Coastguard Worker; ALL:       # BB#0: # %entry
117*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
118*9880d681SAndroid Build Coastguard Workerentry:
119*9880d681SAndroid Build Coastguard Worker  %b = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %a, i8 27)
120*9880d681SAndroid Build Coastguard Worker  %c = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %b, i8 27)
121*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %c
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @combine_pshuflw2(<8 x i16> %a) {
125*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_pshuflw2:
126*9880d681SAndroid Build Coastguard Worker; ALL:       # BB#0: # %entry
127*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
128*9880d681SAndroid Build Coastguard Workerentry:
129*9880d681SAndroid Build Coastguard Worker  %b = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %a, i8 27)
130*9880d681SAndroid Build Coastguard Worker  %c = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %b, i8 -28)
131*9880d681SAndroid Build Coastguard Worker  %d = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %c, i8 27)
132*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %d
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @combine_pshuflw3(<8 x i16> %a) {
136*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_pshuflw3:
137*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0: # %entry
138*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
139*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
140*9880d681SAndroid Build Coastguard Worker;
141*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_pshuflw3:
142*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
143*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4]
144*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
145*9880d681SAndroid Build Coastguard Workerentry:
146*9880d681SAndroid Build Coastguard Worker  %b = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %a, i8 27)
147*9880d681SAndroid Build Coastguard Worker  %c = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %b, i8 27)
148*9880d681SAndroid Build Coastguard Worker  %d = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %c, i8 27)
149*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %d
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @combine_pshufhw1(<8 x i16> %a) {
153*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_pshufhw1:
154*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0: # %entry
155*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
156*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
157*9880d681SAndroid Build Coastguard Worker;
158*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_pshufhw1:
159*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
160*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
161*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
162*9880d681SAndroid Build Coastguard Workerentry:
163*9880d681SAndroid Build Coastguard Worker  %b = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %a, i8 27)
164*9880d681SAndroid Build Coastguard Worker  %c = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %b, i8 27)
165*9880d681SAndroid Build Coastguard Worker  %d = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %c, i8 27)
166*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %d
167*9880d681SAndroid Build Coastguard Worker}
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
170*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_bitwise_ops_test1:
171*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
172*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand %xmm1, %xmm0
173*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
174*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
175*9880d681SAndroid Build Coastguard Worker;
176*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test1:
177*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
178*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
179*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
180*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
181*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 1, i32 3>
182*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 1, i32 3>
183*9880d681SAndroid Build Coastguard Worker  %and = and <4 x i32> %shuf1, %shuf2
184*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %and
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test2(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
188*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_bitwise_ops_test2:
189*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
190*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    por %xmm1, %xmm0
191*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
192*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
193*9880d681SAndroid Build Coastguard Worker;
194*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test2:
195*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
196*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
197*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
198*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
199*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 1, i32 3>
200*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 1, i32 3>
201*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
202*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test3(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
206*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_bitwise_ops_test3:
207*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
208*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pxor %xmm1, %xmm0
209*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
210*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
211*9880d681SAndroid Build Coastguard Worker;
212*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test3:
213*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
214*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
215*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
216*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
217*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 1, i32 3>
218*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 1, i32 3>
219*9880d681SAndroid Build Coastguard Worker  %xor = xor <4 x i32> %shuf1, %shuf2
220*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %xor
221*9880d681SAndroid Build Coastguard Worker}
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test4(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
224*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_bitwise_ops_test4:
225*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
226*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pand %xmm1, %xmm0
227*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
228*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
229*9880d681SAndroid Build Coastguard Worker;
230*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test4:
231*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
232*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
233*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
234*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
235*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 4, i32 6, i32 5, i32 7>
236*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 4, i32 6, i32 5, i32 7>
237*9880d681SAndroid Build Coastguard Worker  %and = and <4 x i32> %shuf1, %shuf2
238*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %and
239*9880d681SAndroid Build Coastguard Worker}
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test5(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
242*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_bitwise_ops_test5:
243*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
244*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    por %xmm1, %xmm0
245*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
246*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
247*9880d681SAndroid Build Coastguard Worker;
248*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test5:
249*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
250*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
251*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
252*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
253*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 4, i32 6, i32 5, i32 7>
254*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 4, i32 6, i32 5, i32 7>
255*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
256*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
257*9880d681SAndroid Build Coastguard Worker}
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test6(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
260*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_bitwise_ops_test6:
261*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
262*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pxor %xmm1, %xmm0
263*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
264*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
265*9880d681SAndroid Build Coastguard Worker;
266*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test6:
267*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
268*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
269*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
270*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
271*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 4, i32 6, i32 5, i32 7>
272*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 4, i32 6, i32 5, i32 7>
273*9880d681SAndroid Build Coastguard Worker  %xor = xor <4 x i32> %shuf1, %shuf2
274*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %xor
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Worker; Verify that DAGCombiner moves the shuffle after the xor/and/or even if shuffles
279*9880d681SAndroid Build Coastguard Worker; are not performing a swizzle operations.
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test1b(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
282*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test1b:
283*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
284*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm0
285*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
286*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
287*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
288*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
289*9880d681SAndroid Build Coastguard Worker;
290*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test1b:
291*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
292*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pand %xmm1, %xmm0
293*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
294*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
295*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
296*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
297*9880d681SAndroid Build Coastguard Worker;
298*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test1b:
299*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
300*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand %xmm1, %xmm0
301*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
302*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
303*9880d681SAndroid Build Coastguard Worker;
304*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test1b:
305*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
306*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
307*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
308*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
309*9880d681SAndroid Build Coastguard Worker;
310*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test1b:
311*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
312*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
313*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
314*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
315*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 5, i32 2, i32 7>
316*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 5, i32 2, i32 7>
317*9880d681SAndroid Build Coastguard Worker  %and = and <4 x i32> %shuf1, %shuf2
318*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %and
319*9880d681SAndroid Build Coastguard Worker}
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test2b(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
322*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test2b:
323*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
324*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm1, %xmm0
325*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
326*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
327*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
328*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
329*9880d681SAndroid Build Coastguard Worker;
330*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test2b:
331*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
332*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    por %xmm1, %xmm0
333*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
334*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
335*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
336*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
337*9880d681SAndroid Build Coastguard Worker;
338*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test2b:
339*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
340*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm1, %xmm0
341*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
342*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
343*9880d681SAndroid Build Coastguard Worker;
344*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test2b:
345*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
346*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
347*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
348*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
349*9880d681SAndroid Build Coastguard Worker;
350*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test2b:
351*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
352*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
353*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
354*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
355*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 5, i32 2, i32 7>
356*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 5, i32 2, i32 7>
357*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
358*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
359*9880d681SAndroid Build Coastguard Worker}
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test3b(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
362*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test3b:
363*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
364*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    xorps %xmm1, %xmm0
365*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
366*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
367*9880d681SAndroid Build Coastguard Worker;
368*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test3b:
369*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
370*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    xorps %xmm1, %xmm0
371*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
372*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
373*9880d681SAndroid Build Coastguard Worker;
374*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test3b:
375*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
376*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm1, %xmm0
377*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm1, %xmm1
378*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
379*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
380*9880d681SAndroid Build Coastguard Worker;
381*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test3b:
382*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
383*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
384*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
385*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
386*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
387*9880d681SAndroid Build Coastguard Worker;
388*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test3b:
389*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
390*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
391*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
392*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
393*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
394*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 5, i32 2, i32 7>
395*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 5, i32 2, i32 7>
396*9880d681SAndroid Build Coastguard Worker  %xor = xor <4 x i32> %shuf1, %shuf2
397*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %xor
398*9880d681SAndroid Build Coastguard Worker}
399*9880d681SAndroid Build Coastguard Worker
400*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test4b(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
401*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test4b:
402*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
403*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm0
404*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
405*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
406*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
407*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
408*9880d681SAndroid Build Coastguard Worker;
409*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test4b:
410*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
411*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pand %xmm1, %xmm0
412*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
413*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
414*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
415*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
416*9880d681SAndroid Build Coastguard Worker;
417*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test4b:
418*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
419*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand %xmm1, %xmm0
420*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7]
421*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
422*9880d681SAndroid Build Coastguard Worker;
423*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test4b:
424*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
425*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
426*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7]
427*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
428*9880d681SAndroid Build Coastguard Worker;
429*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test4b:
430*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
431*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
432*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3]
433*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
434*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 0, i32 5, i32 2, i32 7>
435*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 0, i32 5, i32 2, i32 7>
436*9880d681SAndroid Build Coastguard Worker  %and = and <4 x i32> %shuf1, %shuf2
437*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %and
438*9880d681SAndroid Build Coastguard Worker}
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test5b(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
441*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test5b:
442*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
443*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm1, %xmm0
444*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
445*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
446*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
447*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
448*9880d681SAndroid Build Coastguard Worker;
449*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test5b:
450*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
451*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    por %xmm1, %xmm0
452*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
453*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
454*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
455*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
456*9880d681SAndroid Build Coastguard Worker;
457*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test5b:
458*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
459*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm1, %xmm0
460*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7]
461*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
462*9880d681SAndroid Build Coastguard Worker;
463*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test5b:
464*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
465*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
466*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7]
467*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
468*9880d681SAndroid Build Coastguard Worker;
469*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test5b:
470*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
471*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
472*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3]
473*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
474*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 0, i32 5, i32 2, i32 7>
475*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 0, i32 5, i32 2, i32 7>
476*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
477*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
478*9880d681SAndroid Build Coastguard Worker}
479*9880d681SAndroid Build Coastguard Worker
480*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test6b(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
481*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test6b:
482*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
483*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    xorps %xmm1, %xmm0
484*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    andps {{.*}}(%rip), %xmm0
485*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
486*9880d681SAndroid Build Coastguard Worker;
487*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test6b:
488*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
489*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    xorps %xmm1, %xmm0
490*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    andps {{.*}}(%rip), %xmm0
491*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
492*9880d681SAndroid Build Coastguard Worker;
493*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test6b:
494*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
495*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm1, %xmm0
496*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm1, %xmm1
497*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]
498*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
499*9880d681SAndroid Build Coastguard Worker;
500*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test6b:
501*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
502*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
503*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
504*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7]
505*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
506*9880d681SAndroid Build Coastguard Worker;
507*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test6b:
508*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
509*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
510*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
511*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2],xmm0[3]
512*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
513*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 0, i32 5, i32 2, i32 7>
514*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 0, i32 5, i32 2, i32 7>
515*9880d681SAndroid Build Coastguard Worker  %xor = xor <4 x i32> %shuf1, %shuf2
516*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %xor
517*9880d681SAndroid Build Coastguard Worker}
518*9880d681SAndroid Build Coastguard Worker
519*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test1c(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
520*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test1c:
521*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
522*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm0
523*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
524*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
525*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
526*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
527*9880d681SAndroid Build Coastguard Worker;
528*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test1c:
529*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
530*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pand %xmm1, %xmm0
531*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
532*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
533*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
534*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
535*9880d681SAndroid Build Coastguard Worker;
536*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test1c:
537*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
538*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand %xmm1, %xmm0
539*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
540*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
541*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
542*9880d681SAndroid Build Coastguard Worker;
543*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test1c:
544*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
545*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
546*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
547*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
548*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
549*9880d681SAndroid Build Coastguard Worker;
550*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test1c:
551*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
552*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
553*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
554*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
555*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
556*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 5, i32 7>
557*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 5, i32 7>
558*9880d681SAndroid Build Coastguard Worker  %and = and <4 x i32> %shuf1, %shuf2
559*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %and
560*9880d681SAndroid Build Coastguard Worker}
561*9880d681SAndroid Build Coastguard Worker
562*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test2c(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
563*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test2c:
564*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
565*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm1, %xmm0
566*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
567*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
568*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
569*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
570*9880d681SAndroid Build Coastguard Worker;
571*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test2c:
572*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
573*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    por %xmm1, %xmm0
574*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
575*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
576*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
577*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
578*9880d681SAndroid Build Coastguard Worker;
579*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test2c:
580*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
581*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm1, %xmm0
582*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
583*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
584*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
585*9880d681SAndroid Build Coastguard Worker;
586*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test2c:
587*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
588*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
589*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
590*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
591*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
592*9880d681SAndroid Build Coastguard Worker;
593*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test2c:
594*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
595*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
596*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
597*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
598*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
599*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 5, i32 7>
600*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 5, i32 7>
601*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
602*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
603*9880d681SAndroid Build Coastguard Worker}
604*9880d681SAndroid Build Coastguard Worker
605*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test3c(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
606*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test3c:
607*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
608*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm1, %xmm0
609*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,2]
610*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm1, %xmm1
611*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
612*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
613*9880d681SAndroid Build Coastguard Worker;
614*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test3c:
615*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
616*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pxor %xmm1, %xmm0
617*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,2]
618*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pxor %xmm1, %xmm1
619*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
620*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
621*9880d681SAndroid Build Coastguard Worker;
622*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test3c:
623*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
624*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm1, %xmm0
625*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
626*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
627*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
628*9880d681SAndroid Build Coastguard Worker;
629*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test3c:
630*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
631*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
632*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
633*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
634*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
635*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 5, i32 7>
636*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 5, i32 7>
637*9880d681SAndroid Build Coastguard Worker  %xor = xor <4 x i32> %shuf1, %shuf2
638*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %xor
639*9880d681SAndroid Build Coastguard Worker}
640*9880d681SAndroid Build Coastguard Worker
641*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test4c(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
642*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test4c:
643*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
644*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pand %xmm1, %xmm0
645*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
646*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
647*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
648*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
649*9880d681SAndroid Build Coastguard Worker;
650*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test4c:
651*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
652*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pand %xmm1, %xmm0
653*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
654*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
655*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
656*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
657*9880d681SAndroid Build Coastguard Worker;
658*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test4c:
659*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
660*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pand %xmm1, %xmm0
661*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7]
662*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
663*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
664*9880d681SAndroid Build Coastguard Worker;
665*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test4c:
666*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
667*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
668*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7]
669*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
670*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
671*9880d681SAndroid Build Coastguard Worker;
672*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test4c:
673*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
674*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
675*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3]
676*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
677*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
678*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 0, i32 2, i32 5, i32 7>
679*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 0, i32 2, i32 5, i32 7>
680*9880d681SAndroid Build Coastguard Worker  %and = and <4 x i32> %shuf1, %shuf2
681*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %and
682*9880d681SAndroid Build Coastguard Worker}
683*9880d681SAndroid Build Coastguard Worker
684*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test5c(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
685*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test5c:
686*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
687*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    por %xmm1, %xmm0
688*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
689*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
690*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
691*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
692*9880d681SAndroid Build Coastguard Worker;
693*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test5c:
694*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
695*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    por %xmm1, %xmm0
696*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
697*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
698*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
699*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
700*9880d681SAndroid Build Coastguard Worker;
701*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test5c:
702*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
703*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    por %xmm1, %xmm0
704*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7]
705*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
706*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
707*9880d681SAndroid Build Coastguard Worker;
708*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test5c:
709*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
710*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
711*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7]
712*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
713*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
714*9880d681SAndroid Build Coastguard Worker;
715*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test5c:
716*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
717*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
718*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3]
719*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
720*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
721*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 0, i32 2, i32 5, i32 7>
722*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 0, i32 2, i32 5, i32 7>
723*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
724*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
725*9880d681SAndroid Build Coastguard Worker}
726*9880d681SAndroid Build Coastguard Worker
727*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test6c(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) {
728*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test6c:
729*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
730*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm1, %xmm0
731*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
732*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pxor %xmm0, %xmm0
733*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
734*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
735*9880d681SAndroid Build Coastguard Worker;
736*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test6c:
737*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
738*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pxor %xmm1, %xmm0
739*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3]
740*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pxor %xmm0, %xmm0
741*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
742*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
743*9880d681SAndroid Build Coastguard Worker;
744*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test6c:
745*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
746*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm1, %xmm0
747*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3]
748*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm0, %xmm0
749*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
750*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
751*9880d681SAndroid Build Coastguard Worker;
752*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test6c:
753*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
754*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
755*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
756*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
757*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
758*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
759*9880d681SAndroid Build Coastguard Worker;
760*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test6c:
761*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
762*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
763*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,3]
764*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
765*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
766*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
767*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 0, i32 2, i32 5, i32 7>
768*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 0, i32 2, i32 5, i32 7>
769*9880d681SAndroid Build Coastguard Worker  %xor = xor <4 x i32> %shuf1, %shuf2
770*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %xor
771*9880d681SAndroid Build Coastguard Worker}
772*9880d681SAndroid Build Coastguard Worker
773*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test1(<4 x i32> %A, <4 x i32> %B) {
774*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test1:
775*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
776*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,0,1]
777*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
778*9880d681SAndroid Build Coastguard Worker;
779*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test1:
780*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
781*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,1,0,1]
782*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
783*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 4, i32 3, i32 1>
784*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 4, i32 0, i32 3>
785*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
786*9880d681SAndroid Build Coastguard Worker}
787*9880d681SAndroid Build Coastguard Worker
788*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test2(<4 x i32> %A, <4 x i32> %B) {
789*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test2:
790*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
791*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,1,0,3]
792*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
793*9880d681SAndroid Build Coastguard Worker;
794*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test2:
795*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
796*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,1,0,3]
797*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
798*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 5, i32 2, i32 3>
799*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 4, i32 0, i32 3>
800*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
801*9880d681SAndroid Build Coastguard Worker}
802*9880d681SAndroid Build Coastguard Worker
803*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test3(<4 x i32> %A, <4 x i32> %B) {
804*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test3:
805*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
806*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,1,0,3]
807*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
808*9880d681SAndroid Build Coastguard Worker;
809*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test3:
810*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
811*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,1,0,3]
812*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
813*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 6, i32 2, i32 3>
814*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 4, i32 0, i32 3>
815*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
816*9880d681SAndroid Build Coastguard Worker}
817*9880d681SAndroid Build Coastguard Worker
818*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test4(<4 x i32> %A, <4 x i32> %B) {
819*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test4:
820*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
821*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
822*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
823*9880d681SAndroid Build Coastguard Worker;
824*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test4:
825*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
826*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
827*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
828*9880d681SAndroid Build Coastguard Worker;
829*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test4:
830*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
831*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpbroadcastq %xmm0, %xmm0
832*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
833*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 4, i32 7, i32 1>
834*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 4, i32 4, i32 0, i32 3>
835*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
836*9880d681SAndroid Build Coastguard Worker}
837*9880d681SAndroid Build Coastguard Worker
838*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test5(<4 x i32> %A, <4 x i32> %B) {
839*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test5:
840*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
841*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
842*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
843*9880d681SAndroid Build Coastguard Worker;
844*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test5:
845*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
846*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
847*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
848*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 5, i32 5, i32 2, i32 3>
849*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 4, i32 4, i32 3>
850*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
851*9880d681SAndroid Build Coastguard Worker}
852*9880d681SAndroid Build Coastguard Worker
853*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test6(<4 x i32> %A, <4 x i32> %B) {
854*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test6:
855*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
856*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
857*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
858*9880d681SAndroid Build Coastguard Worker;
859*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test6:
860*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
861*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
862*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
863*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 6, i32 2, i32 4>
864*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 4, i32 0, i32 4>
865*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
866*9880d681SAndroid Build Coastguard Worker}
867*9880d681SAndroid Build Coastguard Worker
868*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test7(<4 x i32> %A, <4 x i32> %B) {
869*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test7:
870*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
871*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,0,2]
872*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
873*9880d681SAndroid Build Coastguard Worker;
874*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test7:
875*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
876*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,0,2]
877*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
878*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
879*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 0, i32 2>
880*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
881*9880d681SAndroid Build Coastguard Worker}
882*9880d681SAndroid Build Coastguard Worker
883*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test8(<4 x i32> %A, <4 x i32> %B) {
884*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test8:
885*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
886*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
887*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
888*9880d681SAndroid Build Coastguard Worker;
889*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test8:
890*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
891*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
892*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
893*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
894*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 4, i32 3, i32 4>
895*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
896*9880d681SAndroid Build Coastguard Worker}
897*9880d681SAndroid Build Coastguard Worker
898*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test9(<4 x i32> %A, <4 x i32> %B) {
899*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test9:
900*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
901*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,2]
902*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
903*9880d681SAndroid Build Coastguard Worker;
904*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test9:
905*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
906*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,2]
907*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
908*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 1, i32 3, i32 2, i32 5>
909*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 4, i32 2>
910*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
911*9880d681SAndroid Build Coastguard Worker}
912*9880d681SAndroid Build Coastguard Worker
913*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test10(<4 x i32> %A, <4 x i32> %B) {
914*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test10:
915*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
916*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,3]
917*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
918*9880d681SAndroid Build Coastguard Worker;
919*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test10:
920*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
921*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,3]
922*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
923*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 1, i32 1, i32 5, i32 5>
924*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 4>
925*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
926*9880d681SAndroid Build Coastguard Worker}
927*9880d681SAndroid Build Coastguard Worker
928*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test11(<4 x i32> %A, <4 x i32> %B) {
929*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test11:
930*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
931*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,1]
932*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
933*9880d681SAndroid Build Coastguard Worker;
934*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test11:
935*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
936*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,1]
937*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
938*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 1, i32 2, i32 5, i32 4>
939*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 0>
940*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
941*9880d681SAndroid Build Coastguard Worker}
942*9880d681SAndroid Build Coastguard Worker
943*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test12(<4 x i32> %A, <4 x i32> %B) {
944*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test12:
945*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
946*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
947*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
948*9880d681SAndroid Build Coastguard Worker;
949*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test12:
950*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
951*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
952*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
953*9880d681SAndroid Build Coastguard Worker;
954*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test12:
955*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
956*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpbroadcastq %xmm0, %xmm0
957*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
958*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 0, i32 2, i32 4>
959*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 4, i32 0, i32 4>
960*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
961*9880d681SAndroid Build Coastguard Worker}
962*9880d681SAndroid Build Coastguard Worker
963*9880d681SAndroid Build Coastguard Worker; The following pair of shuffles is folded into vector %A.
964*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test13(<4 x i32> %A, <4 x i32> %B) {
965*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_nested_undef_test13:
966*9880d681SAndroid Build Coastguard Worker; ALL:       # BB#0:
967*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
968*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 1, i32 4, i32 2, i32 6>
969*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 4, i32 0, i32 2, i32 4>
970*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
971*9880d681SAndroid Build Coastguard Worker}
972*9880d681SAndroid Build Coastguard Worker
973*9880d681SAndroid Build Coastguard Worker; The following pair of shuffles is folded into vector %B.
974*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test14(<4 x i32> %A, <4 x i32> %B) {
975*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test14:
976*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
977*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
978*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
979*9880d681SAndroid Build Coastguard Worker;
980*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test14:
981*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
982*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovaps %xmm1, %xmm0
983*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
984*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 6, i32 2, i32 4>
985*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 4, i32 1, i32 4>
986*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
987*9880d681SAndroid Build Coastguard Worker}
988*9880d681SAndroid Build Coastguard Worker
989*9880d681SAndroid Build Coastguard Worker
990*9880d681SAndroid Build Coastguard Worker; Verify that we don't optimize the following cases. We expect more than one shuffle.
991*9880d681SAndroid Build Coastguard Worker;
992*9880d681SAndroid Build Coastguard Worker; FIXME: Many of these already don't make sense, and the rest should stop
993*9880d681SAndroid Build Coastguard Worker; making sense with th enew vector shuffle lowering. Revisit at least testing for
994*9880d681SAndroid Build Coastguard Worker; it.
995*9880d681SAndroid Build Coastguard Worker
996*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test15(<4 x i32> %A, <4 x i32> %B) {
997*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_nested_undef_test15:
998*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
999*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
1000*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[0,1]
1001*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
1002*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1003*9880d681SAndroid Build Coastguard Worker;
1004*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_nested_undef_test15:
1005*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1006*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
1007*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[0,1]
1008*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm1, %xmm0
1009*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1010*9880d681SAndroid Build Coastguard Worker;
1011*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_nested_undef_test15:
1012*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1013*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
1014*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,0,1]
1015*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
1016*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1017*9880d681SAndroid Build Coastguard Worker;
1018*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test15:
1019*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1020*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
1021*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,1,0,1]
1022*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
1023*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1024*9880d681SAndroid Build Coastguard Worker;
1025*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test15:
1026*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1027*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpbroadcastd %xmm1, %xmm1
1028*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,1,0,1]
1029*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
1030*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1031*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 4, i32 3, i32 1>
1032*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 0, i32 3>
1033*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1034*9880d681SAndroid Build Coastguard Worker}
1035*9880d681SAndroid Build Coastguard Worker
1036*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test16(<4 x i32> %A, <4 x i32> %B) {
1037*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_nested_undef_test16:
1038*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1039*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1040*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,2,3]
1041*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1042*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1043*9880d681SAndroid Build Coastguard Worker;
1044*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_nested_undef_test16:
1045*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1046*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
1047*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,2,3]
1048*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1049*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1050*9880d681SAndroid Build Coastguard Worker;
1051*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_nested_undef_test16:
1052*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1053*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1054*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1055*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1056*9880d681SAndroid Build Coastguard Worker;
1057*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test16:
1058*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1059*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1060*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1061*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1062*9880d681SAndroid Build Coastguard Worker;
1063*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test16:
1064*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1065*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
1066*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1067*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1068*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
1069*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 0, i32 3>
1070*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1071*9880d681SAndroid Build Coastguard Worker}
1072*9880d681SAndroid Build Coastguard Worker
1073*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test17(<4 x i32> %A, <4 x i32> %B) {
1074*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_nested_undef_test17:
1075*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1076*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[1,0]
1077*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1],xmm1[0,2]
1078*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1079*9880d681SAndroid Build Coastguard Worker;
1080*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_nested_undef_test17:
1081*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1082*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[1,0]
1083*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1],xmm1[0,2]
1084*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1085*9880d681SAndroid Build Coastguard Worker;
1086*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_nested_undef_test17:
1087*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1088*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]
1089*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,0,1]
1090*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1091*9880d681SAndroid Build Coastguard Worker;
1092*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test17:
1093*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1094*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]
1095*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,1,0,1]
1096*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1097*9880d681SAndroid Build Coastguard Worker;
1098*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test17:
1099*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1100*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1101*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[3,1,0,1]
1102*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1103*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 1, i32 3, i32 1>
1104*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 0, i32 3>
1105*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1106*9880d681SAndroid Build Coastguard Worker}
1107*9880d681SAndroid Build Coastguard Worker
1108*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test18(<4 x i32> %A, <4 x i32> %B) {
1109*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test18:
1110*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1111*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,0,3]
1112*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1113*9880d681SAndroid Build Coastguard Worker;
1114*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test18:
1115*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1116*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[1,1,0,3]
1117*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1118*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 5, i32 2, i32 7>
1119*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 0, i32 3>
1120*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1121*9880d681SAndroid Build Coastguard Worker}
1122*9880d681SAndroid Build Coastguard Worker
1123*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test19(<4 x i32> %A, <4 x i32> %B) {
1124*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_nested_undef_test19:
1125*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1126*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1127*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,0,0,0]
1128*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1129*9880d681SAndroid Build Coastguard Worker;
1130*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_nested_undef_test19:
1131*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1132*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1133*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,0,0,0]
1134*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1135*9880d681SAndroid Build Coastguard Worker;
1136*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_nested_undef_test19:
1137*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1138*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
1139*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,0,0]
1140*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1141*9880d681SAndroid Build Coastguard Worker;
1142*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test19:
1143*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1144*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
1145*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,0,0,0]
1146*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1147*9880d681SAndroid Build Coastguard Worker;
1148*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test19:
1149*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1150*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
1151*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,0,0,0]
1152*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1153*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 4, i32 5, i32 6>
1154*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 0, i32 0>
1155*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1156*9880d681SAndroid Build Coastguard Worker}
1157*9880d681SAndroid Build Coastguard Worker
1158*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test20(<4 x i32> %A, <4 x i32> %B) {
1159*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_nested_undef_test20:
1160*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1161*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,3]
1162*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2,3,1]
1163*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
1164*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1165*9880d681SAndroid Build Coastguard Worker;
1166*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_nested_undef_test20:
1167*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1168*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,3]
1169*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2,3,1]
1170*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm1, %xmm0
1171*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1172*9880d681SAndroid Build Coastguard Worker;
1173*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_nested_undef_test20:
1174*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1175*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1176*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,3,0]
1177*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1178*9880d681SAndroid Build Coastguard Worker;
1179*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test20:
1180*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1181*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
1182*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,3,0]
1183*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1184*9880d681SAndroid Build Coastguard Worker;
1185*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test20:
1186*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1187*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3]
1188*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,3,0]
1189*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1190*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 3, i32 2, i32 4, i32 4>
1191*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 0, i32 3>
1192*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1193*9880d681SAndroid Build Coastguard Worker}
1194*9880d681SAndroid Build Coastguard Worker
1195*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test21(<4 x i32> %A, <4 x i32> %B) {
1196*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_nested_undef_test21:
1197*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1198*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1199*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,3,0,3]
1200*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1201*9880d681SAndroid Build Coastguard Worker;
1202*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_nested_undef_test21:
1203*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1204*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1205*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,3,0,3]
1206*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1207*9880d681SAndroid Build Coastguard Worker;
1208*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_nested_undef_test21:
1209*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1210*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]
1211*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1212*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1213*9880d681SAndroid Build Coastguard Worker;
1214*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test21:
1215*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1216*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]
1217*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1218*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1219*9880d681SAndroid Build Coastguard Worker;
1220*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test21:
1221*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1222*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]
1223*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpbroadcastq %xmm0, %xmm0
1224*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1225*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 1, i32 3, i32 1>
1226*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 3>
1227*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1228*9880d681SAndroid Build Coastguard Worker}
1229*9880d681SAndroid Build Coastguard Worker
1230*9880d681SAndroid Build Coastguard Worker
1231*9880d681SAndroid Build Coastguard Worker; Test that we correctly combine shuffles according to rule
1232*9880d681SAndroid Build Coastguard Worker;  shuffle(shuffle(x, y), undef) -> shuffle(y, undef)
1233*9880d681SAndroid Build Coastguard Worker
1234*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test22(<4 x i32> %A, <4 x i32> %B) {
1235*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test22:
1236*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1237*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,3]
1238*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1239*9880d681SAndroid Build Coastguard Worker;
1240*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test22:
1241*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1242*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[1,1,1,3]
1243*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1244*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 5, i32 2, i32 7>
1245*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 3>
1246*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1247*9880d681SAndroid Build Coastguard Worker}
1248*9880d681SAndroid Build Coastguard Worker
1249*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test23(<4 x i32> %A, <4 x i32> %B) {
1250*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test23:
1251*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1252*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,1,0,3]
1253*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1254*9880d681SAndroid Build Coastguard Worker;
1255*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test23:
1256*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1257*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[0,1,0,3]
1258*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1259*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 5, i32 2, i32 7>
1260*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 3>
1261*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1262*9880d681SAndroid Build Coastguard Worker}
1263*9880d681SAndroid Build Coastguard Worker
1264*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test24(<4 x i32> %A, <4 x i32> %B) {
1265*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test24:
1266*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1267*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,3,2,3]
1268*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1269*9880d681SAndroid Build Coastguard Worker;
1270*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test24:
1271*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1272*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[0,3,2,3]
1273*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1274*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 1, i32 6, i32 7>
1275*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 3, i32 2, i32 4>
1276*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1277*9880d681SAndroid Build Coastguard Worker}
1278*9880d681SAndroid Build Coastguard Worker
1279*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test25(<4 x i32> %A, <4 x i32> %B) {
1280*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test25:
1281*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1282*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1283*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1284*9880d681SAndroid Build Coastguard Worker;
1285*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test25:
1286*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1287*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1288*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1289*9880d681SAndroid Build Coastguard Worker;
1290*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test25:
1291*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1292*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpbroadcastq %xmm0, %xmm0
1293*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1294*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %B, <4 x i32> %A, <4 x i32> <i32 1, i32 5, i32 2, i32 4>
1295*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 1, i32 3, i32 1>
1296*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1297*9880d681SAndroid Build Coastguard Worker}
1298*9880d681SAndroid Build Coastguard Worker
1299*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test26(<4 x i32> %A, <4 x i32> %B) {
1300*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test26:
1301*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1302*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1303*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1304*9880d681SAndroid Build Coastguard Worker;
1305*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test26:
1306*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1307*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
1308*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1309*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %B, <4 x i32> %A, <4 x i32> <i32 1, i32 2, i32 6, i32 7>
1310*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 2, i32 3>
1311*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1312*9880d681SAndroid Build Coastguard Worker}
1313*9880d681SAndroid Build Coastguard Worker
1314*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test27(<4 x i32> %A, <4 x i32> %B) {
1315*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test27:
1316*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1317*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1318*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1319*9880d681SAndroid Build Coastguard Worker;
1320*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test27:
1321*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1322*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1323*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1324*9880d681SAndroid Build Coastguard Worker;
1325*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test27:
1326*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1327*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpbroadcastq %xmm0, %xmm0
1328*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1329*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %B, <4 x i32> %A, <4 x i32> <i32 2, i32 1, i32 5, i32 4>
1330*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 3, i32 2>
1331*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1332*9880d681SAndroid Build Coastguard Worker}
1333*9880d681SAndroid Build Coastguard Worker
1334*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test28(<4 x i32> %A, <4 x i32> %B) {
1335*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test28:
1336*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1337*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,1,0]
1338*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1339*9880d681SAndroid Build Coastguard Worker;
1340*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test28:
1341*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1342*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,0]
1343*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1344*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %B, <4 x i32> %A, <4 x i32> <i32 1, i32 2, i32 4, i32 5>
1345*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 3, i32 2>
1346*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1347*9880d681SAndroid Build Coastguard Worker}
1348*9880d681SAndroid Build Coastguard Worker
1349*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test1(<4 x float> %a, <4 x float> %b) {
1350*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test1:
1351*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1352*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
1353*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1354*9880d681SAndroid Build Coastguard Worker;
1355*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test1:
1356*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1357*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovaps %xmm1, %xmm0
1358*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1359*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
1360*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
1361*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1362*9880d681SAndroid Build Coastguard Worker}
1363*9880d681SAndroid Build Coastguard Worker
1364*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test2(<4 x float> %a, <4 x float> %b) {
1365*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test2:
1366*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1367*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1368*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
1369*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1370*9880d681SAndroid Build Coastguard Worker;
1371*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test2:
1372*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1373*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1374*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm1, %xmm0
1375*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1376*9880d681SAndroid Build Coastguard Worker;
1377*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test2:
1378*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1379*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1380*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1381*9880d681SAndroid Build Coastguard Worker;
1382*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test2:
1383*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1384*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1385*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1386*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
1387*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 3>
1388*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1389*9880d681SAndroid Build Coastguard Worker}
1390*9880d681SAndroid Build Coastguard Worker
1391*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test3(<4 x float> %a, <4 x float> %b) {
1392*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test3:
1393*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1394*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1395*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1396*9880d681SAndroid Build Coastguard Worker;
1397*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test3:
1398*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1399*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1400*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1401*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
1402*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 1>
1403*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1404*9880d681SAndroid Build Coastguard Worker}
1405*9880d681SAndroid Build Coastguard Worker
1406*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test4(<4 x float> %a, <4 x float> %b) {
1407*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test4:
1408*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1409*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]
1410*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
1411*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1412*9880d681SAndroid Build Coastguard Worker;
1413*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test4:
1414*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1415*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1]
1416*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1417*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 3, i32 5, i32 5>
1418*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
1419*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1420*9880d681SAndroid Build Coastguard Worker}
1421*9880d681SAndroid Build Coastguard Worker
1422*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test5(<4 x float> %a, <4 x float> %b) {
1423*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test5:
1424*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1425*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0]
1426*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1427*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1428*9880d681SAndroid Build Coastguard Worker;
1429*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test5:
1430*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1431*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0]
1432*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1433*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1434*9880d681SAndroid Build Coastguard Worker;
1435*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test5:
1436*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1437*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]
1438*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1439*9880d681SAndroid Build Coastguard Worker;
1440*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test5:
1441*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1442*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]
1443*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1444*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
1445*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
1446*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1447*9880d681SAndroid Build Coastguard Worker}
1448*9880d681SAndroid Build Coastguard Worker
1449*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test6(<4 x i32> %a, <4 x i32> %b) {
1450*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test6:
1451*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1452*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
1453*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1454*9880d681SAndroid Build Coastguard Worker;
1455*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test6:
1456*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1457*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovaps %xmm1, %xmm0
1458*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1459*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
1460*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
1461*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1462*9880d681SAndroid Build Coastguard Worker}
1463*9880d681SAndroid Build Coastguard Worker
1464*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test7(<4 x i32> %a, <4 x i32> %b) {
1465*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test7:
1466*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1467*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1468*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
1469*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1470*9880d681SAndroid Build Coastguard Worker;
1471*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test7:
1472*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1473*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1474*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm1, %xmm0
1475*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1476*9880d681SAndroid Build Coastguard Worker;
1477*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test7:
1478*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1479*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1480*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1481*9880d681SAndroid Build Coastguard Worker;
1482*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test7:
1483*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1484*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1485*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1486*9880d681SAndroid Build Coastguard Worker;
1487*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test7:
1488*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1489*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1490*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1491*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
1492*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 3>
1493*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1494*9880d681SAndroid Build Coastguard Worker}
1495*9880d681SAndroid Build Coastguard Worker
1496*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test8(<4 x i32> %a, <4 x i32> %b) {
1497*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test8:
1498*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1499*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1500*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1501*9880d681SAndroid Build Coastguard Worker;
1502*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test8:
1503*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1504*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1505*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1506*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
1507*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 1>
1508*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1509*9880d681SAndroid Build Coastguard Worker}
1510*9880d681SAndroid Build Coastguard Worker
1511*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test9(<4 x i32> %a, <4 x i32> %b) {
1512*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test9:
1513*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1514*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1]
1515*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm1, %xmm0
1516*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1517*9880d681SAndroid Build Coastguard Worker;
1518*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test9:
1519*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1520*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1]
1521*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1522*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 3, i32 5, i32 5>
1523*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
1524*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1525*9880d681SAndroid Build Coastguard Worker}
1526*9880d681SAndroid Build Coastguard Worker
1527*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test10(<4 x i32> %a, <4 x i32> %b) {
1528*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test10:
1529*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1530*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0]
1531*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1532*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1533*9880d681SAndroid Build Coastguard Worker;
1534*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test10:
1535*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1536*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0]
1537*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1538*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1539*9880d681SAndroid Build Coastguard Worker;
1540*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test10:
1541*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1542*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]
1543*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1544*9880d681SAndroid Build Coastguard Worker;
1545*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test10:
1546*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1547*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]
1548*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1549*9880d681SAndroid Build Coastguard Worker;
1550*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test10:
1551*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1552*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]
1553*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1554*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
1555*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
1556*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1557*9880d681SAndroid Build Coastguard Worker}
1558*9880d681SAndroid Build Coastguard Worker
1559*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test11(<4 x float> %a, <4 x float> %b) {
1560*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_test11:
1561*9880d681SAndroid Build Coastguard Worker; ALL:       # BB#0:
1562*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
1563*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
1564*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
1565*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1566*9880d681SAndroid Build Coastguard Worker}
1567*9880d681SAndroid Build Coastguard Worker
1568*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test12(<4 x float> %a, <4 x float> %b) {
1569*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test12:
1570*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1571*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1572*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
1573*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1574*9880d681SAndroid Build Coastguard Worker;
1575*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test12:
1576*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1577*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1578*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm1, %xmm0
1579*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1580*9880d681SAndroid Build Coastguard Worker;
1581*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test12:
1582*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1583*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1584*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1585*9880d681SAndroid Build Coastguard Worker;
1586*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test12:
1587*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1588*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1589*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1590*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1591*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
1592*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1593*9880d681SAndroid Build Coastguard Worker}
1594*9880d681SAndroid Build Coastguard Worker
1595*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test13(<4 x float> %a, <4 x float> %b) {
1596*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test13:
1597*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1598*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1599*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1600*9880d681SAndroid Build Coastguard Worker;
1601*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test13:
1602*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1603*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1604*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1605*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
1606*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 4, i32 5, i32 2, i32 3>
1607*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1608*9880d681SAndroid Build Coastguard Worker}
1609*9880d681SAndroid Build Coastguard Worker
1610*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test14(<4 x float> %a, <4 x float> %b) {
1611*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test14:
1612*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1613*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
1614*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1615*9880d681SAndroid Build Coastguard Worker;
1616*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test14:
1617*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1618*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
1619*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1620*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 6, i32 7, i32 5, i32 5>
1621*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
1622*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1623*9880d681SAndroid Build Coastguard Worker}
1624*9880d681SAndroid Build Coastguard Worker
1625*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test15(<4 x float> %a, <4 x float> %b) {
1626*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test15:
1627*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1628*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0]
1629*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1630*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1631*9880d681SAndroid Build Coastguard Worker;
1632*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test15:
1633*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1634*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0]
1635*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1636*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1637*9880d681SAndroid Build Coastguard Worker;
1638*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test15:
1639*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1640*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]
1641*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1642*9880d681SAndroid Build Coastguard Worker;
1643*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test15:
1644*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1645*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]
1646*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1647*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 7>
1648*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 2, i32 3>
1649*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1650*9880d681SAndroid Build Coastguard Worker}
1651*9880d681SAndroid Build Coastguard Worker
1652*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test16(<4 x i32> %a, <4 x i32> %b) {
1653*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_test16:
1654*9880d681SAndroid Build Coastguard Worker; ALL:       # BB#0:
1655*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
1656*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
1657*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %a, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
1658*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1659*9880d681SAndroid Build Coastguard Worker}
1660*9880d681SAndroid Build Coastguard Worker
1661*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test17(<4 x i32> %a, <4 x i32> %b) {
1662*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test17:
1663*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1664*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1665*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
1666*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1667*9880d681SAndroid Build Coastguard Worker;
1668*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test17:
1669*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1670*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
1671*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm1, %xmm0
1672*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1673*9880d681SAndroid Build Coastguard Worker;
1674*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test17:
1675*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1676*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1677*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1678*9880d681SAndroid Build Coastguard Worker;
1679*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test17:
1680*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1681*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1682*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1683*9880d681SAndroid Build Coastguard Worker;
1684*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test17:
1685*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1686*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1687*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1688*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 7>
1689*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
1690*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1691*9880d681SAndroid Build Coastguard Worker}
1692*9880d681SAndroid Build Coastguard Worker
1693*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test18(<4 x i32> %a, <4 x i32> %b) {
1694*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test18:
1695*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1696*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1697*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1698*9880d681SAndroid Build Coastguard Worker;
1699*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test18:
1700*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1701*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1702*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1703*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
1704*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %a, <4 x i32> <i32 4, i32 5, i32 2, i32 3>
1705*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1706*9880d681SAndroid Build Coastguard Worker}
1707*9880d681SAndroid Build Coastguard Worker
1708*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test19(<4 x i32> %a, <4 x i32> %b) {
1709*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test19:
1710*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1711*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
1712*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1713*9880d681SAndroid Build Coastguard Worker;
1714*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test19:
1715*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1716*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
1717*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1718*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 5, i32 5>
1719*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %a, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
1720*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1721*9880d681SAndroid Build Coastguard Worker}
1722*9880d681SAndroid Build Coastguard Worker
1723*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test20(<4 x i32> %a, <4 x i32> %b) {
1724*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test20:
1725*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1726*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0]
1727*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1728*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1729*9880d681SAndroid Build Coastguard Worker;
1730*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test20:
1731*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1732*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0]
1733*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1734*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1735*9880d681SAndroid Build Coastguard Worker;
1736*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test20:
1737*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1738*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]
1739*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1740*9880d681SAndroid Build Coastguard Worker;
1741*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test20:
1742*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1743*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]
1744*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1745*9880d681SAndroid Build Coastguard Worker;
1746*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test20:
1747*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1748*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]
1749*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1750*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 7>
1751*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %a, <4 x i32> <i32 0, i32 5, i32 2, i32 3>
1752*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1753*9880d681SAndroid Build Coastguard Worker}
1754*9880d681SAndroid Build Coastguard Worker
1755*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test21(<8 x i32> %a, <4 x i32>* %ptr) {
1756*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test21:
1757*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1758*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm0, %xmm2
1759*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
1760*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
1761*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm2, (%rdi)
1762*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1763*9880d681SAndroid Build Coastguard Worker;
1764*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test21:
1765*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1766*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1767*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm0[0],xmm1[0]
1768*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
1769*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vmovdqa %xmm2, (%rdi)
1770*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vzeroupper
1771*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1772*9880d681SAndroid Build Coastguard Worker;
1773*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test21:
1774*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1775*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1776*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm0[0],xmm1[0]
1777*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
1778*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vmovdqa %xmm2, (%rdi)
1779*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vzeroupper
1780*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1781*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <8 x i32> %a, <8 x i32> %a, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
1782*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <8 x i32> %a, <8 x i32> %a, <4 x i32> <i32 2, i32 3, i32 6, i32 7>
1783*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %1, <4 x i32>* %ptr, align 16
1784*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
1785*9880d681SAndroid Build Coastguard Worker}
1786*9880d681SAndroid Build Coastguard Worker
1787*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @combine_test22(<2 x float>* %a, <2 x float>* %b) {
1788*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test22:
1789*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1790*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1791*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movhpd {{.*#+}} xmm0 = xmm0[0],mem[0]
1792*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1793*9880d681SAndroid Build Coastguard Worker;
1794*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test22:
1795*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1796*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovq {{.*#+}} xmm0 = mem[0],zero
1797*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovhpd {{.*#+}} xmm0 = xmm0[0],mem[0]
1798*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1799*9880d681SAndroid Build Coastguard Worker; Current AVX2 lowering of this is still awful, not adding a test case.
1800*9880d681SAndroid Build Coastguard Worker  %1 = load <2 x float>, <2 x float>* %a, align 8
1801*9880d681SAndroid Build Coastguard Worker  %2 = load <2 x float>, <2 x float>* %b, align 8
1802*9880d681SAndroid Build Coastguard Worker  %3 = shufflevector <2 x float> %1, <2 x float> %2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
1803*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %3
1804*9880d681SAndroid Build Coastguard Worker}
1805*9880d681SAndroid Build Coastguard Worker
1806*9880d681SAndroid Build Coastguard Worker; PR22359
1807*9880d681SAndroid Build Coastguard Workerdefine void @combine_test23(<8 x float> %v, <2 x float>* %ptr) {
1808*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test23:
1809*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1810*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movups %xmm0, (%rdi)
1811*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1812*9880d681SAndroid Build Coastguard Worker;
1813*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test23:
1814*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1815*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
1816*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vinsertps {{.*#+}} xmm1 = xmm0[0,1],xmm1[0],xmm0[3]
1817*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3]
1818*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovups %xmm0, (%rdi)
1819*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vzeroupper
1820*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1821*9880d681SAndroid Build Coastguard Worker  %idx2 = getelementptr inbounds <2 x float>, <2 x float>* %ptr, i64 1
1822*9880d681SAndroid Build Coastguard Worker  %shuffle0 = shufflevector <8 x float> %v, <8 x float> undef, <2 x i32> <i32 0, i32 1>
1823*9880d681SAndroid Build Coastguard Worker  %shuffle1 = shufflevector <8 x float> %v, <8 x float> undef, <2 x i32> <i32 2, i32 3>
1824*9880d681SAndroid Build Coastguard Worker  store <2 x float> %shuffle0, <2 x float>* %ptr, align 8
1825*9880d681SAndroid Build Coastguard Worker  store <2 x float> %shuffle1, <2 x float>* %idx2, align 8
1826*9880d681SAndroid Build Coastguard Worker  ret void
1827*9880d681SAndroid Build Coastguard Worker}
1828*9880d681SAndroid Build Coastguard Worker
1829*9880d681SAndroid Build Coastguard Worker; Check some negative cases.
1830*9880d681SAndroid Build Coastguard Worker; FIXME: Do any of these really make sense? Are they redundant with the above tests?
1831*9880d681SAndroid Build Coastguard Worker
1832*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test1b(<4 x float> %a, <4 x float> %b) {
1833*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test1b:
1834*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1835*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1,2,0]
1836*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
1837*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1838*9880d681SAndroid Build Coastguard Worker;
1839*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test1b:
1840*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1841*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm1[0,1,2,0]
1842*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1843*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
1844*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 0>
1845*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1846*9880d681SAndroid Build Coastguard Worker}
1847*9880d681SAndroid Build Coastguard Worker
1848*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test2b(<4 x float> %a, <4 x float> %b) {
1849*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test2b:
1850*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1851*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0,0]
1852*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
1853*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1854*9880d681SAndroid Build Coastguard Worker;
1855*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test2b:
1856*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1857*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movddup {{.*#+}} xmm0 = xmm1[0,0]
1858*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1859*9880d681SAndroid Build Coastguard Worker;
1860*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test2b:
1861*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1862*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movddup {{.*#+}} xmm0 = xmm1[0,0]
1863*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1864*9880d681SAndroid Build Coastguard Worker;
1865*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test2b:
1866*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1867*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovddup {{.*#+}} xmm0 = xmm1[0,0]
1868*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1869*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
1870*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 0, i32 5>
1871*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1872*9880d681SAndroid Build Coastguard Worker}
1873*9880d681SAndroid Build Coastguard Worker
1874*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test3b(<4 x float> %a, <4 x float> %b) {
1875*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test3b:
1876*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1877*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
1878*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
1879*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1880*9880d681SAndroid Build Coastguard Worker;
1881*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test3b:
1882*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1883*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0]
1884*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
1885*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1886*9880d681SAndroid Build Coastguard Worker;
1887*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test3b:
1888*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1889*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1890*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,3,2,3]
1891*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1892*9880d681SAndroid Build Coastguard Worker;
1893*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test3b:
1894*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1895*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
1896*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,3,2,3]
1897*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1898*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 6, i32 3>
1899*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 7, i32 2, i32 7>
1900*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1901*9880d681SAndroid Build Coastguard Worker}
1902*9880d681SAndroid Build Coastguard Worker
1903*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test4b(<4 x float> %a, <4 x float> %b) {
1904*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test4b:
1905*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
1906*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1,2,3]
1907*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm1, %xmm0
1908*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
1909*9880d681SAndroid Build Coastguard Worker;
1910*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test4b:
1911*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
1912*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm1[1,1,2,3]
1913*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
1914*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
1915*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 5, i32 5, i32 2, i32 7>
1916*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
1917*9880d681SAndroid Build Coastguard Worker}
1918*9880d681SAndroid Build Coastguard Worker
1919*9880d681SAndroid Build Coastguard Worker
1920*9880d681SAndroid Build Coastguard Worker; Verify that we correctly fold shuffles even when we use illegal vector types.
1921*9880d681SAndroid Build Coastguard Worker
1922*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @combine_test1c(<4 x i8>* %a, <4 x i8>* %b) {
1923*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test1c:
1924*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1925*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1926*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1927*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1928*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1929*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1930*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1931*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1932*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1933*9880d681SAndroid Build Coastguard Worker;
1934*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test1c:
1935*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1936*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1937*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1938*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1939*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1940*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1941*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1942*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1943*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1944*9880d681SAndroid Build Coastguard Worker;
1945*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test1c:
1946*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1947*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1948*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1949*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]
1950*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
1951*9880d681SAndroid Build Coastguard Worker;
1952*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test1c:
1953*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
1954*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1955*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1956*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
1957*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
1958*9880d681SAndroid Build Coastguard Worker;
1959*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test1c:
1960*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
1961*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1962*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1963*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1964*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
1965*9880d681SAndroid Build Coastguard Worker  %A = load <4 x i8>, <4 x i8>* %a
1966*9880d681SAndroid Build Coastguard Worker  %B = load <4 x i8>, <4 x i8>* %b
1967*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i8> %A, <4 x i8> %B, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
1968*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i8> %1, <4 x i8> %B, <4 x i32> <i32 0, i32 1, i32 6, i32 3>
1969*9880d681SAndroid Build Coastguard Worker  ret <4 x i8> %2
1970*9880d681SAndroid Build Coastguard Worker}
1971*9880d681SAndroid Build Coastguard Worker
1972*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @combine_test2c(<4 x i8>* %a, <4 x i8>* %b) {
1973*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test2c:
1974*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
1975*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1976*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1977*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1978*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1979*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1980*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1981*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1982*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
1983*9880d681SAndroid Build Coastguard Worker;
1984*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test2c:
1985*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
1986*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1987*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1988*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1989*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
1990*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
1991*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1992*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1993*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
1994*9880d681SAndroid Build Coastguard Worker;
1995*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test2c:
1996*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
1997*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1998*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
1999*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2000*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2001*9880d681SAndroid Build Coastguard Worker;
2002*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test2c:
2003*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2004*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
2005*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
2006*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2007*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2008*9880d681SAndroid Build Coastguard Worker  %A = load <4 x i8>, <4 x i8>* %a
2009*9880d681SAndroid Build Coastguard Worker  %B = load <4 x i8>, <4 x i8>* %b
2010*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i8> %A, <4 x i8> %B, <4 x i32> <i32 0, i32 5, i32 1, i32 5>
2011*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i8> %1, <4 x i8> %B, <4 x i32> <i32 0, i32 2, i32 4, i32 1>
2012*9880d681SAndroid Build Coastguard Worker  ret <4 x i8> %2
2013*9880d681SAndroid Build Coastguard Worker}
2014*9880d681SAndroid Build Coastguard Worker
2015*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @combine_test3c(<4 x i8>* %a, <4 x i8>* %b) {
2016*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test3c:
2017*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2018*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2019*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2020*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2021*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2022*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2023*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2024*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
2025*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2026*9880d681SAndroid Build Coastguard Worker;
2027*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test3c:
2028*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2029*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2030*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2031*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2032*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2033*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2034*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2035*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
2036*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2037*9880d681SAndroid Build Coastguard Worker;
2038*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test3c:
2039*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2040*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
2041*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
2042*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1]
2043*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2044*9880d681SAndroid Build Coastguard Worker;
2045*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test3c:
2046*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2047*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
2048*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
2049*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1]
2050*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2051*9880d681SAndroid Build Coastguard Worker  %A = load <4 x i8>, <4 x i8>* %a
2052*9880d681SAndroid Build Coastguard Worker  %B = load <4 x i8>, <4 x i8>* %b
2053*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i8> %A, <4 x i8> %B, <4 x i32> <i32 2, i32 3, i32 5, i32 5>
2054*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i8> %1, <4 x i8> %B, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
2055*9880d681SAndroid Build Coastguard Worker  ret <4 x i8> %2
2056*9880d681SAndroid Build Coastguard Worker}
2057*9880d681SAndroid Build Coastguard Worker
2058*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @combine_test4c(<4 x i8>* %a, <4 x i8>* %b) {
2059*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test4c:
2060*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2061*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2062*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2063*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2064*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2065*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2066*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2067*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0]
2068*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
2069*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2070*9880d681SAndroid Build Coastguard Worker;
2071*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test4c:
2072*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2073*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2074*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2075*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
2076*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
2077*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
2078*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2079*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0]
2080*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
2081*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2082*9880d681SAndroid Build Coastguard Worker;
2083*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test4c:
2084*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2085*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
2086*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
2087*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
2088*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2089*9880d681SAndroid Build Coastguard Worker;
2090*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test4c:
2091*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
2092*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
2093*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
2094*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7]
2095*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
2096*9880d681SAndroid Build Coastguard Worker;
2097*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test4c:
2098*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
2099*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
2100*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
2101*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3]
2102*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
2103*9880d681SAndroid Build Coastguard Worker  %A = load <4 x i8>, <4 x i8>* %a
2104*9880d681SAndroid Build Coastguard Worker  %B = load <4 x i8>, <4 x i8>* %b
2105*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i8> %A, <4 x i8> %B, <4 x i32> <i32 4, i32 1, i32 6, i32 3>
2106*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i8> %1, <4 x i8> %B, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
2107*9880d681SAndroid Build Coastguard Worker  ret <4 x i8> %2
2108*9880d681SAndroid Build Coastguard Worker}
2109*9880d681SAndroid Build Coastguard Worker
2110*9880d681SAndroid Build Coastguard Worker
2111*9880d681SAndroid Build Coastguard Worker; The following test cases are generated from this C++ code
2112*9880d681SAndroid Build Coastguard Worker;
2113*9880d681SAndroid Build Coastguard Worker;__m128 blend_01(__m128 a, __m128 b)
2114*9880d681SAndroid Build Coastguard Worker;{
2115*9880d681SAndroid Build Coastguard Worker;  __m128 s = a;
2116*9880d681SAndroid Build Coastguard Worker;  s = _mm_blend_ps( s, b, 1<<0 );
2117*9880d681SAndroid Build Coastguard Worker;  s = _mm_blend_ps( s, b, 1<<1 );
2118*9880d681SAndroid Build Coastguard Worker;  return s;
2119*9880d681SAndroid Build Coastguard Worker;}
2120*9880d681SAndroid Build Coastguard Worker;
2121*9880d681SAndroid Build Coastguard Worker;__m128 blend_02(__m128 a, __m128 b)
2122*9880d681SAndroid Build Coastguard Worker;{
2123*9880d681SAndroid Build Coastguard Worker;  __m128 s = a;
2124*9880d681SAndroid Build Coastguard Worker;  s = _mm_blend_ps( s, b, 1<<0 );
2125*9880d681SAndroid Build Coastguard Worker;  s = _mm_blend_ps( s, b, 1<<2 );
2126*9880d681SAndroid Build Coastguard Worker;  return s;
2127*9880d681SAndroid Build Coastguard Worker;}
2128*9880d681SAndroid Build Coastguard Worker;
2129*9880d681SAndroid Build Coastguard Worker;__m128 blend_123(__m128 a, __m128 b)
2130*9880d681SAndroid Build Coastguard Worker;{
2131*9880d681SAndroid Build Coastguard Worker;  __m128 s = a;
2132*9880d681SAndroid Build Coastguard Worker;  s = _mm_blend_ps( s, b, 1<<1 );
2133*9880d681SAndroid Build Coastguard Worker;  s = _mm_blend_ps( s, b, 1<<2 );
2134*9880d681SAndroid Build Coastguard Worker;  s = _mm_blend_ps( s, b, 1<<3 );
2135*9880d681SAndroid Build Coastguard Worker;  return s;
2136*9880d681SAndroid Build Coastguard Worker;}
2137*9880d681SAndroid Build Coastguard Worker
2138*9880d681SAndroid Build Coastguard Worker; Ideally, we should collapse the following shuffles into a single one.
2139*9880d681SAndroid Build Coastguard Worker
2140*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_blend_01(<4 x float> %a, <4 x float> %b) {
2141*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_blend_01:
2142*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2143*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
2144*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2145*9880d681SAndroid Build Coastguard Worker;
2146*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_blend_01:
2147*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2148*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
2149*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2150*9880d681SAndroid Build Coastguard Worker;
2151*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_blend_01:
2152*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2153*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
2154*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2155*9880d681SAndroid Build Coastguard Worker;
2156*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_blend_01:
2157*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2158*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
2159*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2160*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 undef, i32 2, i32 3>
2161*9880d681SAndroid Build Coastguard Worker  %shuffle6 = shufflevector <4 x float> %shuffle, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 3>
2162*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %shuffle6
2163*9880d681SAndroid Build Coastguard Worker}
2164*9880d681SAndroid Build Coastguard Worker
2165*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_blend_02(<4 x float> %a, <4 x float> %b) {
2166*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_blend_02:
2167*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2168*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,3]
2169*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2,1,3]
2170*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
2171*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2172*9880d681SAndroid Build Coastguard Worker;
2173*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_blend_02:
2174*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2175*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,3]
2176*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2,1,3]
2177*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm1, %xmm0
2178*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2179*9880d681SAndroid Build Coastguard Worker;
2180*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_blend_02:
2181*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2182*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2],xmm0[3]
2183*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2184*9880d681SAndroid Build Coastguard Worker;
2185*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_blend_02:
2186*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2187*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2],xmm0[3]
2188*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2189*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 undef, i32 3>
2190*9880d681SAndroid Build Coastguard Worker  %shuffle6 = shufflevector <4 x float> %shuffle, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 3>
2191*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %shuffle6
2192*9880d681SAndroid Build Coastguard Worker}
2193*9880d681SAndroid Build Coastguard Worker
2194*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_blend_123(<4 x float> %a, <4 x float> %b) {
2195*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_blend_123:
2196*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2197*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
2198*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
2199*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2200*9880d681SAndroid Build Coastguard Worker;
2201*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_blend_123:
2202*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2203*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
2204*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm1, %xmm0
2205*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2206*9880d681SAndroid Build Coastguard Worker;
2207*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_blend_123:
2208*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2209*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
2210*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2211*9880d681SAndroid Build Coastguard Worker;
2212*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_blend_123:
2213*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2214*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
2215*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2216*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 undef, i32 undef>
2217*9880d681SAndroid Build Coastguard Worker  %shuffle6 = shufflevector <4 x float> %shuffle, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 undef>
2218*9880d681SAndroid Build Coastguard Worker  %shuffle12 = shufflevector <4 x float> %shuffle6, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
2219*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %shuffle12
2220*9880d681SAndroid Build Coastguard Worker}
2221*9880d681SAndroid Build Coastguard Worker
2222*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test_movhl_1(<4 x i32> %a, <4 x i32> %b) {
2223*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test_movhl_1:
2224*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2225*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1]
2226*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm1, %xmm0
2227*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2228*9880d681SAndroid Build Coastguard Worker;
2229*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test_movhl_1:
2230*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2231*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1]
2232*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2233*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 7, i32 5, i32 3>
2234*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 6, i32 1, i32 0, i32 3>
2235*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
2236*9880d681SAndroid Build Coastguard Worker}
2237*9880d681SAndroid Build Coastguard Worker
2238*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test_movhl_2(<4 x i32> %a, <4 x i32> %b) {
2239*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test_movhl_2:
2240*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2241*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1]
2242*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm1, %xmm0
2243*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2244*9880d681SAndroid Build Coastguard Worker;
2245*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test_movhl_2:
2246*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2247*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1]
2248*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2249*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 0, i32 3, i32 6>
2250*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 3, i32 7, i32 0, i32 2>
2251*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
2252*9880d681SAndroid Build Coastguard Worker}
2253*9880d681SAndroid Build Coastguard Worker
2254*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test_movhl_3(<4 x i32> %a, <4 x i32> %b) {
2255*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test_movhl_3:
2256*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2257*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1]
2258*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm1, %xmm0
2259*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2260*9880d681SAndroid Build Coastguard Worker;
2261*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test_movhl_3:
2262*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2263*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1]
2264*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2265*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 7, i32 6, i32 3, i32 2>
2266*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 6, i32 0, i32 3, i32 2>
2267*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %2
2268*9880d681SAndroid Build Coastguard Worker}
2269*9880d681SAndroid Build Coastguard Worker
2270*9880d681SAndroid Build Coastguard Worker
2271*9880d681SAndroid Build Coastguard Worker; Verify that we fold shuffles according to rule:
2272*9880d681SAndroid Build Coastguard Worker;  (shuffle(shuffle A, Undef, M0), B, M1) -> (shuffle A, B, M2)
2273*9880d681SAndroid Build Coastguard Worker
2274*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test1(<4 x float> %a, <4 x float> %b) {
2275*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test1:
2276*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2277*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
2278*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2279*9880d681SAndroid Build Coastguard Worker;
2280*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test1:
2281*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2282*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
2283*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2284*9880d681SAndroid Build Coastguard Worker;
2285*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test1:
2286*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2287*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
2288*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2289*9880d681SAndroid Build Coastguard Worker;
2290*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test1:
2291*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2292*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
2293*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2294*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 4, i32 2, i32 3, i32 1>
2295*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 1, i32 2>
2296*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2297*9880d681SAndroid Build Coastguard Worker}
2298*9880d681SAndroid Build Coastguard Worker
2299*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test2(<4 x float> %a, <4 x float> %b) {
2300*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test2:
2301*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2302*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2303*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2304*9880d681SAndroid Build Coastguard Worker;
2305*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test2:
2306*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2307*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2308*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2309*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 6, i32 0, i32 1, i32 7>
2310*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 1, i32 2, i32 4, i32 5>
2311*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2312*9880d681SAndroid Build Coastguard Worker}
2313*9880d681SAndroid Build Coastguard Worker
2314*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test3(<4 x float> %a, <4 x float> %b) {
2315*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test3:
2316*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2317*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2318*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2319*9880d681SAndroid Build Coastguard Worker;
2320*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test3:
2321*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2322*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2323*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2324*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
2325*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 1>
2326*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2327*9880d681SAndroid Build Coastguard Worker}
2328*9880d681SAndroid Build Coastguard Worker
2329*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test4(<4 x float> %a, <4 x float> %b) {
2330*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test4:
2331*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2332*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]
2333*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
2334*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2335*9880d681SAndroid Build Coastguard Worker;
2336*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test4:
2337*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2338*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1]
2339*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2340*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 5, i32 5>
2341*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
2342*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2343*9880d681SAndroid Build Coastguard Worker}
2344*9880d681SAndroid Build Coastguard Worker
2345*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test5(<4 x float> %a, <4 x float> %b) {
2346*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test5:
2347*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2348*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
2349*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm1, %xmm0
2350*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2351*9880d681SAndroid Build Coastguard Worker;
2352*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test5:
2353*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2354*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
2355*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm1, %xmm0
2356*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2357*9880d681SAndroid Build Coastguard Worker;
2358*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test5:
2359*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2360*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
2361*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2362*9880d681SAndroid Build Coastguard Worker;
2363*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test5:
2364*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2365*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
2366*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2367*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 3>
2368*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 2, i32 6, i32 7>
2369*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2370*9880d681SAndroid Build Coastguard Worker}
2371*9880d681SAndroid Build Coastguard Worker
2372*9880d681SAndroid Build Coastguard Worker
2373*9880d681SAndroid Build Coastguard Worker; Verify that we fold shuffles according to rule:
2374*9880d681SAndroid Build Coastguard Worker;  (shuffle(shuffle A, Undef, M0), A, M1) -> (shuffle A, Undef, M2)
2375*9880d681SAndroid Build Coastguard Worker
2376*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test6(<4 x float> %a) {
2377*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_undef_input_test6:
2378*9880d681SAndroid Build Coastguard Worker; ALL:       # BB#0:
2379*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
2380*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 4, i32 2, i32 3, i32 1>
2381*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 4, i32 5, i32 1, i32 2>
2382*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2383*9880d681SAndroid Build Coastguard Worker}
2384*9880d681SAndroid Build Coastguard Worker
2385*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test7(<4 x float> %a) {
2386*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test7:
2387*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2388*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
2389*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2390*9880d681SAndroid Build Coastguard Worker;
2391*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test7:
2392*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2393*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
2394*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2395*9880d681SAndroid Build Coastguard Worker;
2396*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test7:
2397*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2398*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
2399*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2400*9880d681SAndroid Build Coastguard Worker;
2401*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test7:
2402*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2403*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
2404*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2405*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 6, i32 0, i32 1, i32 7>
2406*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 1, i32 2, i32 4, i32 5>
2407*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2408*9880d681SAndroid Build Coastguard Worker}
2409*9880d681SAndroid Build Coastguard Worker
2410*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test8(<4 x float> %a) {
2411*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test8:
2412*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2413*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
2414*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2415*9880d681SAndroid Build Coastguard Worker;
2416*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test8:
2417*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2418*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
2419*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2420*9880d681SAndroid Build Coastguard Worker;
2421*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test8:
2422*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2423*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
2424*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2425*9880d681SAndroid Build Coastguard Worker;
2426*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test8:
2427*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2428*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
2429*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2430*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
2431*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 2, i32 4, i32 1>
2432*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2433*9880d681SAndroid Build Coastguard Worker}
2434*9880d681SAndroid Build Coastguard Worker
2435*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test9(<4 x float> %a) {
2436*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test9:
2437*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2438*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
2439*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2440*9880d681SAndroid Build Coastguard Worker;
2441*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test9:
2442*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2443*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,1]
2444*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2445*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 5, i32 5>
2446*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 6, i32 7, i32 0, i32 1>
2447*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2448*9880d681SAndroid Build Coastguard Worker}
2449*9880d681SAndroid Build Coastguard Worker
2450*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test10(<4 x float> %a) {
2451*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_undef_input_test10:
2452*9880d681SAndroid Build Coastguard Worker; ALL:       # BB#0:
2453*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
2454*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 3>
2455*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 2, i32 6, i32 7>
2456*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2457*9880d681SAndroid Build Coastguard Worker}
2458*9880d681SAndroid Build Coastguard Worker
2459*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test11(<4 x float> %a, <4 x float> %b) {
2460*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test11:
2461*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2462*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
2463*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2464*9880d681SAndroid Build Coastguard Worker;
2465*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test11:
2466*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2467*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
2468*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2469*9880d681SAndroid Build Coastguard Worker;
2470*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test11:
2471*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2472*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
2473*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2474*9880d681SAndroid Build Coastguard Worker;
2475*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test11:
2476*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2477*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
2478*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2479*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 4, i32 2, i32 3, i32 1>
2480*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %b, <4 x float> %1, <4 x i32> <i32 0, i32 1, i32 5, i32 6>
2481*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2482*9880d681SAndroid Build Coastguard Worker}
2483*9880d681SAndroid Build Coastguard Worker
2484*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test12(<4 x float> %a, <4 x float> %b) {
2485*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test12:
2486*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2487*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2488*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2489*9880d681SAndroid Build Coastguard Worker;
2490*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test12:
2491*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2492*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2493*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2494*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 6, i32 0, i32 1, i32 7>
2495*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %b, <4 x float> %1, <4 x i32> <i32 5, i32 6, i32 0, i32 1>
2496*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2497*9880d681SAndroid Build Coastguard Worker}
2498*9880d681SAndroid Build Coastguard Worker
2499*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test13(<4 x float> %a, <4 x float> %b) {
2500*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test13:
2501*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2502*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2503*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2504*9880d681SAndroid Build Coastguard Worker;
2505*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test13:
2506*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2507*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2508*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2509*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
2510*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %b, <4 x float> %1, <4 x i32> <i32 4, i32 5, i32 0, i32 5>
2511*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2512*9880d681SAndroid Build Coastguard Worker}
2513*9880d681SAndroid Build Coastguard Worker
2514*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test14(<4 x float> %a, <4 x float> %b) {
2515*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test14:
2516*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2517*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1]
2518*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movapd %xmm1, %xmm0
2519*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2520*9880d681SAndroid Build Coastguard Worker;
2521*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test14:
2522*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2523*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1]
2524*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2525*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 5, i32 5>
2526*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %b, <4 x float> %1, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
2527*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2528*9880d681SAndroid Build Coastguard Worker}
2529*9880d681SAndroid Build Coastguard Worker
2530*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test15(<4 x float> %a, <4 x float> %b) {
2531*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test15:
2532*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2533*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
2534*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm1, %xmm0
2535*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2536*9880d681SAndroid Build Coastguard Worker;
2537*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test15:
2538*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2539*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
2540*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm1, %xmm0
2541*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2542*9880d681SAndroid Build Coastguard Worker;
2543*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test15:
2544*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2545*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
2546*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2547*9880d681SAndroid Build Coastguard Worker;
2548*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test15:
2549*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2550*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
2551*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2552*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 3>
2553*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %b, <4 x float> %1, <4 x i32> <i32 4, i32 6, i32 2, i32 3>
2554*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2555*9880d681SAndroid Build Coastguard Worker}
2556*9880d681SAndroid Build Coastguard Worker
2557*9880d681SAndroid Build Coastguard Worker
2558*9880d681SAndroid Build Coastguard Worker; Verify that shuffles are canonicalized according to rules:
2559*9880d681SAndroid Build Coastguard Worker;  shuffle(B, shuffle(A, Undef)) -> shuffle(shuffle(A, Undef), B)
2560*9880d681SAndroid Build Coastguard Worker;
2561*9880d681SAndroid Build Coastguard Worker; This allows to trigger the following combine rule:
2562*9880d681SAndroid Build Coastguard Worker;  (shuffle(shuffle A, Undef, M0), A, M1) -> (shuffle A, Undef, M2)
2563*9880d681SAndroid Build Coastguard Worker;
2564*9880d681SAndroid Build Coastguard Worker; As a result, all the shuffle pairs in each function below should be
2565*9880d681SAndroid Build Coastguard Worker; combined into a single legal shuffle operation.
2566*9880d681SAndroid Build Coastguard Worker
2567*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test16(<4 x float> %a) {
2568*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_undef_input_test16:
2569*9880d681SAndroid Build Coastguard Worker; ALL:       # BB#0:
2570*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
2571*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 4, i32 2, i32 3, i32 1>
2572*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %a, <4 x float> %1, <4 x i32> <i32 0, i32 1, i32 5, i32 3>
2573*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2574*9880d681SAndroid Build Coastguard Worker}
2575*9880d681SAndroid Build Coastguard Worker
2576*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test17(<4 x float> %a) {
2577*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test17:
2578*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2579*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
2580*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2581*9880d681SAndroid Build Coastguard Worker;
2582*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test17:
2583*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2584*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
2585*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2586*9880d681SAndroid Build Coastguard Worker;
2587*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test17:
2588*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2589*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
2590*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2591*9880d681SAndroid Build Coastguard Worker;
2592*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test17:
2593*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2594*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
2595*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2596*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 6, i32 0, i32 1, i32 7>
2597*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %a, <4 x float> %1, <4 x i32> <i32 5, i32 6, i32 0, i32 1>
2598*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2599*9880d681SAndroid Build Coastguard Worker}
2600*9880d681SAndroid Build Coastguard Worker
2601*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test18(<4 x float> %a) {
2602*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test18:
2603*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2604*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0,0]
2605*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2606*9880d681SAndroid Build Coastguard Worker;
2607*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test18:
2608*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2609*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
2610*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2611*9880d681SAndroid Build Coastguard Worker;
2612*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test18:
2613*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2614*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movddup {{.*#+}} xmm0 = xmm0[0,0]
2615*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2616*9880d681SAndroid Build Coastguard Worker;
2617*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test18:
2618*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2619*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovddup {{.*#+}} xmm0 = xmm0[0,0]
2620*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2621*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 5, i32 1, i32 7>
2622*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %a, <4 x float> %1, <4 x i32> <i32 4, i32 6, i32 0, i32 5>
2623*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2624*9880d681SAndroid Build Coastguard Worker}
2625*9880d681SAndroid Build Coastguard Worker
2626*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test19(<4 x float> %a) {
2627*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test19:
2628*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2629*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
2630*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2631*9880d681SAndroid Build Coastguard Worker;
2632*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test19:
2633*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2634*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,1]
2635*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2636*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 5, i32 5>
2637*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %a, <4 x float> %1, <4 x i32> <i32 2, i32 3, i32 4, i32 5>
2638*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2639*9880d681SAndroid Build Coastguard Worker}
2640*9880d681SAndroid Build Coastguard Worker
2641*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test20(<4 x float> %a) {
2642*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_undef_input_test20:
2643*9880d681SAndroid Build Coastguard Worker; ALL:       # BB#0:
2644*9880d681SAndroid Build Coastguard Worker; ALL-NEXT:    retq
2645*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 3>
2646*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <4 x float> %a, <4 x float> %1, <4 x i32> <i32 4, i32 6, i32 2, i32 3>
2647*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %2
2648*9880d681SAndroid Build Coastguard Worker}
2649*9880d681SAndroid Build Coastguard Worker
2650*9880d681SAndroid Build Coastguard Worker; These tests are designed to test the ability to combine away unnecessary
2651*9880d681SAndroid Build Coastguard Worker; operations feeding into a shuffle. The AVX cases are the important ones as
2652*9880d681SAndroid Build Coastguard Worker; they leverage operations which cannot be done naturally on the entire vector
2653*9880d681SAndroid Build Coastguard Worker; and thus are decomposed into multiple smaller operations.
2654*9880d681SAndroid Build Coastguard Worker
2655*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @combine_unneeded_subvector1(<8 x i32> %a) {
2656*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_unneeded_subvector1:
2657*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2658*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    paddd {{.*}}(%rip), %xmm1
2659*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,2,1,0]
2660*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movdqa %xmm0, %xmm1
2661*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2662*9880d681SAndroid Build Coastguard Worker;
2663*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_unneeded_subvector1:
2664*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
2665*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2666*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpaddd {{.*}}(%rip), %xmm0, %xmm0
2667*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
2668*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpermilps {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4]
2669*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,2,3]
2670*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
2671*9880d681SAndroid Build Coastguard Worker;
2672*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_unneeded_subvector1:
2673*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
2674*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpaddd {{.*}}(%rip), %ymm0, %ymm0
2675*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4]
2676*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm0[2,3,2,3]
2677*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
2678*9880d681SAndroid Build Coastguard Worker  %b = add <8 x i32> %a, <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8>
2679*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 7, i32 6, i32 5, i32 4>
2680*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %c
2681*9880d681SAndroid Build Coastguard Worker}
2682*9880d681SAndroid Build Coastguard Worker
2683*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @combine_unneeded_subvector2(<8 x i32> %a, <8 x i32> %b) {
2684*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_unneeded_subvector2:
2685*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0:
2686*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    paddd {{.*}}(%rip), %xmm1
2687*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[3,2,1,0]
2688*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[3,2,1,0]
2689*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2690*9880d681SAndroid Build Coastguard Worker;
2691*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_unneeded_subvector2:
2692*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0:
2693*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2694*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpaddd {{.*}}(%rip), %xmm0, %xmm0
2695*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm0, %ymm0
2696*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm0 = ymm1[2,3],ymm0[2,3]
2697*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vpermilps {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4]
2698*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
2699*9880d681SAndroid Build Coastguard Worker;
2700*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_unneeded_subvector2:
2701*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0:
2702*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpaddd {{.*}}(%rip), %ymm0, %ymm0
2703*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vperm2i128 {{.*#+}} ymm0 = ymm1[2,3],ymm0[2,3]
2704*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4]
2705*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
2706*9880d681SAndroid Build Coastguard Worker  %c = add <8 x i32> %a, <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8>
2707*9880d681SAndroid Build Coastguard Worker  %d = shufflevector <8 x i32> %b, <8 x i32> %c, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 15, i32 14, i32 13, i32 12>
2708*9880d681SAndroid Build Coastguard Worker  ret <8 x i32> %d
2709*9880d681SAndroid Build Coastguard Worker}
2710*9880d681SAndroid Build Coastguard Worker
2711*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_insertps1(<4 x float> %a, <4 x float> %b) {
2712*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_insertps1:
2713*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2714*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[1,0]
2715*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3]
2716*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
2717*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2718*9880d681SAndroid Build Coastguard Worker;
2719*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_insertps1:
2720*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2721*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[1,0]
2722*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3]
2723*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm1, %xmm0
2724*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2725*9880d681SAndroid Build Coastguard Worker;
2726*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_insertps1:
2727*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2728*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm1[2],xmm0[1,2,3]
2729*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2730*9880d681SAndroid Build Coastguard Worker;
2731*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_insertps1:
2732*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2733*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[2],xmm0[1,2,3]
2734*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2735*9880d681SAndroid Build Coastguard Worker
2736*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32><i32 0, i32 6, i32 2, i32 4>
2737*9880d681SAndroid Build Coastguard Worker  %d = shufflevector <4 x float> %a, <4 x float> %c, <4 x i32> <i32 5, i32 1, i32 6, i32 3>
2738*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %d
2739*9880d681SAndroid Build Coastguard Worker}
2740*9880d681SAndroid Build Coastguard Worker
2741*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_insertps2(<4 x float> %a, <4 x float> %b) {
2742*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_insertps2:
2743*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2744*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[0,0]
2745*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
2746*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm1, %xmm0
2747*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2748*9880d681SAndroid Build Coastguard Worker;
2749*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_insertps2:
2750*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2751*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[0,0]
2752*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
2753*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm1, %xmm0
2754*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2755*9880d681SAndroid Build Coastguard Worker;
2756*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_insertps2:
2757*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2758*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],xmm1[2],xmm0[2,3]
2759*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2760*9880d681SAndroid Build Coastguard Worker;
2761*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_insertps2:
2762*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2763*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[2],xmm0[2,3]
2764*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2765*9880d681SAndroid Build Coastguard Worker
2766*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32><i32 0, i32 1, i32 6, i32 7>
2767*9880d681SAndroid Build Coastguard Worker  %d = shufflevector <4 x float> %a, <4 x float> %c, <4 x i32> <i32 4, i32 6, i32 2, i32 3>
2768*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %d
2769*9880d681SAndroid Build Coastguard Worker}
2770*9880d681SAndroid Build Coastguard Worker
2771*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_insertps3(<4 x float> %a, <4 x float> %b) {
2772*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_insertps3:
2773*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2774*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
2775*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
2776*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2777*9880d681SAndroid Build Coastguard Worker;
2778*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_insertps3:
2779*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2780*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
2781*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
2782*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2783*9880d681SAndroid Build Coastguard Worker;
2784*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_insertps3:
2785*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2786*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
2787*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2788*9880d681SAndroid Build Coastguard Worker;
2789*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_insertps3:
2790*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2791*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
2792*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2793*9880d681SAndroid Build Coastguard Worker
2794*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32><i32 0, i32 4, i32 2, i32 5>
2795*9880d681SAndroid Build Coastguard Worker  %d = shufflevector <4 x float> %a, <4 x float> %c, <4 x i32><i32 4, i32 1, i32 5, i32 3>
2796*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %d
2797*9880d681SAndroid Build Coastguard Worker}
2798*9880d681SAndroid Build Coastguard Worker
2799*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_insertps4(<4 x float> %a, <4 x float> %b) {
2800*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_insertps4:
2801*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2802*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
2803*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
2804*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2805*9880d681SAndroid Build Coastguard Worker;
2806*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_insertps4:
2807*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2808*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
2809*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
2810*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2811*9880d681SAndroid Build Coastguard Worker;
2812*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_insertps4:
2813*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2814*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
2815*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2816*9880d681SAndroid Build Coastguard Worker;
2817*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_insertps4:
2818*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2819*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
2820*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2821*9880d681SAndroid Build Coastguard Worker
2822*9880d681SAndroid Build Coastguard Worker  %c = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32><i32 0, i32 4, i32 2, i32 5>
2823*9880d681SAndroid Build Coastguard Worker  %d = shufflevector <4 x float> %a, <4 x float> %c, <4 x i32><i32 4, i32 1, i32 6, i32 5>
2824*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %d
2825*9880d681SAndroid Build Coastguard Worker}
2826*9880d681SAndroid Build Coastguard Worker
2827*9880d681SAndroid Build Coastguard Worker; FIXME: Failed to recognise that the VMOVSD has already zero'd the upper element
2828*9880d681SAndroid Build Coastguard Workerdefine void @combine_scalar_load_with_blend_with_zero(double* %a0, <4 x float>* %a1) {
2829*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_scalar_load_with_blend_with_zero:
2830*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0:
2831*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
2832*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    xorps %xmm1, %xmm1
2833*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
2834*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
2835*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm0, (%rsi)
2836*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2837*9880d681SAndroid Build Coastguard Worker;
2838*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_scalar_load_with_blend_with_zero:
2839*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0:
2840*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
2841*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    xorps %xmm1, %xmm1
2842*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
2843*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
2844*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm0, (%rsi)
2845*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2846*9880d681SAndroid Build Coastguard Worker;
2847*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_scalar_load_with_blend_with_zero:
2848*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
2849*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
2850*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    xorpd %xmm1, %xmm1
2851*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
2852*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movapd %xmm1, (%rsi)
2853*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2854*9880d681SAndroid Build Coastguard Worker;
2855*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_scalar_load_with_blend_with_zero:
2856*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0:
2857*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
2858*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vxorpd %xmm1, %xmm1, %xmm1
2859*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
2860*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vmovapd %xmm0, (%rsi)
2861*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2862*9880d681SAndroid Build Coastguard Worker  %1 = load double, double* %a0, align 8
2863*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <2 x double> undef, double %1, i32 0
2864*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <2 x double> %2, double 0.000000e+00, i32 1
2865*9880d681SAndroid Build Coastguard Worker  %4 = bitcast <2 x double> %3 to <4 x float>
2866*9880d681SAndroid Build Coastguard Worker  %5 = shufflevector <4 x float> %4, <4 x float> <float 0.000000e+00, float undef, float undef, float undef>, <4 x i32> <i32 0, i32 1, i32 4, i32 3>
2867*9880d681SAndroid Build Coastguard Worker  store <4 x float> %5, <4 x float>* %a1, align 16
2868*9880d681SAndroid Build Coastguard Worker  ret void
2869*9880d681SAndroid Build Coastguard Worker}
2870*9880d681SAndroid Build Coastguard Worker
2871*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @PR22377(<4 x float> %a, <4 x float> %b) {
2872*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: PR22377:
2873*9880d681SAndroid Build Coastguard Worker; SSE:       # BB#0: # %entry
2874*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    movaps %xmm0, %xmm1
2875*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,3,1,3]
2876*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,0,2]
2877*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    addps %xmm0, %xmm1
2878*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2879*9880d681SAndroid Build Coastguard Worker; SSE-NEXT:    retq
2880*9880d681SAndroid Build Coastguard Worker;
2881*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: PR22377:
2882*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
2883*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[1,3,1,3]
2884*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,0,2]
2885*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddps %xmm0, %xmm1, %xmm1
2886*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vunpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2887*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2888*9880d681SAndroid Build Coastguard Workerentry:
2889*9880d681SAndroid Build Coastguard Worker  %s1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 1, i32 3>
2890*9880d681SAndroid Build Coastguard Worker  %s2 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 0, i32 2>
2891*9880d681SAndroid Build Coastguard Worker  %r2 = fadd <4 x float> %s1, %s2
2892*9880d681SAndroid Build Coastguard Worker  %s3 = shufflevector <4 x float> %s2, <4 x float> %r2, <4 x i32> <i32 0, i32 4, i32 1, i32 5>
2893*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %s3
2894*9880d681SAndroid Build Coastguard Worker}
2895*9880d681SAndroid Build Coastguard Worker
2896*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @PR22390(<4 x float> %a, <4 x float> %b) {
2897*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: PR22390:
2898*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
2899*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0,1,2]
2900*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm0, %xmm2
2901*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
2902*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    addps %xmm0, %xmm2
2903*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm2, %xmm0
2904*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2905*9880d681SAndroid Build Coastguard Worker;
2906*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: PR22390:
2907*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
2908*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0,1,2]
2909*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm0, %xmm2
2910*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3]
2911*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    addps %xmm0, %xmm2
2912*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm2, %xmm0
2913*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2914*9880d681SAndroid Build Coastguard Worker;
2915*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: PR22390:
2916*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
2917*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0,1,2]
2918*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendps {{.*#+}} xmm1 = xmm1[0],xmm0[1,2,3]
2919*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    addps %xmm1, %xmm0
2920*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2921*9880d681SAndroid Build Coastguard Worker;
2922*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: PR22390:
2923*9880d681SAndroid Build Coastguard Worker; AVX:       # BB#0: # %entry
2924*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,0,1,2]
2925*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vblendps {{.*#+}} xmm1 = xmm1[0],xmm0[1,2,3]
2926*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    vaddps %xmm1, %xmm0, %xmm0
2927*9880d681SAndroid Build Coastguard Worker; AVX-NEXT:    retq
2928*9880d681SAndroid Build Coastguard Workerentry:
2929*9880d681SAndroid Build Coastguard Worker  %s1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
2930*9880d681SAndroid Build Coastguard Worker  %s2 = shufflevector <4 x float> %s1, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
2931*9880d681SAndroid Build Coastguard Worker  %r2 = fadd <4 x float> %s1, %s2
2932*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %r2
2933*9880d681SAndroid Build Coastguard Worker}
2934*9880d681SAndroid Build Coastguard Worker
2935*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @PR22412(<8 x float> %a, <8 x float> %b) {
2936*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: PR22412:
2937*9880d681SAndroid Build Coastguard Worker; SSE2:       # BB#0: # %entry
2938*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
2939*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movapd %xmm2, %xmm0
2940*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm3[3,2]
2941*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,0],xmm2[3,2]
2942*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    movaps %xmm3, %xmm1
2943*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT:    retq
2944*9880d681SAndroid Build Coastguard Worker;
2945*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: PR22412:
2946*9880d681SAndroid Build Coastguard Worker; SSSE3:       # BB#0: # %entry
2947*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
2948*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movapd %xmm2, %xmm0
2949*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0],xmm3[3,2]
2950*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,0],xmm2[3,2]
2951*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    movaps %xmm3, %xmm1
2952*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT:    retq
2953*9880d681SAndroid Build Coastguard Worker;
2954*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: PR22412:
2955*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0: # %entry
2956*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm2[1]
2957*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movapd %xmm0, %xmm1
2958*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm3[3,2]
2959*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,0],xmm0[3,2]
2960*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movaps %xmm1, %xmm0
2961*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movaps %xmm3, %xmm1
2962*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retq
2963*9880d681SAndroid Build Coastguard Worker;
2964*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: PR22412:
2965*9880d681SAndroid Build Coastguard Worker; AVX1:       # BB#0: # %entry
2966*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3]
2967*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1]
2968*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,0],ymm1[3,2],ymm0[5,4],ymm1[7,6]
2969*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT:    retq
2970*9880d681SAndroid Build Coastguard Worker;
2971*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: PR22412:
2972*9880d681SAndroid Build Coastguard Worker; AVX2:       # BB#0: # %entry
2973*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3]
2974*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpermilps {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6]
2975*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,3,2,1]
2976*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT:    retq
2977*9880d681SAndroid Build Coastguard Workerentry:
2978*9880d681SAndroid Build Coastguard Worker  %s1 = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 1, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
2979*9880d681SAndroid Build Coastguard Worker  %s2 = shufflevector <8 x float> %s1, <8 x float> undef, <8 x i32> <i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2>
2980*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %s2
2981*9880d681SAndroid Build Coastguard Worker}
2982