[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / SLPVectorizer / AArch64 / transpose.ll
blobf27b0f77feaba906ed59c2aec3556dddfa75bcd6
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -slp-vectorizer -instcombine -S | FileCheck %s
4 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
5 target triple = "aarch64--linux-gnu"
7 define <2 x i64> @build_vec_v2i64(<2 x i64> %v0, <2 x i64> %v1) {
8 ; CHECK-LABEL: @build_vec_v2i64(
9 ; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <2 x i64> [[V0:%.*]], <2 x i64> undef, <2 x i32> <i32 1, i32 0>
10 ; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <2 x i64> [[V1:%.*]], <2 x i64> undef, <2 x i32> <i32 1, i32 0>
11 ; CHECK-NEXT:    [[TMP3:%.*]] = add <2 x i64> [[TMP1]], [[TMP2]]
12 ; CHECK-NEXT:    [[TMP4:%.*]] = sub <2 x i64> [[TMP1]], [[TMP2]]
13 ; CHECK-NEXT:    [[TMP5:%.*]] = shufflevector <2 x i64> [[TMP3]], <2 x i64> [[TMP4]], <2 x i32> <i32 0, i32 3>
14 ; CHECK-NEXT:    [[TMP6:%.*]] = add <2 x i64> [[V0]], [[V1]]
15 ; CHECK-NEXT:    [[TMP7:%.*]] = sub <2 x i64> [[V0]], [[V1]]
16 ; CHECK-NEXT:    [[TMP8:%.*]] = shufflevector <2 x i64> [[TMP6]], <2 x i64> [[TMP7]], <2 x i32> <i32 0, i32 3>
17 ; CHECK-NEXT:    [[TMP9:%.*]] = add <2 x i64> [[TMP8]], [[TMP5]]
18 ; CHECK-NEXT:    ret <2 x i64> [[TMP9]]
20   %v0.0 = extractelement <2 x i64> %v0, i32 0
21   %v0.1 = extractelement <2 x i64> %v0, i32 1
22   %v1.0 = extractelement <2 x i64> %v1, i32 0
23   %v1.1 = extractelement <2 x i64> %v1, i32 1
24   %tmp0.0 = add i64 %v0.0, %v1.0
25   %tmp0.1 = add i64 %v0.1, %v1.1
26   %tmp1.0 = sub i64 %v0.0, %v1.0
27   %tmp1.1 = sub i64 %v0.1, %v1.1
28   %tmp2.0 = add i64 %tmp0.0, %tmp0.1
29   %tmp2.1 = add i64 %tmp1.0, %tmp1.1
30   %tmp3.0 = insertelement <2 x i64> undef, i64 %tmp2.0, i32 0
31   %tmp3.1 = insertelement <2 x i64> %tmp3.0, i64 %tmp2.1, i32 1
32   ret <2 x i64> %tmp3.1
35 define void @store_chain_v2i64(i64* %a, i64* %b, i64* %c) {
36 ; CHECK-LABEL: @store_chain_v2i64(
37 ; CHECK-NEXT:    [[A_1:%.*]] = getelementptr i64, i64* [[A:%.*]], i64 1
38 ; CHECK-NEXT:    [[B_1:%.*]] = getelementptr i64, i64* [[B:%.*]], i64 1
39 ; CHECK-NEXT:    [[C_1:%.*]] = getelementptr i64, i64* [[C:%.*]], i64 1
40 ; CHECK-NEXT:    [[V0_0:%.*]] = load i64, i64* [[A]], align 8
41 ; CHECK-NEXT:    [[V0_1:%.*]] = load i64, i64* [[A_1]], align 8
42 ; CHECK-NEXT:    [[V1_0:%.*]] = load i64, i64* [[B]], align 8
43 ; CHECK-NEXT:    [[V1_1:%.*]] = load i64, i64* [[B_1]], align 8
44 ; CHECK-NEXT:    [[TMP0_0:%.*]] = add i64 [[V0_0]], [[V1_0]]
45 ; CHECK-NEXT:    [[TMP0_1:%.*]] = add i64 [[V0_1]], [[V1_1]]
46 ; CHECK-NEXT:    [[TMP1_0:%.*]] = sub i64 [[V0_0]], [[V1_0]]
47 ; CHECK-NEXT:    [[TMP1_1:%.*]] = sub i64 [[V0_1]], [[V1_1]]
48 ; CHECK-NEXT:    [[TMP2_0:%.*]] = add i64 [[TMP0_0]], [[TMP0_1]]
49 ; CHECK-NEXT:    [[TMP2_1:%.*]] = add i64 [[TMP1_0]], [[TMP1_1]]
50 ; CHECK-NEXT:    store i64 [[TMP2_0]], i64* [[C]], align 8
51 ; CHECK-NEXT:    store i64 [[TMP2_1]], i64* [[C_1]], align 8
52 ; CHECK-NEXT:    ret void
54   %a.0 = getelementptr i64, i64* %a, i64 0
55   %a.1 = getelementptr i64, i64* %a, i64 1
56   %b.0 = getelementptr i64, i64* %b, i64 0
57   %b.1 = getelementptr i64, i64* %b, i64 1
58   %c.0 = getelementptr i64, i64* %c, i64 0
59   %c.1 = getelementptr i64, i64* %c, i64 1
60   %v0.0 = load i64, i64* %a.0, align 8
61   %v0.1 = load i64, i64* %a.1, align 8
62   %v1.0 = load i64, i64* %b.0, align 8
63   %v1.1 = load i64, i64* %b.1, align 8
64   %tmp0.0 = add i64 %v0.0, %v1.0
65   %tmp0.1 = add i64 %v0.1, %v1.1
66   %tmp1.0 = sub i64 %v0.0, %v1.0
67   %tmp1.1 = sub i64 %v0.1, %v1.1
68   %tmp2.0 = add i64 %tmp0.0, %tmp0.1
69   %tmp2.1 = add i64 %tmp1.0, %tmp1.1
70   store i64 %tmp2.0, i64* %c.0, align 8
71   store i64 %tmp2.1, i64* %c.1, align 8
72   ret void
75 define <4 x i32> @build_vec_v4i32(<4 x i32> %v0, <4 x i32> %v1) {
76 ; CHECK-LABEL: @build_vec_v4i32(
77 ; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <4 x i32> [[V0:%.*]], <4 x i32> undef, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
78 ; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[V1:%.*]], <4 x i32> undef, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
79 ; CHECK-NEXT:    [[TMP3:%.*]] = add <4 x i32> [[TMP1]], [[TMP2]]
80 ; CHECK-NEXT:    [[TMP4:%.*]] = sub <4 x i32> [[TMP1]], [[TMP2]]
81 ; CHECK-NEXT:    [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], <4 x i32> <i32 0, i32 5, i32 2, i32 7>
82 ; CHECK-NEXT:    [[TMP6:%.*]] = add <4 x i32> [[V0]], [[V1]]
83 ; CHECK-NEXT:    [[TMP7:%.*]] = sub <4 x i32> [[V0]], [[V1]]
84 ; CHECK-NEXT:    [[TMP8:%.*]] = shufflevector <4 x i32> [[TMP6]], <4 x i32> [[TMP7]], <4 x i32> <i32 0, i32 5, i32 2, i32 7>
85 ; CHECK-NEXT:    [[TMP9:%.*]] = add <4 x i32> [[TMP8]], [[TMP5]]
86 ; CHECK-NEXT:    ret <4 x i32> [[TMP9]]
88   %v0.0 = extractelement <4 x i32> %v0, i32 0
89   %v0.1 = extractelement <4 x i32> %v0, i32 1
90   %v0.2 = extractelement <4 x i32> %v0, i32 2
91   %v0.3 = extractelement <4 x i32> %v0, i32 3
92   %v1.0 = extractelement <4 x i32> %v1, i32 0
93   %v1.1 = extractelement <4 x i32> %v1, i32 1
94   %v1.2 = extractelement <4 x i32> %v1, i32 2
95   %v1.3 = extractelement <4 x i32> %v1, i32 3
96   %tmp0.0 = add i32 %v0.0, %v1.0
97   %tmp0.1 = add i32 %v0.1, %v1.1
98   %tmp0.2 = add i32 %v0.2, %v1.2
99   %tmp0.3 = add i32 %v0.3, %v1.3
100   %tmp1.0 = sub i32 %v0.0, %v1.0
101   %tmp1.1 = sub i32 %v0.1, %v1.1
102   %tmp1.2 = sub i32 %v0.2, %v1.2
103   %tmp1.3 = sub i32 %v0.3, %v1.3
104   %tmp2.0 = add i32 %tmp0.0, %tmp0.1
105   %tmp2.1 = add i32 %tmp1.0, %tmp1.1
106   %tmp2.2 = add i32 %tmp0.2, %tmp0.3
107   %tmp2.3 = add i32 %tmp1.2, %tmp1.3
108   %tmp3.0 = insertelement <4 x i32> undef, i32 %tmp2.0, i32 0
109   %tmp3.1 = insertelement <4 x i32> %tmp3.0, i32 %tmp2.1, i32 1
110   %tmp3.2 = insertelement <4 x i32> %tmp3.1, i32 %tmp2.2, i32 2
111   %tmp3.3 = insertelement <4 x i32> %tmp3.2, i32 %tmp2.3, i32 3
112   ret <4 x i32> %tmp3.3
115 define <4 x i32> @build_vec_v4i32_reuse_0(<2 x i32> %v0, <2 x i32> %v1) {
116 ; CHECK-LABEL: @build_vec_v4i32_reuse_0(
117 ; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <2 x i32> [[V0:%.*]], <2 x i32> undef, <2 x i32> <i32 1, i32 0>
118 ; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <2 x i32> [[V1:%.*]], <2 x i32> undef, <2 x i32> <i32 1, i32 0>
119 ; CHECK-NEXT:    [[TMP3:%.*]] = add <2 x i32> [[TMP1]], [[TMP2]]
120 ; CHECK-NEXT:    [[TMP4:%.*]] = sub <2 x i32> [[TMP1]], [[TMP2]]
121 ; CHECK-NEXT:    [[TMP5:%.*]] = shufflevector <2 x i32> [[TMP3]], <2 x i32> [[TMP4]], <2 x i32> <i32 0, i32 3>
122 ; CHECK-NEXT:    [[TMP6:%.*]] = add <2 x i32> [[V0]], [[V1]]
123 ; CHECK-NEXT:    [[TMP7:%.*]] = sub <2 x i32> [[V0]], [[V1]]
124 ; CHECK-NEXT:    [[TMP8:%.*]] = shufflevector <2 x i32> [[TMP6]], <2 x i32> [[TMP7]], <2 x i32> <i32 0, i32 3>
125 ; CHECK-NEXT:    [[TMP9:%.*]] = add <2 x i32> [[TMP8]], [[TMP5]]
126 ; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <2 x i32> [[TMP9]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
127 ; CHECK-NEXT:    ret <4 x i32> [[SHUFFLE]]
129   %v0.0 = extractelement <2 x i32> %v0, i32 0
130   %v0.1 = extractelement <2 x i32> %v0, i32 1
131   %v1.0 = extractelement <2 x i32> %v1, i32 0
132   %v1.1 = extractelement <2 x i32> %v1, i32 1
133   %tmp0.0 = add i32 %v0.0, %v1.0
134   %tmp0.1 = add i32 %v0.1, %v1.1
135   %tmp1.0 = sub i32 %v0.0, %v1.0
136   %tmp1.1 = sub i32 %v0.1, %v1.1
137   %tmp2.0 = add i32 %tmp0.0, %tmp0.1
138   %tmp2.1 = add i32 %tmp1.0, %tmp1.1
139   %tmp3.0 = insertelement <4 x i32> undef, i32 %tmp2.0, i32 0
140   %tmp3.1 = insertelement <4 x i32> %tmp3.0, i32 %tmp2.1, i32 1
141   %tmp3.2 = insertelement <4 x i32> %tmp3.1, i32 %tmp2.0, i32 2
142   %tmp3.3 = insertelement <4 x i32> %tmp3.2, i32 %tmp2.1, i32 3
143   ret <4 x i32> %tmp3.3
146 define <4 x i32> @build_vec_v4i32_reuse_1(<2 x i32> %v0, <2 x i32> %v1) {
147 ; CHECK-LABEL: @build_vec_v4i32_reuse_1(
148 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i32> [[V1:%.*]], i32 1
149 ; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <2 x i32> [[V1]], i32 0
150 ; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x i32> [[V0:%.*]], i32 1
151 ; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i32> [[V0]], i32 0
152 ; CHECK-NEXT:    [[TMP0_0:%.*]] = add i32 [[TMP4]], [[TMP2]]
153 ; CHECK-NEXT:    [[TMP0_1:%.*]] = add i32 [[TMP3]], [[TMP1]]
154 ; CHECK-NEXT:    [[TMP5:%.*]] = xor <2 x i32> [[V0]], [[V1]]
155 ; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <2 x i32> poison, i32 [[TMP0_0]], i32 0
156 ; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <2 x i32> poison, i32 [[TMP0_1]], i32 0
157 ; CHECK-NEXT:    [[TMP8:%.*]] = sub <2 x i32> [[TMP6]], [[TMP7]]
158 ; CHECK-NEXT:    [[TMP9:%.*]] = shufflevector <2 x i32> [[TMP5]], <2 x i32> undef, <2 x i32> <i32 1, i32 0>
159 ; CHECK-NEXT:    [[TMP10:%.*]] = sub <2 x i32> [[TMP5]], [[TMP9]]
160 ; CHECK-NEXT:    [[TMP2_11:%.*]] = shufflevector <2 x i32> [[TMP8]], <2 x i32> undef, <4 x i32> <i32 0, i32 0, i32 undef, i32 undef>
161 ; CHECK-NEXT:    [[TMP11:%.*]] = shufflevector <2 x i32> [[TMP10]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
162 ; CHECK-NEXT:    [[TMP2_32:%.*]] = shufflevector <4 x i32> [[TMP2_11]], <4 x i32> [[TMP11]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
163 ; CHECK-NEXT:    ret <4 x i32> [[TMP2_32]]
165   %v0.0 = extractelement <2 x i32> %v0, i32 0
166   %v0.1 = extractelement <2 x i32> %v0, i32 1
167   %v1.0 = extractelement <2 x i32> %v1, i32 0
168   %v1.1 = extractelement <2 x i32> %v1, i32 1
169   %tmp0.0 = add i32 %v0.0, %v1.0
170   %tmp0.1 = add i32 %v0.1, %v1.1
171   %tmp0.2 = xor i32 %v0.0, %v1.0
172   %tmp0.3 = xor i32 %v0.1, %v1.1
173   %tmp1.0 = sub i32 %tmp0.0, %tmp0.1
174   %tmp1.1 = sub i32 %tmp0.0, %tmp0.1
175   %tmp1.2 = sub i32 %tmp0.2, %tmp0.3
176   %tmp1.3 = sub i32 %tmp0.3, %tmp0.2
177   %tmp2.0 = insertelement <4 x i32> undef, i32 %tmp1.0, i32 0
178   %tmp2.1 = insertelement <4 x i32> %tmp2.0, i32 %tmp1.1, i32 1
179   %tmp2.2 = insertelement <4 x i32> %tmp2.1, i32 %tmp1.2, i32 2
180   %tmp2.3 = insertelement <4 x i32> %tmp2.2, i32 %tmp1.3, i32 3
181   ret <4 x i32> %tmp2.3
184 define <4 x i32> @build_vec_v4i32_3_binops(<2 x i32> %v0, <2 x i32> %v1) {
185 ; CHECK-LABEL: @build_vec_v4i32_3_binops(
186 ; CHECK-NEXT:    [[V0_0:%.*]] = extractelement <2 x i32> [[V0:%.*]], i32 0
187 ; CHECK-NEXT:    [[V0_1:%.*]] = extractelement <2 x i32> [[V0]], i32 1
188 ; CHECK-NEXT:    [[V1_0:%.*]] = extractelement <2 x i32> [[V1:%.*]], i32 0
189 ; CHECK-NEXT:    [[V1_1:%.*]] = extractelement <2 x i32> [[V1]], i32 1
190 ; CHECK-NEXT:    [[TMP0_0:%.*]] = add i32 [[V0_0]], [[V1_0]]
191 ; CHECK-NEXT:    [[TMP0_1:%.*]] = add i32 [[V0_1]], [[V1_1]]
192 ; CHECK-NEXT:    [[TMP1_0:%.*]] = mul i32 [[V0_0]], [[V1_0]]
193 ; CHECK-NEXT:    [[TMP1_1:%.*]] = mul i32 [[V0_1]], [[V1_1]]
194 ; CHECK-NEXT:    [[TMP1:%.*]] = xor <2 x i32> [[V0]], [[V1]]
195 ; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <2 x i32> [[TMP1]], <2 x i32> undef, <2 x i32> zeroinitializer
196 ; CHECK-NEXT:    [[TMP3:%.*]] = xor <2 x i32> [[V0]], [[V1]]
197 ; CHECK-NEXT:    [[TMP4:%.*]] = shufflevector <2 x i32> [[TMP3]], <2 x i32> undef, <2 x i32> <i32 1, i32 1>
198 ; CHECK-NEXT:    [[TMP2_0:%.*]] = add i32 [[TMP0_0]], [[TMP0_1]]
199 ; CHECK-NEXT:    [[TMP2_1:%.*]] = add i32 [[TMP1_0]], [[TMP1_1]]
200 ; CHECK-NEXT:    [[TMP5:%.*]] = add <2 x i32> [[TMP2]], [[TMP4]]
201 ; CHECK-NEXT:    [[TMP3_0:%.*]] = insertelement <4 x i32> undef, i32 [[TMP2_0]], i32 0
202 ; CHECK-NEXT:    [[TMP3_1:%.*]] = insertelement <4 x i32> [[TMP3_0]], i32 [[TMP2_1]], i32 1
203 ; CHECK-NEXT:    [[TMP6:%.*]] = shufflevector <2 x i32> [[TMP5]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
204 ; CHECK-NEXT:    [[TMP3_31:%.*]] = shufflevector <4 x i32> [[TMP3_1]], <4 x i32> [[TMP6]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
205 ; CHECK-NEXT:    ret <4 x i32> [[TMP3_31]]
207   %v0.0 = extractelement <2 x i32> %v0, i32 0
208   %v0.1 = extractelement <2 x i32> %v0, i32 1
209   %v1.0 = extractelement <2 x i32> %v1, i32 0
210   %v1.1 = extractelement <2 x i32> %v1, i32 1
211   %tmp0.0 = add i32 %v0.0, %v1.0
212   %tmp0.1 = add i32 %v0.1, %v1.1
213   %tmp0.2 = xor i32 %v0.0, %v1.0
214   %tmp0.3 = xor i32 %v0.1, %v1.1
215   %tmp1.0 = mul i32 %v0.0, %v1.0
216   %tmp1.1 = mul i32 %v0.1, %v1.1
217   %tmp1.2 = xor i32 %v0.0, %v1.0
218   %tmp1.3 = xor i32 %v0.1, %v1.1
219   %tmp2.0 = add i32 %tmp0.0, %tmp0.1
220   %tmp2.1 = add i32 %tmp1.0, %tmp1.1
221   %tmp2.2 = add i32 %tmp0.2, %tmp0.3
222   %tmp2.3 = add i32 %tmp1.2, %tmp1.3
223   %tmp3.0 = insertelement <4 x i32> undef, i32 %tmp2.0, i32 0
224   %tmp3.1 = insertelement <4 x i32> %tmp3.0, i32 %tmp2.1, i32 1
225   %tmp3.2 = insertelement <4 x i32> %tmp3.1, i32 %tmp2.2, i32 2
226   %tmp3.3 = insertelement <4 x i32> %tmp3.2, i32 %tmp2.3, i32 3
227   ret <4 x i32> %tmp3.3
230 define i32 @reduction_v4i32(<4 x i32> %v0, <4 x i32> %v1) {
231 ; CHECK-LABEL: @reduction_v4i32(
232 ; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <4 x i32> [[V0:%.*]], <4 x i32> undef, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
233 ; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i32> [[V1:%.*]], <4 x i32> undef, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
234 ; CHECK-NEXT:    [[TMP3:%.*]] = sub <4 x i32> [[TMP1]], [[TMP2]]
235 ; CHECK-NEXT:    [[TMP4:%.*]] = add <4 x i32> [[TMP1]], [[TMP2]]
236 ; CHECK-NEXT:    [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], <4 x i32> <i32 0, i32 5, i32 6, i32 3>
237 ; CHECK-NEXT:    [[TMP6:%.*]] = sub <4 x i32> [[V0]], [[V1]]
238 ; CHECK-NEXT:    [[TMP7:%.*]] = add <4 x i32> [[V0]], [[V1]]
239 ; CHECK-NEXT:    [[TMP8:%.*]] = shufflevector <4 x i32> [[TMP6]], <4 x i32> [[TMP7]], <4 x i32> <i32 0, i32 5, i32 6, i32 3>
240 ; CHECK-NEXT:    [[TMP9:%.*]] = add <4 x i32> [[TMP8]], [[TMP5]]
241 ; CHECK-NEXT:    [[TMP10:%.*]] = lshr <4 x i32> [[TMP9]], <i32 15, i32 15, i32 15, i32 15>
242 ; CHECK-NEXT:    [[TMP11:%.*]] = and <4 x i32> [[TMP10]], <i32 65537, i32 65537, i32 65537, i32 65537>
243 ; CHECK-NEXT:    [[TMP12:%.*]] = mul nuw <4 x i32> [[TMP11]], <i32 65535, i32 65535, i32 65535, i32 65535>
244 ; CHECK-NEXT:    [[TMP13:%.*]] = add <4 x i32> [[TMP12]], [[TMP9]]
245 ; CHECK-NEXT:    [[TMP14:%.*]] = xor <4 x i32> [[TMP13]], [[TMP12]]
246 ; CHECK-NEXT:    [[TMP15:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP14]])
247 ; CHECK-NEXT:    ret i32 [[TMP15]]
249   %v0.0 = extractelement <4 x i32> %v0, i32 0
250   %v0.1 = extractelement <4 x i32> %v0, i32 1
251   %v0.2 = extractelement <4 x i32> %v0, i32 2
252   %v0.3 = extractelement <4 x i32> %v0, i32 3
253   %v1.0 = extractelement <4 x i32> %v1, i32 0
254   %v1.1 = extractelement <4 x i32> %v1, i32 1
255   %v1.2 = extractelement <4 x i32> %v1, i32 2
256   %v1.3 = extractelement <4 x i32> %v1, i32 3
257   %tmp0.0 = add i32 %v0.0, %v1.0
258   %tmp0.1 = add i32 %v0.1, %v1.1
259   %tmp0.2 = add i32 %v0.2, %v1.2
260   %tmp0.3 = add i32 %v0.3, %v1.3
261   %tmp1.0 = sub i32 %v0.0, %v1.0
262   %tmp1.1 = sub i32 %v0.1, %v1.1
263   %tmp1.2 = sub i32 %v0.2, %v1.2
264   %tmp1.3 = sub i32 %v0.3, %v1.3
265   %tmp2.0 = add i32 %tmp0.0, %tmp0.1
266   %tmp2.1 = add i32 %tmp1.0, %tmp1.1
267   %tmp2.2 = add i32 %tmp0.2, %tmp0.3
268   %tmp2.3 = add i32 %tmp1.2, %tmp1.3
269   %tmp3.0 = lshr i32 %tmp2.0, 15
270   %tmp3.1 = lshr i32 %tmp2.1, 15
271   %tmp3.2 = lshr i32 %tmp2.2, 15
272   %tmp3.3 = lshr i32 %tmp2.3, 15
273   %tmp4.0 = and i32 %tmp3.0, 65537
274   %tmp4.1 = and i32 %tmp3.1, 65537
275   %tmp4.2 = and i32 %tmp3.2, 65537
276   %tmp4.3 = and i32 %tmp3.3, 65537
277   %tmp5.0 = mul nuw i32 %tmp4.0, 65535
278   %tmp5.1 = mul nuw i32 %tmp4.1, 65535
279   %tmp5.2 = mul nuw i32 %tmp4.2, 65535
280   %tmp5.3 = mul nuw i32 %tmp4.3, 65535
281   %tmp6.0 = add i32 %tmp5.0, %tmp2.0
282   %tmp6.1 = add i32 %tmp5.1, %tmp2.1
283   %tmp6.2 = add i32 %tmp5.2, %tmp2.2
284   %tmp6.3 = add i32 %tmp5.3, %tmp2.3
285   %tmp7.0 = xor i32 %tmp6.0, %tmp5.0
286   %tmp7.1 = xor i32 %tmp6.1, %tmp5.1
287   %tmp7.2 = xor i32 %tmp6.2, %tmp5.2
288   %tmp7.3 = xor i32 %tmp6.3, %tmp5.3
289   %reduce.0 = add i32 %tmp7.1, %tmp7.0
290   %reduce.1 = add i32 %reduce.0, %tmp7.2
291   %reduce.2 = add i32 %reduce.1, %tmp7.3
292   ret i32 %reduce.2