xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/combine-or.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 -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Verify that each of the following test cases is folded into a single
6*9880d681SAndroid Build Coastguard Worker; instruction which performs a blend operation.
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test1(<2 x i64> %a, <2 x i64> %b) {
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1:
10*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
13*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32><i32 0, i32 2>
14*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <2 x i64> %b, <2 x i64> zeroinitializer, <2 x i32><i32 2, i32 1>
15*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %shuf1, %shuf2
16*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2(<4 x i32> %a, <4 x i32> %b) {
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2:
22*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
25*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 3>
26*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 1, i32 4, i32 4>
27*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
28*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test3(<2 x i64> %a, <2 x i64> %b) {
33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3:
34*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
37*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32><i32 2, i32 1>
38*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <2 x i64> %b, <2 x i64> zeroinitializer, <2 x i32><i32 0, i32 2>
39*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %shuf1, %shuf2
40*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test4(<4 x i32> %a, <4 x i32> %b) {
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4:
46*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
49*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 4, i32 4, i32 4>
50*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 1, i32 2, i32 3>
51*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
52*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5(<4 x i32> %a, <4 x i32> %b) {
57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5:
58*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
61*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 1, i32 2, i32 3>
62*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 4, i32 4, i32 4>
63*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
64*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test6(<4 x i32> %a, <4 x i32> %b) {
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6:
70*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
73*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 1, i32 4, i32 4>
74*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 3>
75*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
76*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test7(<4 x i32> %a, <4 x i32> %b) {
81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7:
82*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
85*9880d681SAndroid Build Coastguard Worker  %and1 = and <4 x i32> %a, <i32 -1, i32 -1, i32 0, i32 0>
86*9880d681SAndroid Build Coastguard Worker  %and2 = and <4 x i32> %b, <i32 0, i32 0, i32 -1, i32 -1>
87*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %and1, %and2
88*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test8(<2 x i64> %a, <2 x i64> %b) {
93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8:
94*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
97*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %a, <i64 -1, i64 0>
98*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %b, <i64 0, i64 -1>
99*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and1, %and2
100*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test9(<4 x i32> %a, <4 x i32> %b) {
105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9:
106*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
109*9880d681SAndroid Build Coastguard Worker  %and1 = and <4 x i32> %a, <i32 0, i32 0, i32 -1, i32 -1>
110*9880d681SAndroid Build Coastguard Worker  %and2 = and <4 x i32> %b, <i32 -1, i32 -1, i32 0, i32 0>
111*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %and1, %and2
112*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test10(<2 x i64> %a, <2 x i64> %b) {
117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10:
118*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
121*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %a, <i64 0, i64 -1>
122*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %b, <i64 -1, i64 0>
123*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and1, %and2
124*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test11(<4 x i32> %a, <4 x i32> %b) {
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11:
130*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
133*9880d681SAndroid Build Coastguard Worker  %and1 = and <4 x i32> %a, <i32 -1, i32 0, i32 0, i32 0>
134*9880d681SAndroid Build Coastguard Worker  %and2 = and <4 x i32> %b, <i32 0, i32 -1, i32 -1, i32 -1>
135*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %and1, %and2
136*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
137*9880d681SAndroid Build Coastguard Worker}
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test12(<4 x i32> %a, <4 x i32> %b) {
141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12:
142*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7]
144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
145*9880d681SAndroid Build Coastguard Worker  %and1 = and <4 x i32> %a, <i32 0, i32 -1, i32 -1, i32 -1>
146*9880d681SAndroid Build Coastguard Worker  %and2 = and <4 x i32> %b, <i32 -1, i32 0, i32 0, i32 0>
147*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %and1, %and2
148*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
149*9880d681SAndroid Build Coastguard Worker}
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker; Verify that the following test cases are folded into single shuffles.
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test13(<4 x i32> %a, <4 x i32> %b) {
155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test13:
156*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
160*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 1, i32 1, i32 4, i32 4>
161*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 3>
162*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
163*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
164*9880d681SAndroid Build Coastguard Worker}
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test14(<2 x i64> %a, <2 x i64> %b) {
168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test14:
169*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
172*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32><i32 0, i32 2>
173*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <2 x i64> %b, <2 x i64> zeroinitializer, <2 x i32><i32 2, i32 0>
174*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %shuf1, %shuf2
175*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test15(<4 x i32> %a, <4 x i32> %b) {
180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test15:
181*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,1,2,1]
183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,1,2,3]
184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7]
185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
186*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 1>
187*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 2, i32 1, i32 4, i32 4>
188*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
189*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
190*9880d681SAndroid Build Coastguard Worker}
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test16(<2 x i64> %a, <2 x i64> %b) {
194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test16:
195*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movdqa %xmm1, %xmm0
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
199*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32><i32 2, i32 0>
200*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <2 x i64> %b, <2 x i64> zeroinitializer, <2 x i32><i32 0, i32 2>
201*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %shuf1, %shuf2
202*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Worker; Verify that the dag-combiner does not fold a OR of two shuffles into a single
207*9880d681SAndroid Build Coastguard Worker; shuffle instruction when the shuffle indexes are not compatible.
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test17(<4 x i32> %a, <4 x i32> %b) {
210*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test17:
211*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    psllq $32, %xmm0
213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movq {{.*#+}} xmm1 = xmm1[0],zero
214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    por %xmm1, %xmm0
215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
216*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 0, i32 4, i32 2>
217*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 1, i32 4, i32 4>
218*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
219*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
220*9880d681SAndroid Build Coastguard Worker}
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test18(<4 x i32> %a, <4 x i32> %b) {
224*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test18:
225*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pxor %xmm2, %xmm2
227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3,4,5,6,7]
228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7]
230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    por %xmm1, %xmm0
231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
232*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 0, i32 4, i32 4>
233*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 4, i32 4, i32 4>
234*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
235*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
236*9880d681SAndroid Build Coastguard Worker}
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test19(<4 x i32> %a, <4 x i32> %b) {
240*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test19:
241*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,3]
243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pxor %xmm3, %xmm3
244*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,1,2,2]
246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5,6,7]
247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    por %xmm2, %xmm0
248*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
249*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 0, i32 4, i32 3>
250*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 4, i32 2, i32 2>
251*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
252*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
253*9880d681SAndroid Build Coastguard Worker}
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test20(<2 x i64> %a, <2 x i64> %b) {
257*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test20:
258*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    por %xmm1, %xmm0
260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
262*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32><i32 0, i32 2>
263*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <2 x i64> %b, <2 x i64> zeroinitializer, <2 x i32><i32 0, i32 2>
264*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %shuf1, %shuf2
265*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
266*9880d681SAndroid Build Coastguard Worker}
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test21(<2 x i64> %a, <2 x i64> %b) {
270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test21:
271*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    por %xmm1, %xmm0
273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
275*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32><i32 2, i32 0>
276*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <2 x i64> %b, <2 x i64> zeroinitializer, <2 x i32><i32 2, i32 0>
277*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %shuf1, %shuf2
278*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %or
279*9880d681SAndroid Build Coastguard Worker}
280*9880d681SAndroid Build Coastguard Worker
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Worker; Verify that the dag-combiner keeps the correct domain for float/double vectors
283*9880d681SAndroid Build Coastguard Worker; bitcast to use the mask-or blend combine.
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test22(<2 x double> %a0, <2 x double> %a1) {
286*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test22:
287*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
288*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
289*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
290*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <2 x double> %a0 to <2 x i64>
291*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <2 x double> %a1 to <2 x i64>
292*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %bc1, <i64 0, i64 -1>
293*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %bc2, <i64 -1, i64 0>
294*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and1, %and2
295*9880d681SAndroid Build Coastguard Worker  %bc3 = bitcast <2 x i64> %or to <2 x double>
296*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %bc3
297*9880d681SAndroid Build Coastguard Worker}
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test23(<4 x float> %a0, <4 x float> %a1) {
301*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test23:
302*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3]
304*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
305*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x float> %a0 to <4 x i32>
306*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x float> %a1 to <4 x i32>
307*9880d681SAndroid Build Coastguard Worker  %and1 = and <4 x i32> %bc1, <i32 0, i32 -1, i32 -1, i32 0>
308*9880d681SAndroid Build Coastguard Worker  %and2 = and <4 x i32> %bc2, <i32 -1, i32 0, i32 0, i32 -1>
309*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %and1, %and2
310*9880d681SAndroid Build Coastguard Worker  %bc3 = bitcast <4 x i32> %or to <4 x float>
311*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %bc3
312*9880d681SAndroid Build Coastguard Worker}
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test24(<4 x float> %a0, <4 x float> %a1) {
316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test24:
317*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
318*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1]
319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
320*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x float> %a0 to <2 x i64>
321*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x float> %a1 to <2 x i64>
322*9880d681SAndroid Build Coastguard Worker  %and1 = and <2 x i64> %bc1, <i64 0, i64 -1>
323*9880d681SAndroid Build Coastguard Worker  %and2 = and <2 x i64> %bc2, <i64 -1, i64 0>
324*9880d681SAndroid Build Coastguard Worker  %or = or <2 x i64> %and1, %and2
325*9880d681SAndroid Build Coastguard Worker  %bc3 = bitcast <2 x i64> %or to <4 x float>
326*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %bc3
327*9880d681SAndroid Build Coastguard Worker}
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test25(<4 x float> %a0) {
331*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test25:
332*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
333*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    blendps {{.*#+}} xmm0 = mem[0],xmm0[1,2],mem[3]
334*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
335*9880d681SAndroid Build Coastguard Worker  %bc1 = bitcast <4 x float> %a0 to <4 x i32>
336*9880d681SAndroid Build Coastguard Worker  %bc2 = bitcast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0> to <4 x i32>
337*9880d681SAndroid Build Coastguard Worker  %and1 = and <4 x i32> %bc1, <i32 0, i32 -1, i32 -1, i32 0>
338*9880d681SAndroid Build Coastguard Worker  %and2 = and <4 x i32> %bc2, <i32 -1, i32 0, i32 0, i32 -1>
339*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %and1, %and2
340*9880d681SAndroid Build Coastguard Worker  %bc3 = bitcast <4 x i32> %or to <4 x float>
341*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %bc3
342*9880d681SAndroid Build Coastguard Worker}
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Worker; Verify that the DAGCombiner doesn't crash in the attempt to check if a shuffle
346*9880d681SAndroid Build Coastguard Worker; with illegal type has a legal mask. Method 'isShuffleMaskLegal' only knows how to
347*9880d681SAndroid Build Coastguard Worker; handle legal vector value types.
348*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @test_crash(<4 x i8> %a, <4 x i8> %b) {
349*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_crash:
350*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
351*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
352*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
353*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i8> %a, <4 x i8> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 3>
354*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i8> %b, <4 x i8> zeroinitializer, <4 x i32><i32 0, i32 1, i32 4, i32 4>
355*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i8> %shuf1, %shuf2
356*9880d681SAndroid Build Coastguard Worker  ret <4 x i8> %or
357*9880d681SAndroid Build Coastguard Worker}
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Worker; Verify that we can fold regardless of which operand is the zeroinitializer
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2b(<4 x i32> %a, <4 x i32> %b) {
362*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2b:
363*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
364*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
365*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
366*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32><i32 0, i32 0, i32 6, i32 7>
367*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 1, i32 4, i32 4>
368*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
369*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
370*9880d681SAndroid Build Coastguard Worker}
371*9880d681SAndroid Build Coastguard Worker
372*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2c(<4 x i32> %a, <4 x i32> %b) {
373*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2c:
374*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
375*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
376*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
377*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32><i32 0, i32 0, i32 6, i32 7>
378*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> zeroinitializer, <4 x i32> %b, <4 x i32><i32 4, i32 5, i32 0, i32 0>
379*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
380*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
381*9880d681SAndroid Build Coastguard Worker}
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2d(<4 x i32> %a, <4 x i32> %b) {
385*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2d:
386*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
387*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
388*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
389*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 3>
390*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> zeroinitializer, <4 x i32> %b, <4 x i32><i32 4, i32 5, i32 0, i32 0>
391*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
392*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
393*9880d681SAndroid Build Coastguard Worker}
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Worker; Make sure we can have an undef where an index pointing to the zero vector should be
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2e(<4 x i32> %a, <4 x i32> %b) {
398*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2e:
399*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
400*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
401*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
402*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>, <4 x i32><i32 undef, i32 4, i32 2, i32 3>
403*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>, <4 x i32><i32 0, i32 1, i32 4, i32 4>
404*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
405*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
406*9880d681SAndroid Build Coastguard Worker}
407*9880d681SAndroid Build Coastguard Worker
408*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2f(<4 x i32> %a, <4 x i32> %b) {
409*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2f:
410*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
411*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7]
412*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retq
413*9880d681SAndroid Build Coastguard Worker  %shuf1 = shufflevector <4 x i32> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>, <4 x i32><i32 4, i32 4, i32 2, i32 3>
414*9880d681SAndroid Build Coastguard Worker  %shuf2 = shufflevector <4 x i32> %b, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>, <4 x i32><i32 undef, i32 1, i32 4, i32 4>
415*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %shuf1, %shuf2
416*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %or
417*9880d681SAndroid Build Coastguard Worker}
418