Revert r362472 as it is breaking PPC build bots
[llvm-core.git] / test / CodeGen / PowerPC / store-combine.ll
blob77e02e76cde0abf24baae145dbd18ee85490e67a
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs < %s | FileCheck %s -check-prefix=CHECK-PPC64LE
3 ; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs < %s | FileCheck %s -check-prefix=CHECK-PPC64
4 ; i8* p;
5 ; i32 m;
6 ; p[0] = (m >> 0) & 0xFF;
7 ; p[1] = (m >> 8) & 0xFF;
8 ; p[2] = (m >> 16) & 0xFF;
9 ; p[3] = (m >> 24) & 0xFF;
10 define void @store_i32_by_i8(i32 signext %m, i8* %p) {
11 ; CHECK-PPC64LE-LABEL: store_i32_by_i8:
12 ; CHECK-PPC64LE:       # %bb.0: # %entry
13 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 8
14 ; CHECK-PPC64LE-NEXT:    stb 3, 0(4)
15 ; CHECK-PPC64LE-NEXT:    stb 5, 1(4)
16 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 16
17 ; CHECK-PPC64LE-NEXT:    srwi 3, 3, 24
18 ; CHECK-PPC64LE-NEXT:    stb 5, 2(4)
19 ; CHECK-PPC64LE-NEXT:    stb 3, 3(4)
20 ; CHECK-PPC64LE-NEXT:    blr
22 ; CHECK-PPC64-LABEL: store_i32_by_i8:
23 ; CHECK-PPC64:       # %bb.0: # %entry
24 ; CHECK-PPC64-NEXT:    srwi 5, 3, 8
25 ; CHECK-PPC64-NEXT:    stb 3, 0(4)
26 ; CHECK-PPC64-NEXT:    stb 5, 1(4)
27 ; CHECK-PPC64-NEXT:    srwi 5, 3, 16
28 ; CHECK-PPC64-NEXT:    srwi 3, 3, 24
29 ; CHECK-PPC64-NEXT:    stb 5, 2(4)
30 ; CHECK-PPC64-NEXT:    stb 3, 3(4)
31 ; CHECK-PPC64-NEXT:    blr
32 entry:
33   %conv = trunc i32 %m to i8
34   store i8 %conv, i8* %p, align 1
35   %0 = lshr i32 %m, 8
36   %conv3 = trunc i32 %0 to i8
37   %arrayidx4 = getelementptr inbounds i8, i8* %p, i64 1
38   store i8 %conv3, i8* %arrayidx4, align 1
39   %1 = lshr i32 %m, 16
40   %conv7 = trunc i32 %1 to i8
41   %arrayidx8 = getelementptr inbounds i8, i8* %p, i64 2
42   store i8 %conv7, i8* %arrayidx8, align 1
43   %2 = lshr i32 %m, 24
44   %conv11 = trunc i32 %2 to i8
45   %arrayidx12 = getelementptr inbounds i8, i8* %p, i64 3
46   store i8 %conv11, i8* %arrayidx12, align 1
47   ret void
49 ; i8* p;
50 ; i32 m;
51 ; p[0] = (m >> 24) & 0xFF;
52 ; p[1] = (m >> 16) & 0xFF;
53 ; p[2] = (m >> 8) & 0xFF;
54 ; p[3] = (m >> 0) & 0xFF;
55 define void @store_i32_by_i8_bswap(i32 signext %m, i8* %p)  {
56 ; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap:
57 ; CHECK-PPC64LE:       # %bb.0: # %entry
58 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 24
59 ; CHECK-PPC64LE-NEXT:    stb 5, 0(4)
60 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 16
61 ; CHECK-PPC64LE-NEXT:    stb 5, 1(4)
62 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 8
63 ; CHECK-PPC64LE-NEXT:    stb 5, 2(4)
64 ; CHECK-PPC64LE-NEXT:    stb 3, 3(4)
65 ; CHECK-PPC64LE-NEXT:    blr
67 ; CHECK-PPC64-LABEL: store_i32_by_i8_bswap:
68 ; CHECK-PPC64:       # %bb.0: # %entry
69 ; CHECK-PPC64-NEXT:    srwi 5, 3, 24
70 ; CHECK-PPC64-NEXT:    srwi 6, 3, 16
71 ; CHECK-PPC64-NEXT:    stb 5, 0(4)
72 ; CHECK-PPC64-NEXT:    srwi 5, 3, 8
73 ; CHECK-PPC64-NEXT:    stb 6, 1(4)
74 ; CHECK-PPC64-NEXT:    stb 5, 2(4)
75 ; CHECK-PPC64-NEXT:    stb 3, 3(4)
76 ; CHECK-PPC64-NEXT:    blr
77 entry:
78   %0 = lshr i32 %m, 24
79   %conv = trunc i32 %0 to i8
80   store i8 %conv, i8* %p, align 1
81   %1 = lshr i32 %m, 16
82   %conv3 = trunc i32 %1 to i8
83   %arrayidx4 = getelementptr inbounds i8, i8* %p, i64 1
84   store i8 %conv3, i8* %arrayidx4, align 1
85   %2 = lshr i32 %m, 8
86   %conv7 = trunc i32 %2 to i8
87   %arrayidx8 = getelementptr inbounds i8, i8* %p, i64 2
88   store i8 %conv7, i8* %arrayidx8, align 1
89   %conv11 = trunc i32 %m to i8
90   %arrayidx12 = getelementptr inbounds i8, i8* %p, i64 3
91   store i8 %conv11, i8* %arrayidx12, align 1
92   ret void
94 ; i8 *p;
95 ; i64 m;
96 ; p[0] = (m >> 0) & 0xFF;
97 ; p[1] = (m >> 8) & 0xFF;
98 ; p[2] = (m >> 16) & 0xFF;
99 ; p[3] = (m >> 24) & 0xFF;
100 ; p[4] = (m >> 32) & 0xFF;
101 ; p[5] = (m >> 40) & 0xFF;
102 ; p[6] = (m >> 48) & 0xFF;
103 ; p[7] = (m >> 56) & 0xFF;
104 define void @store_i64_by_i8(i64 %m, i8* %p)  {
105 ; CHECK-PPC64LE-LABEL: store_i64_by_i8:
106 ; CHECK-PPC64LE:       # %bb.0: # %entry
107 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 56, 8
108 ; CHECK-PPC64LE-NEXT:    stb 3, 0(4)
109 ; CHECK-PPC64LE-NEXT:    stb 5, 1(4)
110 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 48, 16
111 ; CHECK-PPC64LE-NEXT:    stb 5, 2(4)
112 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 40, 24
113 ; CHECK-PPC64LE-NEXT:    stb 5, 3(4)
114 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 32, 32
115 ; CHECK-PPC64LE-NEXT:    stb 5, 4(4)
116 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 24, 40
117 ; CHECK-PPC64LE-NEXT:    stb 5, 5(4)
118 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 16, 48
119 ; CHECK-PPC64LE-NEXT:    rldicl 3, 3, 8, 56
120 ; CHECK-PPC64LE-NEXT:    stb 5, 6(4)
121 ; CHECK-PPC64LE-NEXT:    stb 3, 7(4)
122 ; CHECK-PPC64LE-NEXT:    blr
124 ; CHECK-PPC64-LABEL: store_i64_by_i8:
125 ; CHECK-PPC64:       # %bb.0: # %entry
126 ; CHECK-PPC64-NEXT:    rldicl 5, 3, 56, 8
127 ; CHECK-PPC64-NEXT:    rldicl 6, 3, 48, 16
128 ; CHECK-PPC64-NEXT:    stb 5, 1(4)
129 ; CHECK-PPC64-NEXT:    rldicl 5, 3, 40, 24
130 ; CHECK-PPC64-NEXT:    stb 6, 2(4)
131 ; CHECK-PPC64-NEXT:    rldicl 6, 3, 32, 32
132 ; CHECK-PPC64-NEXT:    stb 5, 3(4)
133 ; CHECK-PPC64-NEXT:    rldicl 5, 3, 24, 40
134 ; CHECK-PPC64-NEXT:    stb 6, 4(4)
135 ; CHECK-PPC64-NEXT:    stb 3, 0(4)
136 ; CHECK-PPC64-NEXT:    stb 5, 5(4)
137 ; CHECK-PPC64-NEXT:    rldicl 5, 3, 16, 48
138 ; CHECK-PPC64-NEXT:    rldicl 3, 3, 8, 56
139 ; CHECK-PPC64-NEXT:    stb 5, 6(4)
140 ; CHECK-PPC64-NEXT:    stb 3, 7(4)
141 ; CHECK-PPC64-NEXT:    blr
142 entry:
143   %conv = trunc i64 %m to i8
144   store i8 %conv, i8* %p, align 1
145   %0 = lshr i64 %m, 8
146   %conv3 = trunc i64 %0 to i8
147   %arrayidx4 = getelementptr inbounds i8, i8* %p, i64 1
148   store i8 %conv3, i8* %arrayidx4, align 1
149   %1 = lshr i64 %m, 16
150   %conv7 = trunc i64 %1 to i8
151   %arrayidx8 = getelementptr inbounds i8, i8* %p, i64 2
152   store i8 %conv7, i8* %arrayidx8, align 1
153   %2 = lshr i64 %m, 24
154   %conv11 = trunc i64 %2 to i8
155   %arrayidx12 = getelementptr inbounds i8, i8* %p, i64 3
156   store i8 %conv11, i8* %arrayidx12, align 1
157   %3 = lshr i64 %m, 32
158   %conv15 = trunc i64 %3 to i8
159   %arrayidx16 = getelementptr inbounds i8, i8* %p, i64 4
160   store i8 %conv15, i8* %arrayidx16, align 1
161   %4 = lshr i64 %m, 40
162   %conv19 = trunc i64 %4 to i8
163   %arrayidx20 = getelementptr inbounds i8, i8* %p, i64 5
164   store i8 %conv19, i8* %arrayidx20, align 1
165   %5 = lshr i64 %m, 48
166   %conv23 = trunc i64 %5 to i8
167   %arrayidx24 = getelementptr inbounds i8, i8* %p, i64 6
168   store i8 %conv23, i8* %arrayidx24, align 1
169   %6 = lshr i64 %m, 56
170   %conv27 = trunc i64 %6 to i8
171   %arrayidx28 = getelementptr inbounds i8, i8* %p, i64 7
172   store i8 %conv27, i8* %arrayidx28, align 1
173   ret void
175 ; i8 *p;
176 ; i64 m;
177 ; p[7] = (m >> 0) & 0xFF;
178 ; p[6] = (m >> 8) & 0xFF;
179 ; p[5] = (m >> 16) & 0xFF;
180 ; p[4] = (m >> 24) & 0xFF;
181 ; p[3] = (m >> 32) & 0xFF;
182 ; p[2] = (m >> 40) & 0xFF;
183 ; p[1] = (m >> 48) & 0xFF;
184 ; p[0] = (m >> 56) & 0xFF;
185 define void @store_i64_by_i8_bswap(i64 %m, i8* %p)  {
186 ; CHECK-PPC64LE-LABEL: store_i64_by_i8_bswap:
187 ; CHECK-PPC64LE:       # %bb.0: # %entry
188 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 56, 8
189 ; CHECK-PPC64LE-NEXT:    stb 3, 7(4)
190 ; CHECK-PPC64LE-NEXT:    stb 5, 6(4)
191 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 48, 16
192 ; CHECK-PPC64LE-NEXT:    stb 5, 5(4)
193 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 40, 24
194 ; CHECK-PPC64LE-NEXT:    stb 5, 4(4)
195 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 32, 32
196 ; CHECK-PPC64LE-NEXT:    stb 5, 3(4)
197 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 24, 40
198 ; CHECK-PPC64LE-NEXT:    stb 5, 2(4)
199 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 16, 48
200 ; CHECK-PPC64LE-NEXT:    rldicl 3, 3, 8, 56
201 ; CHECK-PPC64LE-NEXT:    stb 5, 1(4)
202 ; CHECK-PPC64LE-NEXT:    stb 3, 0(4)
203 ; CHECK-PPC64LE-NEXT:    blr
205 ; CHECK-PPC64-LABEL: store_i64_by_i8_bswap:
206 ; CHECK-PPC64:       # %bb.0: # %entry
207 ; CHECK-PPC64-NEXT:    rldicl 5, 3, 56, 8
208 ; CHECK-PPC64-NEXT:    rldicl 6, 3, 48, 16
209 ; CHECK-PPC64-NEXT:    stb 5, 6(4)
210 ; CHECK-PPC64-NEXT:    rldicl 5, 3, 40, 24
211 ; CHECK-PPC64-NEXT:    stb 6, 5(4)
212 ; CHECK-PPC64-NEXT:    rldicl 6, 3, 32, 32
213 ; CHECK-PPC64-NEXT:    stb 5, 4(4)
214 ; CHECK-PPC64-NEXT:    rldicl 5, 3, 24, 40
215 ; CHECK-PPC64-NEXT:    stb 6, 3(4)
216 ; CHECK-PPC64-NEXT:    stb 3, 7(4)
217 ; CHECK-PPC64-NEXT:    stb 5, 2(4)
218 ; CHECK-PPC64-NEXT:    rldicl 5, 3, 16, 48
219 ; CHECK-PPC64-NEXT:    rldicl 3, 3, 8, 56
220 ; CHECK-PPC64-NEXT:    stb 5, 1(4)
221 ; CHECK-PPC64-NEXT:    stb 3, 0(4)
222 ; CHECK-PPC64-NEXT:    blr
223 entry:
224   %conv = trunc i64 %m to i8
225   %arrayidx = getelementptr inbounds i8, i8* %p, i64 7
226   store i8 %conv, i8* %arrayidx, align 1
227   %0 = lshr i64 %m, 8
228   %conv3 = trunc i64 %0 to i8
229   %arrayidx4 = getelementptr inbounds i8, i8* %p, i64 6
230   store i8 %conv3, i8* %arrayidx4, align 1
231   %1 = lshr i64 %m, 16
232   %conv7 = trunc i64 %1 to i8
233   %arrayidx8 = getelementptr inbounds i8, i8* %p, i64 5
234   store i8 %conv7, i8* %arrayidx8, align 1
235   %2 = lshr i64 %m, 24
236   %conv11 = trunc i64 %2 to i8
237   %arrayidx12 = getelementptr inbounds i8, i8* %p, i64 4
238   store i8 %conv11, i8* %arrayidx12, align 1
239   %3 = lshr i64 %m, 32
240   %conv15 = trunc i64 %3 to i8
241   %arrayidx16 = getelementptr inbounds i8, i8* %p, i64 3
242   store i8 %conv15, i8* %arrayidx16, align 1
243   %4 = lshr i64 %m, 40
244   %conv19 = trunc i64 %4 to i8
245   %arrayidx20 = getelementptr inbounds i8, i8* %p, i64 2
246   store i8 %conv19, i8* %arrayidx20, align 1
247   %5 = lshr i64 %m, 48
248   %conv23 = trunc i64 %5 to i8
249   %arrayidx24 = getelementptr inbounds i8, i8* %p, i64 1
250   store i8 %conv23, i8* %arrayidx24, align 1
251   %6 = lshr i64 %m, 56
252   %conv27 = trunc i64 %6 to i8
253   store i8 %conv27, i8* %p, align 1
254   ret void
257 ; i32 t; i8 *p;
258 ; i64 m = t * 7;
259 ; p[7] = (m >> 0) & 0xFF;
260 ; p[6] = (m >> 8) & 0xFF;
261 ; p[5] = (m >> 16) & 0xFF;
262 ; p[4] = (m >> 24) & 0xFF;
263 ; p[3] = (m >> 32) & 0xFF;
264 ; p[2] = (m >> 40) & 0xFF;
265 ; p[1] = (m >> 48) & 0xFF;
266 ; p[0] = (m >> 56) & 0xFF;
267 define void @store_i64_by_i8_bswap_uses(i32 signext %t, i8* %p) {
268 ; CHECK-PPC64LE-LABEL: store_i64_by_i8_bswap_uses:
269 ; CHECK-PPC64LE:       # %bb.0: # %entry
270 ; CHECK-PPC64LE-NEXT:    slwi 5, 3, 3
271 ; CHECK-PPC64LE-NEXT:    subf 3, 3, 5
272 ; CHECK-PPC64LE-NEXT:    extsw 3, 3
273 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 56, 8
274 ; CHECK-PPC64LE-NEXT:    stb 3, 7(4)
275 ; CHECK-PPC64LE-NEXT:    stb 5, 6(4)
276 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 48, 16
277 ; CHECK-PPC64LE-NEXT:    stb 5, 5(4)
278 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 40, 24
279 ; CHECK-PPC64LE-NEXT:    stb 5, 4(4)
280 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 32, 32
281 ; CHECK-PPC64LE-NEXT:    stb 5, 3(4)
282 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 24, 40
283 ; CHECK-PPC64LE-NEXT:    stb 5, 2(4)
284 ; CHECK-PPC64LE-NEXT:    rldicl 5, 3, 16, 48
285 ; CHECK-PPC64LE-NEXT:    rldicl 3, 3, 8, 56
286 ; CHECK-PPC64LE-NEXT:    stb 5, 1(4)
287 ; CHECK-PPC64LE-NEXT:    stb 3, 0(4)
288 ; CHECK-PPC64LE-NEXT:    blr
290 ; CHECK-PPC64-LABEL: store_i64_by_i8_bswap_uses:
291 ; CHECK-PPC64:       # %bb.0: # %entry
292 ; CHECK-PPC64-NEXT:    slwi 5, 3, 3
293 ; CHECK-PPC64-NEXT:    subf 3, 3, 5
294 ; CHECK-PPC64-NEXT:    extsw 3, 3
295 ; CHECK-PPC64-NEXT:    rldicl 5, 3, 56, 8
296 ; CHECK-PPC64-NEXT:    rldicl 6, 3, 48, 16
297 ; CHECK-PPC64-NEXT:    stb 5, 6(4)
298 ; CHECK-PPC64-NEXT:    rldicl 5, 3, 40, 24
299 ; CHECK-PPC64-NEXT:    stb 6, 5(4)
300 ; CHECK-PPC64-NEXT:    rldicl 6, 3, 32, 32
301 ; CHECK-PPC64-NEXT:    stb 5, 4(4)
302 ; CHECK-PPC64-NEXT:    rldicl 5, 3, 24, 40
303 ; CHECK-PPC64-NEXT:    stb 6, 3(4)
304 ; CHECK-PPC64-NEXT:    stb 3, 7(4)
305 ; CHECK-PPC64-NEXT:    stb 5, 2(4)
306 ; CHECK-PPC64-NEXT:    rldicl 5, 3, 16, 48
307 ; CHECK-PPC64-NEXT:    rldicl 3, 3, 8, 56
308 ; CHECK-PPC64-NEXT:    stb 5, 1(4)
309 ; CHECK-PPC64-NEXT:    stb 3, 0(4)
310 ; CHECK-PPC64-NEXT:    blr
311 entry:
312   %mul = mul nsw i32 %t, 7
313   %conv = sext i32 %mul to i64
314   %conv1 = trunc i32 %mul to i8
315   %arrayidx = getelementptr inbounds i8, i8* %p, i64 7
316   store i8 %conv1, i8* %arrayidx, align 1
317   %0 = lshr i64 %conv, 8
318   %conv4 = trunc i64 %0 to i8
319   %arrayidx5 = getelementptr inbounds i8, i8* %p, i64 6
320   store i8 %conv4, i8* %arrayidx5, align 1
321   %1 = lshr i64 %conv, 16
322   %conv8 = trunc i64 %1 to i8
323   %arrayidx9 = getelementptr inbounds i8, i8* %p, i64 5
324   store i8 %conv8, i8* %arrayidx9, align 1
325   %2 = lshr i64 %conv, 24
326   %conv12 = trunc i64 %2 to i8
327   %arrayidx13 = getelementptr inbounds i8, i8* %p, i64 4
328   store i8 %conv12, i8* %arrayidx13, align 1
329   %shr14 = ashr i64 %conv, 32
330   %conv16 = trunc i64 %shr14 to i8
331   %arrayidx17 = getelementptr inbounds i8, i8* %p, i64 3
332   store i8 %conv16, i8* %arrayidx17, align 1
333   %shr18 = ashr i64 %conv, 40
334   %conv20 = trunc i64 %shr18 to i8
335   %arrayidx21 = getelementptr inbounds i8, i8* %p, i64 2
336   store i8 %conv20, i8* %arrayidx21, align 1
337   %shr22 = ashr i64 %conv, 48
338   %conv24 = trunc i64 %shr22 to i8
339   %arrayidx25 = getelementptr inbounds i8, i8* %p, i64 1
340   store i8 %conv24, i8* %arrayidx25, align 1
341   %shr26 = ashr i64 %conv, 56
342   %conv28 = trunc i64 %shr26 to i8
343   store i8 %conv28, i8* %p, align 1
344   ret void
345 ; CEHCK-PPC64LE: stdbrx [[REG2]], 0, 4
346 ; CEHCK-PPC64: stdx [[REG2]], 0, 4
349 ; One of the stores is volatile
350 ; i8 *p;
351 ; p0 = volatile *p;
352 ; p[3] = (m >> 0) & 0xFF;
353 ; p[2] = (m >> 8) & 0xFF;
354 ; p[1] = (m >> 16) & 0xFF;
355 ; *p0 = (m >> 24) & 0xFF;
356 define void @store_i32_by_i8_bswap_volatile(i32 signext %m, i8* %p) {
357 ; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_volatile:
358 ; CHECK-PPC64LE:       # %bb.0: # %entry
359 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 8
360 ; CHECK-PPC64LE-NEXT:    stb 3, 3(4)
361 ; CHECK-PPC64LE-NEXT:    stb 5, 2(4)
362 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 16
363 ; CHECK-PPC64LE-NEXT:    srwi 3, 3, 24
364 ; CHECK-PPC64LE-NEXT:    stb 5, 1(4)
365 ; CHECK-PPC64LE-NEXT:    stb 3, 0(4)
366 ; CHECK-PPC64LE-NEXT:    blr
368 ; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_volatile:
369 ; CHECK-PPC64:       # %bb.0: # %entry
370 ; CHECK-PPC64-NEXT:    srwi 5, 3, 8
371 ; CHECK-PPC64-NEXT:    stb 3, 3(4)
372 ; CHECK-PPC64-NEXT:    stb 5, 2(4)
373 ; CHECK-PPC64-NEXT:    srwi 5, 3, 16
374 ; CHECK-PPC64-NEXT:    srwi 3, 3, 24
375 ; CHECK-PPC64-NEXT:    stb 5, 1(4)
376 ; CHECK-PPC64-NEXT:    stb 3, 0(4)
377 ; CHECK-PPC64-NEXT:    blr
378 entry:
379   %conv = trunc i32 %m to i8
380   %arrayidx = getelementptr inbounds i8, i8* %p, i64 3
381   store i8 %conv, i8* %arrayidx, align 1
382   %0 = lshr i32 %m, 8
383   %conv3 = trunc i32 %0 to i8
384   %arrayidx4 = getelementptr inbounds i8, i8* %p, i64 2
385   store i8 %conv3, i8* %arrayidx4, align 1
386   %1 = lshr i32 %m, 16
387   %conv7 = trunc i32 %1 to i8
388   %arrayidx8 = getelementptr inbounds i8, i8* %p, i64 1
389   store i8 %conv7, i8* %arrayidx8, align 1
390   %2 = lshr i32 %m, 24
391   %conv11 = trunc i32 %2 to i8
392   store volatile i8 %conv11, i8* %p, align 1
393   ret void
396 ; There is a store in between individual stores
397 ; i8* p, q;
398 ; p[3] = (m >> 0) & 0xFF;
399 ; p[2] = (m >> 8) & 0xFF;
400 ; *q = 3;
401 ; p[1] = (m >> 16) & 0xFF;
402 ; p[0] = (m >> 24) & 0xFF;
403 define void @store_i32_by_i8_bswap_store_in_between(i32 signext %m, i8* %p, i8* %q) {
404 ; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_store_in_between:
405 ; CHECK-PPC64LE:       # %bb.0: # %entry
406 ; CHECK-PPC64LE-NEXT:    srwi 6, 3, 8
407 ; CHECK-PPC64LE-NEXT:    stb 3, 3(4)
408 ; CHECK-PPC64LE-NEXT:    stb 6, 2(4)
409 ; CHECK-PPC64LE-NEXT:    li 6, 3
410 ; CHECK-PPC64LE-NEXT:    stb 6, 0(5)
411 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 16
412 ; CHECK-PPC64LE-NEXT:    srwi 3, 3, 24
413 ; CHECK-PPC64LE-NEXT:    stb 5, 1(4)
414 ; CHECK-PPC64LE-NEXT:    stb 3, 0(4)
415 ; CHECK-PPC64LE-NEXT:    blr
417 ; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_store_in_between:
418 ; CHECK-PPC64:       # %bb.0: # %entry
419 ; CHECK-PPC64-NEXT:    li 6, 3
420 ; CHECK-PPC64-NEXT:    srwi 7, 3, 8
421 ; CHECK-PPC64-NEXT:    stb 7, 2(4)
422 ; CHECK-PPC64-NEXT:    stb 3, 3(4)
423 ; CHECK-PPC64-NEXT:    stb 6, 0(5)
424 ; CHECK-PPC64-NEXT:    srwi 5, 3, 16
425 ; CHECK-PPC64-NEXT:    srwi 3, 3, 24
426 ; CHECK-PPC64-NEXT:    stb 5, 1(4)
427 ; CHECK-PPC64-NEXT:    stb 3, 0(4)
428 ; CHECK-PPC64-NEXT:    blr
429 entry:
430   %conv = trunc i32 %m to i8
431   %arrayidx = getelementptr inbounds i8, i8* %p, i64 3
432   store i8 %conv, i8* %arrayidx, align 1
433   %0 = lshr i32 %m, 8
434   %conv3 = trunc i32 %0 to i8
435   %arrayidx4 = getelementptr inbounds i8, i8* %p, i64 2
436   store i8 %conv3, i8* %arrayidx4, align 1
437   store i8 3, i8* %q, align 1
438   %1 = lshr i32 %m, 16
439   %conv7 = trunc i32 %1 to i8
440   %arrayidx8 = getelementptr inbounds i8, i8* %p, i64 1
441   store i8 %conv7, i8* %arrayidx8, align 1
442   %2 = lshr i32 %m, 24
443   %conv11 = trunc i32 %2 to i8
444   store i8 %conv11, i8* %p, align 1
445   ret void
448 define void @store_i32_by_i8_bswap_unrelated_store(i32 signext %m, i8* %p, i8* %q) {
449 ; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_unrelated_store:
450 ; CHECK-PPC64LE:       # %bb.0: # %entry
451 ; CHECK-PPC64LE-NEXT:    srwi 6, 3, 8
452 ; CHECK-PPC64LE-NEXT:    stb 3, 3(4)
453 ; CHECK-PPC64LE-NEXT:    stb 6, 2(5)
454 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 16
455 ; CHECK-PPC64LE-NEXT:    srwi 3, 3, 24
456 ; CHECK-PPC64LE-NEXT:    stb 5, 1(4)
457 ; CHECK-PPC64LE-NEXT:    stb 3, 0(4)
458 ; CHECK-PPC64LE-NEXT:    blr
460 ; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_unrelated_store:
461 ; CHECK-PPC64:       # %bb.0: # %entry
462 ; CHECK-PPC64-NEXT:    srwi 6, 3, 8
463 ; CHECK-PPC64-NEXT:    stb 3, 3(4)
464 ; CHECK-PPC64-NEXT:    stb 6, 2(5)
465 ; CHECK-PPC64-NEXT:    srwi 5, 3, 16
466 ; CHECK-PPC64-NEXT:    srwi 3, 3, 24
467 ; CHECK-PPC64-NEXT:    stb 5, 1(4)
468 ; CHECK-PPC64-NEXT:    stb 3, 0(4)
469 ; CHECK-PPC64-NEXT:    blr
470 entry:
471   %conv = trunc i32 %m to i8
472   %arrayidx = getelementptr inbounds i8, i8* %p, i64 3
473   store i8 %conv, i8* %arrayidx, align 1
474   %0 = lshr i32 %m, 8
475   %conv3 = trunc i32 %0 to i8
476   %arrayidx4 = getelementptr inbounds i8, i8* %q, i64 2
477   store i8 %conv3, i8* %arrayidx4, align 1
478   %1 = lshr i32 %m, 16
479   %conv7 = trunc i32 %1 to i8
480   %arrayidx8 = getelementptr inbounds i8, i8* %p, i64 1
481   store i8 %conv7, i8* %arrayidx8, align 1
482   %2 = lshr i32 %m, 24
483   %conv11 = trunc i32 %2 to i8
484   store i8 %conv11, i8* %p, align 1
485   ret void
487 ; i32 m;
488 ; i8* p;
489 ; p[3] = (m >> 8) & 0xFF;
490 ; p[4] = (m >> 0) & 0xFF;
491 ; p[2] = (m >> 16) & 0xFF;
492 ; p[1] = (m >> 24) & 0xFF;
493 define void @store_i32_by_i8_bswap_nonzero_offset(i32 signext %m, i8* %p) {
494 ; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_nonzero_offset:
495 ; CHECK-PPC64LE:       # %bb.0: # %entry
496 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 8
497 ; CHECK-PPC64LE-NEXT:    stb 5, 3(4)
498 ; CHECK-PPC64LE-NEXT:    stb 3, 4(4)
499 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 16
500 ; CHECK-PPC64LE-NEXT:    srwi 3, 3, 24
501 ; CHECK-PPC64LE-NEXT:    stb 5, 2(4)
502 ; CHECK-PPC64LE-NEXT:    stb 3, 1(4)
503 ; CHECK-PPC64LE-NEXT:    blr
505 ; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_nonzero_offset:
506 ; CHECK-PPC64:       # %bb.0: # %entry
507 ; CHECK-PPC64-NEXT:    srwi 5, 3, 8
508 ; CHECK-PPC64-NEXT:    stb 3, 4(4)
509 ; CHECK-PPC64-NEXT:    stb 5, 3(4)
510 ; CHECK-PPC64-NEXT:    srwi 5, 3, 16
511 ; CHECK-PPC64-NEXT:    srwi 3, 3, 24
512 ; CHECK-PPC64-NEXT:    stb 5, 2(4)
513 ; CHECK-PPC64-NEXT:    stb 3, 1(4)
514 ; CHECK-PPC64-NEXT:    blr
515 entry:
516   %0 = lshr i32 %m, 8
517   %conv = trunc i32 %0 to i8
518   %arrayidx = getelementptr inbounds i8, i8* %p, i64 3
519   store i8 %conv, i8* %arrayidx, align 1
520   %conv3 = trunc i32 %m to i8
521   %arrayidx4 = getelementptr inbounds i8, i8* %p, i64 4
522   store i8 %conv3, i8* %arrayidx4, align 1
523   %1 = lshr i32 %m, 16
524   %conv7 = trunc i32 %1 to i8
525   %arrayidx8 = getelementptr inbounds i8, i8* %p, i64 2
526   store i8 %conv7, i8* %arrayidx8, align 1
527   %2 = lshr i32 %m, 24
528   %conv11 = trunc i32 %2 to i8
529   %arrayidx12 = getelementptr inbounds i8, i8* %p, i64 1
530   store i8 %conv11, i8* %arrayidx12, align 1
531   ret void
533 ; i32 m;
534 ; i8* p;
535 ; p[-3] = (m >> 8) & 0xFF;
536 ; p[-4] = (m >> 0) & 0xFF;
537 ; p[-2] = (m >> 16) & 0xFF;
538 ; p[-1] = (m >> 24) & 0xFF;
539 define void @store_i32_by_i8_neg_offset(i32 signext %m, i8* %p) {
540 ; CHECK-PPC64LE-LABEL: store_i32_by_i8_neg_offset:
541 ; CHECK-PPC64LE:       # %bb.0: # %entry
542 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 8
543 ; CHECK-PPC64LE-NEXT:    stb 5, -3(4)
544 ; CHECK-PPC64LE-NEXT:    stb 3, -4(4)
545 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 16
546 ; CHECK-PPC64LE-NEXT:    srwi 3, 3, 24
547 ; CHECK-PPC64LE-NEXT:    stb 5, -2(4)
548 ; CHECK-PPC64LE-NEXT:    stb 3, -1(4)
549 ; CHECK-PPC64LE-NEXT:    blr
551 ; CHECK-PPC64-LABEL: store_i32_by_i8_neg_offset:
552 ; CHECK-PPC64:       # %bb.0: # %entry
553 ; CHECK-PPC64-NEXT:    srwi 5, 3, 8
554 ; CHECK-PPC64-NEXT:    stb 3, -4(4)
555 ; CHECK-PPC64-NEXT:    stb 5, -3(4)
556 ; CHECK-PPC64-NEXT:    srwi 5, 3, 16
557 ; CHECK-PPC64-NEXT:    srwi 3, 3, 24
558 ; CHECK-PPC64-NEXT:    stb 5, -2(4)
559 ; CHECK-PPC64-NEXT:    stb 3, -1(4)
560 ; CHECK-PPC64-NEXT:    blr
561 entry:
562   %0 = lshr i32 %m, 8
563   %conv = trunc i32 %0 to i8
564   %arrayidx = getelementptr inbounds i8, i8* %p, i64 -3
565   store i8 %conv, i8* %arrayidx, align 1
566   %conv3 = trunc i32 %m to i8
567   %arrayidx4 = getelementptr inbounds i8, i8* %p, i64 -4
568   store i8 %conv3, i8* %arrayidx4, align 1
569   %1 = lshr i32 %m, 16
570   %conv7 = trunc i32 %1 to i8
571   %arrayidx8 = getelementptr inbounds i8, i8* %p, i64 -2
572   store i8 %conv7, i8* %arrayidx8, align 1
573   %2 = lshr i32 %m, 24
574   %conv11 = trunc i32 %2 to i8
575   %arrayidx12 = getelementptr inbounds i8, i8* %p, i64 -1
576   store i8 %conv11, i8* %arrayidx12, align 1
577   ret void
579 ; i32 m;
580 ; i8* p;
581 ; p[-3] = (m >> 16) & 0xFF;
582 ; p[-4] = (m >> 24) & 0xFF;
583 ; p[-2] = (m >> 8) & 0xFF;
584 ; p[-1] = (m >> 0) & 0xFF;
585 define void @store_i32_by_i8_bswap_neg_offset(i32 signext %m, i8* %p) {
586 ; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_neg_offset:
587 ; CHECK-PPC64LE:       # %bb.0: # %entry
588 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 16
589 ; CHECK-PPC64LE-NEXT:    stb 5, -3(4)
590 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 24
591 ; CHECK-PPC64LE-NEXT:    stb 5, -4(4)
592 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 8
593 ; CHECK-PPC64LE-NEXT:    stb 5, -2(4)
594 ; CHECK-PPC64LE-NEXT:    stb 3, -1(4)
595 ; CHECK-PPC64LE-NEXT:    blr
597 ; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_neg_offset:
598 ; CHECK-PPC64:       # %bb.0: # %entry
599 ; CHECK-PPC64-NEXT:    srwi 5, 3, 16
600 ; CHECK-PPC64-NEXT:    srwi 6, 3, 24
601 ; CHECK-PPC64-NEXT:    stb 5, -3(4)
602 ; CHECK-PPC64-NEXT:    srwi 5, 3, 8
603 ; CHECK-PPC64-NEXT:    stb 6, -4(4)
604 ; CHECK-PPC64-NEXT:    stb 5, -2(4)
605 ; CHECK-PPC64-NEXT:    stb 3, -1(4)
606 ; CHECK-PPC64-NEXT:    blr
607 entry:
608   %0 = lshr i32 %m, 16
609   %conv = trunc i32 %0 to i8
610   %arrayidx = getelementptr inbounds i8, i8* %p, i64 -3
611   store i8 %conv, i8* %arrayidx, align 1
612   %1 = lshr i32 %m, 24
613   %conv3 = trunc i32 %1 to i8
614   %arrayidx4 = getelementptr inbounds i8, i8* %p, i64 -4
615   store i8 %conv3, i8* %arrayidx4, align 1
616   %2 = lshr i32 %m, 8
617   %conv7 = trunc i32 %2 to i8
618   %arrayidx8 = getelementptr inbounds i8, i8* %p, i64 -2
619   store i8 %conv7, i8* %arrayidx8, align 1
620   %conv11 = trunc i32 %m to i8
621   %arrayidx12 = getelementptr inbounds i8, i8* %p, i64 -1
622   store i8 %conv11, i8* %arrayidx12, align 1
623   ret void
625 ; i32 m, i;
626 ; i8* p;
627 ; p[i-3] = (m >> 16) & 0xFF;
628 ; p[i-4] = (m >> 24) & 0xFF;
629 ; p[i-2] = (m >> 8) & 0xFF;
630 ; p[i-1] = (m >> 0) & 0xFF;
631 define void @store_i32_by_i8_bswap_base_index_offset(i32 %m, i32 %i, i8* %p) {
632 ; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_base_index_offset:
633 ; CHECK-PPC64LE:       # %bb.0: # %entry
634 ; CHECK-PPC64LE-NEXT:    extsw 4, 4
635 ; CHECK-PPC64LE-NEXT:    srwi 6, 3, 16
636 ; CHECK-PPC64LE-NEXT:    add 4, 5, 4
637 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 24
638 ; CHECK-PPC64LE-NEXT:    stb 6, -3(4)
639 ; CHECK-PPC64LE-NEXT:    stb 5, -4(4)
640 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 8
641 ; CHECK-PPC64LE-NEXT:    stb 5, -2(4)
642 ; CHECK-PPC64LE-NEXT:    stb 3, -1(4)
643 ; CHECK-PPC64LE-NEXT:    blr
645 ; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_base_index_offset:
646 ; CHECK-PPC64:       # %bb.0: # %entry
647 ; CHECK-PPC64-NEXT:    extsw 4, 4
648 ; CHECK-PPC64-NEXT:    srwi 6, 3, 16
649 ; CHECK-PPC64-NEXT:    add 4, 5, 4
650 ; CHECK-PPC64-NEXT:    srwi 5, 3, 24
651 ; CHECK-PPC64-NEXT:    stb 6, -3(4)
652 ; CHECK-PPC64-NEXT:    srwi 6, 3, 8
653 ; CHECK-PPC64-NEXT:    stb 5, -4(4)
654 ; CHECK-PPC64-NEXT:    stb 6, -2(4)
655 ; CHECK-PPC64-NEXT:    stb 3, -1(4)
656 ; CHECK-PPC64-NEXT:    blr
657 entry:
658   %0 = lshr i32 %m, 16
659   %conv = trunc i32 %0 to i8
660   %sub = add nsw i32 %i, -3
661   %idxprom = sext i32 %sub to i64
662   %arrayidx = getelementptr inbounds i8, i8* %p, i64 %idxprom
663   store i8 %conv, i8* %arrayidx, align 1
664   %1 = lshr i32 %m, 24
665   %conv3 = trunc i32 %1 to i8
666   %sub4 = add nsw i32 %i, -4
667   %idxprom5 = sext i32 %sub4 to i64
668   %arrayidx6 = getelementptr inbounds i8, i8* %p, i64 %idxprom5
669   store i8 %conv3, i8* %arrayidx6, align 1
670   %2 = lshr i32 %m, 8
671   %conv9 = trunc i32 %2 to i8
672   %sub10 = add nsw i32 %i, -2
673   %idxprom11 = sext i32 %sub10 to i64
674   %arrayidx12 = getelementptr inbounds i8, i8* %p, i64 %idxprom11
675   store i8 %conv9, i8* %arrayidx12, align 1
676   %conv15 = trunc i32 %m to i8
677   %sub16 = add nsw i32 %i, -1
678   %idxprom17 = sext i32 %sub16 to i64
679   %arrayidx18 = getelementptr inbounds i8, i8* %p, i64 %idxprom17
680   store i8 %conv15, i8* %arrayidx18, align 1
681   ret void
684 ; i8* p;
685 ; i32 i, m;
686 ; i8* p0 = p + i;
687 ; i8* p1 = p + i + 1;
688 ; i8* p2 = p + i + 2;
689 ; i8 *p3 = p + i + 3;
690 ; p0[3] = (m >> 24) & 0xFF;
691 ; p1[3] = (m >> 16) & 0xFF;
692 ; p2[3] = (m >> 8) & 0xFF;
693 ; p3[3] = (m >> 0) & 0xFF;
694 define void @store_i32_by_i8_bswap_complicated(i32 %m, i32 %i, i8* %p) {
695 ; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_complicated:
696 ; CHECK-PPC64LE:       # %bb.0: # %entry
697 ; CHECK-PPC64LE-NEXT:    extsw 4, 4
698 ; CHECK-PPC64LE-NEXT:    add 4, 5, 4
699 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 24
700 ; CHECK-PPC64LE-NEXT:    stb 5, 3(4)
701 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 16
702 ; CHECK-PPC64LE-NEXT:    stb 5, 4(4)
703 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 8
704 ; CHECK-PPC64LE-NEXT:    stb 5, 5(4)
705 ; CHECK-PPC64LE-NEXT:    stb 3, 6(4)
706 ; CHECK-PPC64LE-NEXT:    blr
708 ; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_complicated:
709 ; CHECK-PPC64:       # %bb.0: # %entry
710 ; CHECK-PPC64-NEXT:    extsw 4, 4
711 ; CHECK-PPC64-NEXT:    srwi 6, 3, 24
712 ; CHECK-PPC64-NEXT:    add 4, 5, 4
713 ; CHECK-PPC64-NEXT:    srwi 5, 3, 16
714 ; CHECK-PPC64-NEXT:    stb 6, 3(4)
715 ; CHECK-PPC64-NEXT:    stb 5, 4(4)
716 ; CHECK-PPC64-NEXT:    srwi 5, 3, 8
717 ; CHECK-PPC64-NEXT:    stb 5, 5(4)
718 ; CHECK-PPC64-NEXT:    stb 3, 6(4)
719 ; CHECK-PPC64-NEXT:    blr
720 entry:
721   %idx.ext = sext i32 %i to i64
722   %add.ptr = getelementptr inbounds i8, i8* %p, i64 %idx.ext
723   %add.ptr3 = getelementptr inbounds i8, i8* %add.ptr, i64 1
724   %add.ptr6 = getelementptr inbounds i8, i8* %add.ptr, i64 2
725   %add.ptr9 = getelementptr inbounds i8, i8* %add.ptr, i64 3
726   %0 = lshr i32 %m, 24
727   %conv = trunc i32 %0 to i8
728   store i8 %conv, i8* %add.ptr9, align 1
729   %1 = lshr i32 %m, 16
730   %conv12 = trunc i32 %1 to i8
731   %arrayidx13 = getelementptr inbounds i8, i8* %add.ptr3, i64 3
732   store i8 %conv12, i8* %arrayidx13, align 1
733   %2 = lshr i32 %m, 8
734   %conv16 = trunc i32 %2 to i8
735   %arrayidx17 = getelementptr inbounds i8, i8* %add.ptr6, i64 3
736   store i8 %conv16, i8* %arrayidx17, align 1
737   %conv20 = trunc i32 %m to i8
738   %arrayidx21 = getelementptr inbounds i8, i8* %add.ptr9, i64 3
739   store i8 %conv20, i8* %arrayidx21, align 1
740   ret void
742 ; i8* p; i32 m;
743 ; p[0] = (m >> 8) & 0xFF;
744 ; p[1] = (m >> 0) & 0xFF;
745 define void @store_i16_by_i8_bswap(i16 %m, i8* %p) {
746 ; CHECK-PPC64LE-LABEL: store_i16_by_i8_bswap:
747 ; CHECK-PPC64LE:       # %bb.0: # %entry
748 ; CHECK-PPC64LE-NEXT:    srwi 5, 3, 8
749 ; CHECK-PPC64LE-NEXT:    stb 5, 0(4)
750 ; CHECK-PPC64LE-NEXT:    stb 3, 1(4)
751 ; CHECK-PPC64LE-NEXT:    blr
753 ; CHECK-PPC64-LABEL: store_i16_by_i8_bswap:
754 ; CHECK-PPC64:       # %bb.0: # %entry
755 ; CHECK-PPC64-NEXT:    srwi 5, 3, 8
756 ; CHECK-PPC64-NEXT:    stb 5, 0(4)
757 ; CHECK-PPC64-NEXT:    stb 3, 1(4)
758 ; CHECK-PPC64-NEXT:    blr
759 entry:
760   %0 = lshr i16 %m, 8
761   %conv1 = trunc i16 %0 to i8
762   store i8 %conv1, i8* %p, align 1
763   %conv5 = trunc i16 %m to i8
764   %arrayidx6 = getelementptr inbounds i8, i8* %p, i64 1
765   store i8 %conv5, i8* %arrayidx6, align 1
766   ret void
768 ; i8* p; i32 m;
769 ; p[0] = (m >> 0) & 0xFF;
770 ; p[1] = (m >> 8) & 0xFF;
771 define void @store_16_by_i8(i16 %m, i8* %p) {
772 ; CHECK-PPC64LE-LABEL: store_16_by_i8:
773 ; CHECK-PPC64LE:       # %bb.0: # %entry
774 ; CHECK-PPC64LE-NEXT:    stb 3, 0(4)
775 ; CHECK-PPC64LE-NEXT:    srwi 3, 3, 8
776 ; CHECK-PPC64LE-NEXT:    stb 3, 1(4)
777 ; CHECK-PPC64LE-NEXT:    blr
779 ; CHECK-PPC64-LABEL: store_16_by_i8:
780 ; CHECK-PPC64:       # %bb.0: # %entry
781 ; CHECK-PPC64-NEXT:    srwi 5, 3, 8
782 ; CHECK-PPC64-NEXT:    stb 3, 0(4)
783 ; CHECK-PPC64-NEXT:    stb 5, 1(4)
784 ; CHECK-PPC64-NEXT:    blr
785 entry:
786   %conv1 = trunc i16 %m to i8
787   store i8 %conv1, i8* %p, align 1
788   %0 = lshr i16 %m, 8
789   %conv5 = trunc i16 %0 to i8
790   %arrayidx6 = getelementptr inbounds i8, i8* %p, i64 1
791   store i8 %conv5, i8* %arrayidx6, align 1
792   ret void