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