1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -O3 -S -mtriple=x86_64-- | FileCheck %s --check-prefixes=SSE
3 ; RUN: opt < %s -O3 -S -mtriple=x86_64-- -mattr=avx | FileCheck %s --check-prefixes=AVX
5 define void @trunc_through_one_add(i16* noalias %0, i8* noalias readonly %1) {
6 ; SSE-LABEL: @trunc_through_one_add(
7 ; SSE-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP1:%.*]] to <8 x i8>*
8 ; SSE-NEXT: [[TMP4:%.*]] = load <8 x i8>, <8 x i8>* [[TMP3]], align 1
9 ; SSE-NEXT: [[TMP5:%.*]] = zext <8 x i8> [[TMP4]] to <8 x i16>
10 ; SSE-NEXT: [[TMP6:%.*]] = lshr <8 x i16> [[TMP5]], <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
11 ; SSE-NEXT: [[TMP7:%.*]] = add nuw nsw <8 x i16> [[TMP6]], [[TMP5]]
12 ; SSE-NEXT: [[TMP8:%.*]] = lshr <8 x i16> [[TMP7]], <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
13 ; SSE-NEXT: [[TMP9:%.*]] = bitcast i16* [[TMP0:%.*]] to <8 x i16>*
14 ; SSE-NEXT: store <8 x i16> [[TMP8]], <8 x i16>* [[TMP9]], align 2
15 ; SSE-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, i8* [[TMP1]], i64 8
16 ; SSE-NEXT: [[TMP11:%.*]] = getelementptr inbounds i16, i16* [[TMP0]], i64 8
17 ; SSE-NEXT: [[TMP12:%.*]] = bitcast i8* [[TMP10]] to <8 x i8>*
18 ; SSE-NEXT: [[TMP13:%.*]] = load <8 x i8>, <8 x i8>* [[TMP12]], align 1
19 ; SSE-NEXT: [[TMP14:%.*]] = zext <8 x i8> [[TMP13]] to <8 x i16>
20 ; SSE-NEXT: [[TMP15:%.*]] = lshr <8 x i16> [[TMP14]], <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
21 ; SSE-NEXT: [[TMP16:%.*]] = add nuw nsw <8 x i16> [[TMP15]], [[TMP14]]
22 ; SSE-NEXT: [[TMP17:%.*]] = lshr <8 x i16> [[TMP16]], <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
23 ; SSE-NEXT: [[TMP18:%.*]] = bitcast i16* [[TMP11]] to <8 x i16>*
24 ; SSE-NEXT: store <8 x i16> [[TMP17]], <8 x i16>* [[TMP18]], align 2
27 ; AVX-LABEL: @trunc_through_one_add(
28 ; AVX-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP1:%.*]] to <16 x i8>*
29 ; AVX-NEXT: [[TMP4:%.*]] = load <16 x i8>, <16 x i8>* [[TMP3]], align 1
30 ; AVX-NEXT: [[TMP5:%.*]] = zext <16 x i8> [[TMP4]] to <16 x i16>
31 ; AVX-NEXT: [[TMP6:%.*]] = lshr <16 x i16> [[TMP5]], <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
32 ; AVX-NEXT: [[TMP7:%.*]] = add nuw nsw <16 x i16> [[TMP6]], [[TMP5]]
33 ; AVX-NEXT: [[TMP8:%.*]] = lshr <16 x i16> [[TMP7]], <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
34 ; AVX-NEXT: [[TMP9:%.*]] = bitcast i16* [[TMP0:%.*]] to <16 x i16>*
35 ; AVX-NEXT: store <16 x i16> [[TMP8]], <16 x i16>* [[TMP9]], align 2
38 %3 = load i8, i8* %1, align 1
39 %4 = zext i8 %3 to i32
41 %6 = add nuw nsw i32 %5, %4
43 %8 = trunc i32 %7 to i16
44 store i16 %8, i16* %0, align 2
45 %9 = getelementptr inbounds i8, i8* %1, i64 1
46 %10 = load i8, i8* %9, align 1
47 %11 = zext i8 %10 to i32
49 %13 = add nuw nsw i32 %12, %11
51 %15 = trunc i32 %14 to i16
52 %16 = getelementptr inbounds i16, i16* %0, i64 1
53 store i16 %15, i16* %16, align 2
54 %17 = getelementptr inbounds i8, i8* %1, i64 2
55 %18 = load i8, i8* %17, align 1
56 %19 = zext i8 %18 to i32
58 %21 = add nuw nsw i32 %20, %19
60 %23 = trunc i32 %22 to i16
61 %24 = getelementptr inbounds i16, i16* %0, i64 2
62 store i16 %23, i16* %24, align 2
63 %25 = getelementptr inbounds i8, i8* %1, i64 3
64 %26 = load i8, i8* %25, align 1
65 %27 = zext i8 %26 to i32
67 %29 = add nuw nsw i32 %28, %27
69 %31 = trunc i32 %30 to i16
70 %32 = getelementptr inbounds i16, i16* %0, i64 3
71 store i16 %31, i16* %32, align 2
72 %33 = getelementptr inbounds i8, i8* %1, i64 4
73 %34 = load i8, i8* %33, align 1
74 %35 = zext i8 %34 to i32
76 %37 = add nuw nsw i32 %36, %35
78 %39 = trunc i32 %38 to i16
79 %40 = getelementptr inbounds i16, i16* %0, i64 4
80 store i16 %39, i16* %40, align 2
81 %41 = getelementptr inbounds i8, i8* %1, i64 5
82 %42 = load i8, i8* %41, align 1
83 %43 = zext i8 %42 to i32
85 %45 = add nuw nsw i32 %44, %43
87 %47 = trunc i32 %46 to i16
88 %48 = getelementptr inbounds i16, i16* %0, i64 5
89 store i16 %47, i16* %48, align 2
90 %49 = getelementptr inbounds i8, i8* %1, i64 6
91 %50 = load i8, i8* %49, align 1
92 %51 = zext i8 %50 to i32
94 %53 = add nuw nsw i32 %52, %51
96 %55 = trunc i32 %54 to i16
97 %56 = getelementptr inbounds i16, i16* %0, i64 6
98 store i16 %55, i16* %56, align 2
99 %57 = getelementptr inbounds i8, i8* %1, i64 7
100 %58 = load i8, i8* %57, align 1
101 %59 = zext i8 %58 to i32
102 %60 = lshr i32 %59, 1
103 %61 = add nuw nsw i32 %60, %59
104 %62 = lshr i32 %61, 2
105 %63 = trunc i32 %62 to i16
106 %64 = getelementptr inbounds i16, i16* %0, i64 7
107 store i16 %63, i16* %64, align 2
108 %65 = getelementptr inbounds i8, i8* %1, i64 8
109 %66 = load i8, i8* %65, align 1
110 %67 = zext i8 %66 to i32
111 %68 = lshr i32 %67, 1
112 %69 = add nuw nsw i32 %68, %67
113 %70 = lshr i32 %69, 2
114 %71 = trunc i32 %70 to i16
115 %72 = getelementptr inbounds i16, i16* %0, i64 8
116 store i16 %71, i16* %72, align 2
117 %73 = getelementptr inbounds i8, i8* %1, i64 9
118 %74 = load i8, i8* %73, align 1
119 %75 = zext i8 %74 to i32
120 %76 = lshr i32 %75, 1
121 %77 = add nuw nsw i32 %76, %75
122 %78 = lshr i32 %77, 2
123 %79 = trunc i32 %78 to i16
124 %80 = getelementptr inbounds i16, i16* %0, i64 9
125 store i16 %79, i16* %80, align 2
126 %81 = getelementptr inbounds i8, i8* %1, i64 10
127 %82 = load i8, i8* %81, align 1
128 %83 = zext i8 %82 to i32
129 %84 = lshr i32 %83, 1
130 %85 = add nuw nsw i32 %84, %83
131 %86 = lshr i32 %85, 2
132 %87 = trunc i32 %86 to i16
133 %88 = getelementptr inbounds i16, i16* %0, i64 10
134 store i16 %87, i16* %88, align 2
135 %89 = getelementptr inbounds i8, i8* %1, i64 11
136 %90 = load i8, i8* %89, align 1
137 %91 = zext i8 %90 to i32
138 %92 = lshr i32 %91, 1
139 %93 = add nuw nsw i32 %92, %91
140 %94 = lshr i32 %93, 2
141 %95 = trunc i32 %94 to i16
142 %96 = getelementptr inbounds i16, i16* %0, i64 11
143 store i16 %95, i16* %96, align 2
144 %97 = getelementptr inbounds i8, i8* %1, i64 12
145 %98 = load i8, i8* %97, align 1
146 %99 = zext i8 %98 to i32
147 %100 = lshr i32 %99, 1
148 %101 = add nuw nsw i32 %100, %99
149 %102 = lshr i32 %101, 2
150 %103 = trunc i32 %102 to i16
151 %104 = getelementptr inbounds i16, i16* %0, i64 12
152 store i16 %103, i16* %104, align 2
153 %105 = getelementptr inbounds i8, i8* %1, i64 13
154 %106 = load i8, i8* %105, align 1
155 %107 = zext i8 %106 to i32
156 %108 = lshr i32 %107, 1
157 %109 = add nuw nsw i32 %108, %107
158 %110 = lshr i32 %109, 2
159 %111 = trunc i32 %110 to i16
160 %112 = getelementptr inbounds i16, i16* %0, i64 13
161 store i16 %111, i16* %112, align 2
162 %113 = getelementptr inbounds i8, i8* %1, i64 14
163 %114 = load i8, i8* %113, align 1
164 %115 = zext i8 %114 to i32
165 %116 = lshr i32 %115, 1
166 %117 = add nuw nsw i32 %116, %115
167 %118 = lshr i32 %117, 2
168 %119 = trunc i32 %118 to i16
169 %120 = getelementptr inbounds i16, i16* %0, i64 14
170 store i16 %119, i16* %120, align 2
171 %121 = getelementptr inbounds i8, i8* %1, i64 15
172 %122 = load i8, i8* %121, align 1
173 %123 = zext i8 %122 to i32
174 %124 = lshr i32 %123, 1
175 %125 = add nuw nsw i32 %124, %123
176 %126 = lshr i32 %125, 2
177 %127 = trunc i32 %126 to i16
178 %128 = getelementptr inbounds i16, i16* %0, i64 15
179 store i16 %127, i16* %128, align 2
183 define void @trunc_through_two_adds(i16* noalias %0, i8* noalias readonly %1, i8* noalias readonly %2) {
184 ; SSE-LABEL: @trunc_through_two_adds(
185 ; SSE-NEXT: [[TMP4:%.*]] = bitcast i8* [[TMP1:%.*]] to <8 x i8>*
186 ; SSE-NEXT: [[TMP5:%.*]] = load <8 x i8>, <8 x i8>* [[TMP4]], align 1
187 ; SSE-NEXT: [[TMP6:%.*]] = zext <8 x i8> [[TMP5]] to <8 x i16>
188 ; SSE-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP2:%.*]] to <8 x i8>*
189 ; SSE-NEXT: [[TMP8:%.*]] = load <8 x i8>, <8 x i8>* [[TMP7]], align 1
190 ; SSE-NEXT: [[TMP9:%.*]] = zext <8 x i8> [[TMP8]] to <8 x i16>
191 ; SSE-NEXT: [[TMP10:%.*]] = add nuw nsw <8 x i16> [[TMP9]], [[TMP6]]
192 ; SSE-NEXT: [[TMP11:%.*]] = lshr <8 x i16> [[TMP10]], <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
193 ; SSE-NEXT: [[TMP12:%.*]] = add nuw nsw <8 x i16> [[TMP11]], [[TMP10]]
194 ; SSE-NEXT: [[TMP13:%.*]] = lshr <8 x i16> [[TMP12]], <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
195 ; SSE-NEXT: [[TMP14:%.*]] = bitcast i16* [[TMP0:%.*]] to <8 x i16>*
196 ; SSE-NEXT: store <8 x i16> [[TMP13]], <8 x i16>* [[TMP14]], align 2
197 ; SSE-NEXT: [[TMP15:%.*]] = getelementptr inbounds i8, i8* [[TMP1]], i64 8
198 ; SSE-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, i8* [[TMP2]], i64 8
199 ; SSE-NEXT: [[TMP17:%.*]] = getelementptr inbounds i16, i16* [[TMP0]], i64 8
200 ; SSE-NEXT: [[TMP18:%.*]] = bitcast i8* [[TMP15]] to <8 x i8>*
201 ; SSE-NEXT: [[TMP19:%.*]] = load <8 x i8>, <8 x i8>* [[TMP18]], align 1
202 ; SSE-NEXT: [[TMP20:%.*]] = zext <8 x i8> [[TMP19]] to <8 x i16>
203 ; SSE-NEXT: [[TMP21:%.*]] = bitcast i8* [[TMP16]] to <8 x i8>*
204 ; SSE-NEXT: [[TMP22:%.*]] = load <8 x i8>, <8 x i8>* [[TMP21]], align 1
205 ; SSE-NEXT: [[TMP23:%.*]] = zext <8 x i8> [[TMP22]] to <8 x i16>
206 ; SSE-NEXT: [[TMP24:%.*]] = add nuw nsw <8 x i16> [[TMP23]], [[TMP20]]
207 ; SSE-NEXT: [[TMP25:%.*]] = lshr <8 x i16> [[TMP24]], <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
208 ; SSE-NEXT: [[TMP26:%.*]] = add nuw nsw <8 x i16> [[TMP25]], [[TMP24]]
209 ; SSE-NEXT: [[TMP27:%.*]] = lshr <8 x i16> [[TMP26]], <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
210 ; SSE-NEXT: [[TMP28:%.*]] = bitcast i16* [[TMP17]] to <8 x i16>*
211 ; SSE-NEXT: store <8 x i16> [[TMP27]], <8 x i16>* [[TMP28]], align 2
214 ; AVX-LABEL: @trunc_through_two_adds(
215 ; AVX-NEXT: [[TMP4:%.*]] = bitcast i8* [[TMP1:%.*]] to <16 x i8>*
216 ; AVX-NEXT: [[TMP5:%.*]] = load <16 x i8>, <16 x i8>* [[TMP4]], align 1
217 ; AVX-NEXT: [[TMP6:%.*]] = zext <16 x i8> [[TMP5]] to <16 x i16>
218 ; AVX-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP2:%.*]] to <16 x i8>*
219 ; AVX-NEXT: [[TMP8:%.*]] = load <16 x i8>, <16 x i8>* [[TMP7]], align 1
220 ; AVX-NEXT: [[TMP9:%.*]] = zext <16 x i8> [[TMP8]] to <16 x i16>
221 ; AVX-NEXT: [[TMP10:%.*]] = add nuw nsw <16 x i16> [[TMP9]], [[TMP6]]
222 ; AVX-NEXT: [[TMP11:%.*]] = lshr <16 x i16> [[TMP10]], <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
223 ; AVX-NEXT: [[TMP12:%.*]] = add nuw nsw <16 x i16> [[TMP11]], [[TMP10]]
224 ; AVX-NEXT: [[TMP13:%.*]] = lshr <16 x i16> [[TMP12]], <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
225 ; AVX-NEXT: [[TMP14:%.*]] = bitcast i16* [[TMP0:%.*]] to <16 x i16>*
226 ; AVX-NEXT: store <16 x i16> [[TMP13]], <16 x i16>* [[TMP14]], align 2
229 %4 = load i8, i8* %1, align 1
230 %5 = zext i8 %4 to i32
231 %6 = load i8, i8* %2, align 1
232 %7 = zext i8 %6 to i32
233 %8 = add nuw nsw i32 %7, %5
235 %10 = add nuw nsw i32 %9, %8
236 %11 = lshr i32 %10, 2
237 %12 = trunc i32 %11 to i16
238 store i16 %12, i16* %0, align 2
239 %13 = getelementptr inbounds i8, i8* %1, i64 1
240 %14 = load i8, i8* %13, align 1
241 %15 = zext i8 %14 to i32
242 %16 = getelementptr inbounds i8, i8* %2, i64 1
243 %17 = load i8, i8* %16, align 1
244 %18 = zext i8 %17 to i32
245 %19 = add nuw nsw i32 %18, %15
246 %20 = lshr i32 %19, 1
247 %21 = add nuw nsw i32 %20, %19
248 %22 = lshr i32 %21, 2
249 %23 = trunc i32 %22 to i16
250 %24 = getelementptr inbounds i16, i16* %0, i64 1
251 store i16 %23, i16* %24, align 2
252 %25 = getelementptr inbounds i8, i8* %1, i64 2
253 %26 = load i8, i8* %25, align 1
254 %27 = zext i8 %26 to i32
255 %28 = getelementptr inbounds i8, i8* %2, i64 2
256 %29 = load i8, i8* %28, align 1
257 %30 = zext i8 %29 to i32
258 %31 = add nuw nsw i32 %30, %27
259 %32 = lshr i32 %31, 1
260 %33 = add nuw nsw i32 %32, %31
261 %34 = lshr i32 %33, 2
262 %35 = trunc i32 %34 to i16
263 %36 = getelementptr inbounds i16, i16* %0, i64 2
264 store i16 %35, i16* %36, align 2
265 %37 = getelementptr inbounds i8, i8* %1, i64 3
266 %38 = load i8, i8* %37, align 1
267 %39 = zext i8 %38 to i32
268 %40 = getelementptr inbounds i8, i8* %2, i64 3
269 %41 = load i8, i8* %40, align 1
270 %42 = zext i8 %41 to i32
271 %43 = add nuw nsw i32 %42, %39
272 %44 = lshr i32 %43, 1
273 %45 = add nuw nsw i32 %44, %43
274 %46 = lshr i32 %45, 2
275 %47 = trunc i32 %46 to i16
276 %48 = getelementptr inbounds i16, i16* %0, i64 3
277 store i16 %47, i16* %48, align 2
278 %49 = getelementptr inbounds i8, i8* %1, i64 4
279 %50 = load i8, i8* %49, align 1
280 %51 = zext i8 %50 to i32
281 %52 = getelementptr inbounds i8, i8* %2, i64 4
282 %53 = load i8, i8* %52, align 1
283 %54 = zext i8 %53 to i32
284 %55 = add nuw nsw i32 %54, %51
285 %56 = lshr i32 %55, 1
286 %57 = add nuw nsw i32 %56, %55
287 %58 = lshr i32 %57, 2
288 %59 = trunc i32 %58 to i16
289 %60 = getelementptr inbounds i16, i16* %0, i64 4
290 store i16 %59, i16* %60, align 2
291 %61 = getelementptr inbounds i8, i8* %1, i64 5
292 %62 = load i8, i8* %61, align 1
293 %63 = zext i8 %62 to i32
294 %64 = getelementptr inbounds i8, i8* %2, i64 5
295 %65 = load i8, i8* %64, align 1
296 %66 = zext i8 %65 to i32
297 %67 = add nuw nsw i32 %66, %63
298 %68 = lshr i32 %67, 1
299 %69 = add nuw nsw i32 %68, %67
300 %70 = lshr i32 %69, 2
301 %71 = trunc i32 %70 to i16
302 %72 = getelementptr inbounds i16, i16* %0, i64 5
303 store i16 %71, i16* %72, align 2
304 %73 = getelementptr inbounds i8, i8* %1, i64 6
305 %74 = load i8, i8* %73, align 1
306 %75 = zext i8 %74 to i32
307 %76 = getelementptr inbounds i8, i8* %2, i64 6
308 %77 = load i8, i8* %76, align 1
309 %78 = zext i8 %77 to i32
310 %79 = add nuw nsw i32 %78, %75
311 %80 = lshr i32 %79, 1
312 %81 = add nuw nsw i32 %80, %79
313 %82 = lshr i32 %81, 2
314 %83 = trunc i32 %82 to i16
315 %84 = getelementptr inbounds i16, i16* %0, i64 6
316 store i16 %83, i16* %84, align 2
317 %85 = getelementptr inbounds i8, i8* %1, i64 7
318 %86 = load i8, i8* %85, align 1
319 %87 = zext i8 %86 to i32
320 %88 = getelementptr inbounds i8, i8* %2, i64 7
321 %89 = load i8, i8* %88, align 1
322 %90 = zext i8 %89 to i32
323 %91 = add nuw nsw i32 %90, %87
324 %92 = lshr i32 %91, 1
325 %93 = add nuw nsw i32 %92, %91
326 %94 = lshr i32 %93, 2
327 %95 = trunc i32 %94 to i16
328 %96 = getelementptr inbounds i16, i16* %0, i64 7
329 store i16 %95, i16* %96, align 2
330 %97 = getelementptr inbounds i8, i8* %1, i64 8
331 %98 = load i8, i8* %97, align 1
332 %99 = zext i8 %98 to i32
333 %100 = getelementptr inbounds i8, i8* %2, i64 8
334 %101 = load i8, i8* %100, align 1
335 %102 = zext i8 %101 to i32
336 %103 = add nuw nsw i32 %102, %99
337 %104 = lshr i32 %103, 1
338 %105 = add nuw nsw i32 %104, %103
339 %106 = lshr i32 %105, 2
340 %107 = trunc i32 %106 to i16
341 %108 = getelementptr inbounds i16, i16* %0, i64 8
342 store i16 %107, i16* %108, align 2
343 %109 = getelementptr inbounds i8, i8* %1, i64 9
344 %110 = load i8, i8* %109, align 1
345 %111 = zext i8 %110 to i32
346 %112 = getelementptr inbounds i8, i8* %2, i64 9
347 %113 = load i8, i8* %112, align 1
348 %114 = zext i8 %113 to i32
349 %115 = add nuw nsw i32 %114, %111
350 %116 = lshr i32 %115, 1
351 %117 = add nuw nsw i32 %116, %115
352 %118 = lshr i32 %117, 2
353 %119 = trunc i32 %118 to i16
354 %120 = getelementptr inbounds i16, i16* %0, i64 9
355 store i16 %119, i16* %120, align 2
356 %121 = getelementptr inbounds i8, i8* %1, i64 10
357 %122 = load i8, i8* %121, align 1
358 %123 = zext i8 %122 to i32
359 %124 = getelementptr inbounds i8, i8* %2, i64 10
360 %125 = load i8, i8* %124, align 1
361 %126 = zext i8 %125 to i32
362 %127 = add nuw nsw i32 %126, %123
363 %128 = lshr i32 %127, 1
364 %129 = add nuw nsw i32 %128, %127
365 %130 = lshr i32 %129, 2
366 %131 = trunc i32 %130 to i16
367 %132 = getelementptr inbounds i16, i16* %0, i64 10
368 store i16 %131, i16* %132, align 2
369 %133 = getelementptr inbounds i8, i8* %1, i64 11
370 %134 = load i8, i8* %133, align 1
371 %135 = zext i8 %134 to i32
372 %136 = getelementptr inbounds i8, i8* %2, i64 11
373 %137 = load i8, i8* %136, align 1
374 %138 = zext i8 %137 to i32
375 %139 = add nuw nsw i32 %138, %135
376 %140 = lshr i32 %139, 1
377 %141 = add nuw nsw i32 %140, %139
378 %142 = lshr i32 %141, 2
379 %143 = trunc i32 %142 to i16
380 %144 = getelementptr inbounds i16, i16* %0, i64 11
381 store i16 %143, i16* %144, align 2
382 %145 = getelementptr inbounds i8, i8* %1, i64 12
383 %146 = load i8, i8* %145, align 1
384 %147 = zext i8 %146 to i32
385 %148 = getelementptr inbounds i8, i8* %2, i64 12
386 %149 = load i8, i8* %148, align 1
387 %150 = zext i8 %149 to i32
388 %151 = add nuw nsw i32 %150, %147
389 %152 = lshr i32 %151, 1
390 %153 = add nuw nsw i32 %152, %151
391 %154 = lshr i32 %153, 2
392 %155 = trunc i32 %154 to i16
393 %156 = getelementptr inbounds i16, i16* %0, i64 12
394 store i16 %155, i16* %156, align 2
395 %157 = getelementptr inbounds i8, i8* %1, i64 13
396 %158 = load i8, i8* %157, align 1
397 %159 = zext i8 %158 to i32
398 %160 = getelementptr inbounds i8, i8* %2, i64 13
399 %161 = load i8, i8* %160, align 1
400 %162 = zext i8 %161 to i32
401 %163 = add nuw nsw i32 %162, %159
402 %164 = lshr i32 %163, 1
403 %165 = add nuw nsw i32 %164, %163
404 %166 = lshr i32 %165, 2
405 %167 = trunc i32 %166 to i16
406 %168 = getelementptr inbounds i16, i16* %0, i64 13
407 store i16 %167, i16* %168, align 2
408 %169 = getelementptr inbounds i8, i8* %1, i64 14
409 %170 = load i8, i8* %169, align 1
410 %171 = zext i8 %170 to i32
411 %172 = getelementptr inbounds i8, i8* %2, i64 14
412 %173 = load i8, i8* %172, align 1
413 %174 = zext i8 %173 to i32
414 %175 = add nuw nsw i32 %174, %171
415 %176 = lshr i32 %175, 1
416 %177 = add nuw nsw i32 %176, %175
417 %178 = lshr i32 %177, 2
418 %179 = trunc i32 %178 to i16
419 %180 = getelementptr inbounds i16, i16* %0, i64 14
420 store i16 %179, i16* %180, align 2
421 %181 = getelementptr inbounds i8, i8* %1, i64 15
422 %182 = load i8, i8* %181, align 1
423 %183 = zext i8 %182 to i32
424 %184 = getelementptr inbounds i8, i8* %2, i64 15
425 %185 = load i8, i8* %184, align 1
426 %186 = zext i8 %185 to i32
427 %187 = add nuw nsw i32 %186, %183
428 %188 = lshr i32 %187, 1
429 %189 = add nuw nsw i32 %188, %187
430 %190 = lshr i32 %189, 2
431 %191 = trunc i32 %190 to i16
432 %192 = getelementptr inbounds i16, i16* %0, i64 15
433 store i16 %191, i16* %192, align 2