[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / Transforms / SLPVectorizer / X86 / bad-reduction.ll
blobc44a8524edfe596b8bf42a989945d40ecc16ab73
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -slp-vectorizer -S -mtriple=x86_64-- -mattr=avx2 | FileCheck %s
4 %v8i8 = type { i8, i8, i8, i8, i8, i8, i8, i8 }
6 ; https://bugs.llvm.org/show_bug.cgi?id=43146
8 define i64 @load_bswap(%v8i8* %p) {
9 ; CHECK-LABEL: @load_bswap(
10 ; CHECK-NEXT:    [[G0:%.*]] = getelementptr inbounds [[V8I8:%.*]], %v8i8* [[P:%.*]], i64 0, i32 0
11 ; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 1
12 ; CHECK-NEXT:    [[G2:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 2
13 ; CHECK-NEXT:    [[G3:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 3
14 ; CHECK-NEXT:    [[G4:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 4
15 ; CHECK-NEXT:    [[G5:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 5
16 ; CHECK-NEXT:    [[G6:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 6
17 ; CHECK-NEXT:    [[G7:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 7
18 ; CHECK-NEXT:    [[T0:%.*]] = load i8, i8* [[G0]]
19 ; CHECK-NEXT:    [[T1:%.*]] = load i8, i8* [[G1]]
20 ; CHECK-NEXT:    [[T2:%.*]] = load i8, i8* [[G2]]
21 ; CHECK-NEXT:    [[T3:%.*]] = load i8, i8* [[G3]]
22 ; CHECK-NEXT:    [[T4:%.*]] = load i8, i8* [[G4]]
23 ; CHECK-NEXT:    [[T5:%.*]] = load i8, i8* [[G5]]
24 ; CHECK-NEXT:    [[T6:%.*]] = load i8, i8* [[G6]]
25 ; CHECK-NEXT:    [[T7:%.*]] = load i8, i8* [[G7]]
26 ; CHECK-NEXT:    [[Z0:%.*]] = zext i8 [[T0]] to i64
27 ; CHECK-NEXT:    [[Z1:%.*]] = zext i8 [[T1]] to i64
28 ; CHECK-NEXT:    [[Z2:%.*]] = zext i8 [[T2]] to i64
29 ; CHECK-NEXT:    [[Z3:%.*]] = zext i8 [[T3]] to i64
30 ; CHECK-NEXT:    [[Z4:%.*]] = zext i8 [[T4]] to i64
31 ; CHECK-NEXT:    [[Z5:%.*]] = zext i8 [[T5]] to i64
32 ; CHECK-NEXT:    [[Z6:%.*]] = zext i8 [[T6]] to i64
33 ; CHECK-NEXT:    [[Z7:%.*]] = zext i8 [[T7]] to i64
34 ; CHECK-NEXT:    [[SH0:%.*]] = shl nuw i64 [[Z0]], 56
35 ; CHECK-NEXT:    [[SH1:%.*]] = shl nuw nsw i64 [[Z1]], 48
36 ; CHECK-NEXT:    [[SH2:%.*]] = shl nuw nsw i64 [[Z2]], 40
37 ; CHECK-NEXT:    [[SH3:%.*]] = shl nuw nsw i64 [[Z3]], 32
38 ; CHECK-NEXT:    [[SH4:%.*]] = shl nuw nsw i64 [[Z4]], 24
39 ; CHECK-NEXT:    [[SH5:%.*]] = shl nuw nsw i64 [[Z5]], 16
40 ; CHECK-NEXT:    [[SH6:%.*]] = shl nuw nsw i64 [[Z6]], 8
41 ; CHECK-NEXT:    [[OR01:%.*]] = or i64 [[SH0]], [[SH1]]
42 ; CHECK-NEXT:    [[OR012:%.*]] = or i64 [[OR01]], [[SH2]]
43 ; CHECK-NEXT:    [[OR0123:%.*]] = or i64 [[OR012]], [[SH3]]
44 ; CHECK-NEXT:    [[OR01234:%.*]] = or i64 [[OR0123]], [[SH4]]
45 ; CHECK-NEXT:    [[OR012345:%.*]] = or i64 [[OR01234]], [[SH5]]
46 ; CHECK-NEXT:    [[OR0123456:%.*]] = or i64 [[OR012345]], [[SH6]]
47 ; CHECK-NEXT:    [[OR01234567:%.*]] = or i64 [[OR0123456]], [[Z7]]
48 ; CHECK-NEXT:    ret i64 [[OR01234567]]
50   %g0 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 0
51   %g1 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 1
52   %g2 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 2
53   %g3 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 3
54   %g4 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 4
55   %g5 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 5
56   %g6 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 6
57   %g7 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 7
59   %t0 = load i8, i8* %g0
60   %t1 = load i8, i8* %g1
61   %t2 = load i8, i8* %g2
62   %t3 = load i8, i8* %g3
63   %t4 = load i8, i8* %g4
64   %t5 = load i8, i8* %g5
65   %t6 = load i8, i8* %g6
66   %t7 = load i8, i8* %g7
68   %z0 = zext i8 %t0 to i64
69   %z1 = zext i8 %t1 to i64
70   %z2 = zext i8 %t2 to i64
71   %z3 = zext i8 %t3 to i64
72   %z4 = zext i8 %t4 to i64
73   %z5 = zext i8 %t5 to i64
74   %z6 = zext i8 %t6 to i64
75   %z7 = zext i8 %t7 to i64
77   %sh0 = shl nuw i64 %z0, 56
78   %sh1 = shl nuw nsw i64 %z1, 48
79   %sh2 = shl nuw nsw i64 %z2, 40
80   %sh3 = shl nuw nsw i64 %z3, 32
81   %sh4 = shl nuw nsw i64 %z4, 24
82   %sh5 = shl nuw nsw i64 %z5, 16
83   %sh6 = shl nuw nsw i64 %z6, 8
84 ;  %sh7 = shl nuw nsw i64 %z7, 0 <-- missing phantom shift
86   %or01 = or i64 %sh0, %sh1
87   %or012 = or i64 %or01, %sh2
88   %or0123 = or i64 %or012, %sh3
89   %or01234 = or i64 %or0123, %sh4
90   %or012345 = or i64 %or01234, %sh5
91   %or0123456 = or i64 %or012345, %sh6
92   %or01234567 = or i64 %or0123456, %z7
93   ret i64 %or01234567
96 define i64 @load_bswap_nop_shift(%v8i8* %p) {
97 ; CHECK-LABEL: @load_bswap_nop_shift(
98 ; CHECK-NEXT:    [[G0:%.*]] = getelementptr inbounds [[V8I8:%.*]], %v8i8* [[P:%.*]], i64 0, i32 0
99 ; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 1
100 ; CHECK-NEXT:    [[G2:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 2
101 ; CHECK-NEXT:    [[G3:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 3
102 ; CHECK-NEXT:    [[G4:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 4
103 ; CHECK-NEXT:    [[G5:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 5
104 ; CHECK-NEXT:    [[G6:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 6
105 ; CHECK-NEXT:    [[G7:%.*]] = getelementptr inbounds [[V8I8]], %v8i8* [[P]], i64 0, i32 7
106 ; CHECK-NEXT:    [[T0:%.*]] = load i8, i8* [[G0]]
107 ; CHECK-NEXT:    [[T1:%.*]] = load i8, i8* [[G1]]
108 ; CHECK-NEXT:    [[T2:%.*]] = load i8, i8* [[G2]]
109 ; CHECK-NEXT:    [[T3:%.*]] = load i8, i8* [[G3]]
110 ; CHECK-NEXT:    [[T4:%.*]] = load i8, i8* [[G4]]
111 ; CHECK-NEXT:    [[T5:%.*]] = load i8, i8* [[G5]]
112 ; CHECK-NEXT:    [[T6:%.*]] = load i8, i8* [[G6]]
113 ; CHECK-NEXT:    [[T7:%.*]] = load i8, i8* [[G7]]
114 ; CHECK-NEXT:    [[Z0:%.*]] = zext i8 [[T0]] to i64
115 ; CHECK-NEXT:    [[Z1:%.*]] = zext i8 [[T1]] to i64
116 ; CHECK-NEXT:    [[Z2:%.*]] = zext i8 [[T2]] to i64
117 ; CHECK-NEXT:    [[Z3:%.*]] = zext i8 [[T3]] to i64
118 ; CHECK-NEXT:    [[Z4:%.*]] = zext i8 [[T4]] to i64
119 ; CHECK-NEXT:    [[Z5:%.*]] = zext i8 [[T5]] to i64
120 ; CHECK-NEXT:    [[Z6:%.*]] = zext i8 [[T6]] to i64
121 ; CHECK-NEXT:    [[Z7:%.*]] = zext i8 [[T7]] to i64
122 ; CHECK-NEXT:    [[SH0:%.*]] = shl nuw i64 [[Z0]], 56
123 ; CHECK-NEXT:    [[SH1:%.*]] = shl nuw nsw i64 [[Z1]], 48
124 ; CHECK-NEXT:    [[SH2:%.*]] = shl nuw nsw i64 [[Z2]], 40
125 ; CHECK-NEXT:    [[SH3:%.*]] = shl nuw nsw i64 [[Z3]], 32
126 ; CHECK-NEXT:    [[SH4:%.*]] = shl nuw nsw i64 [[Z4]], 24
127 ; CHECK-NEXT:    [[SH5:%.*]] = shl nuw nsw i64 [[Z5]], 16
128 ; CHECK-NEXT:    [[SH6:%.*]] = shl nuw nsw i64 [[Z6]], 8
129 ; CHECK-NEXT:    [[SH7:%.*]] = shl nuw nsw i64 [[Z7]], 0
130 ; CHECK-NEXT:    [[OR01:%.*]] = or i64 [[SH0]], [[SH1]]
131 ; CHECK-NEXT:    [[OR012:%.*]] = or i64 [[OR01]], [[SH2]]
132 ; CHECK-NEXT:    [[OR0123:%.*]] = or i64 [[OR012]], [[SH3]]
133 ; CHECK-NEXT:    [[OR01234:%.*]] = or i64 [[OR0123]], [[SH4]]
134 ; CHECK-NEXT:    [[OR012345:%.*]] = or i64 [[OR01234]], [[SH5]]
135 ; CHECK-NEXT:    [[OR0123456:%.*]] = or i64 [[OR012345]], [[SH6]]
136 ; CHECK-NEXT:    [[OR01234567:%.*]] = or i64 [[OR0123456]], [[SH7]]
137 ; CHECK-NEXT:    ret i64 [[OR01234567]]
139   %g0 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 0
140   %g1 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 1
141   %g2 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 2
142   %g3 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 3
143   %g4 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 4
144   %g5 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 5
145   %g6 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 6
146   %g7 = getelementptr inbounds %v8i8, %v8i8* %p, i64 0, i32 7
148   %t0 = load i8, i8* %g0
149   %t1 = load i8, i8* %g1
150   %t2 = load i8, i8* %g2
151   %t3 = load i8, i8* %g3
152   %t4 = load i8, i8* %g4
153   %t5 = load i8, i8* %g5
154   %t6 = load i8, i8* %g6
155   %t7 = load i8, i8* %g7
157   %z0 = zext i8 %t0 to i64
158   %z1 = zext i8 %t1 to i64
159   %z2 = zext i8 %t2 to i64
160   %z3 = zext i8 %t3 to i64
161   %z4 = zext i8 %t4 to i64
162   %z5 = zext i8 %t5 to i64
163   %z6 = zext i8 %t6 to i64
164   %z7 = zext i8 %t7 to i64
166   %sh0 = shl nuw i64 %z0, 56
167   %sh1 = shl nuw nsw i64 %z1, 48
168   %sh2 = shl nuw nsw i64 %z2, 40
169   %sh3 = shl nuw nsw i64 %z3, 32
170   %sh4 = shl nuw nsw i64 %z4, 24
171   %sh5 = shl nuw nsw i64 %z5, 16
172   %sh6 = shl nuw nsw i64 %z6, 8
173   %sh7 = shl nuw nsw i64 %z7, 0
175   %or01 = or i64 %sh0, %sh1
176   %or012 = or i64 %or01, %sh2
177   %or0123 = or i64 %or012, %sh3
178   %or01234 = or i64 %or0123, %sh4
179   %or012345 = or i64 %or01234, %sh5
180   %or0123456 = or i64 %or012345, %sh6
181   %or01234567 = or i64 %or0123456, %sh7
182   ret i64 %or01234567
185 ; https://bugs.llvm.org/show_bug.cgi?id=42708
187 define i64 @load64le(i8* %arg) {
188 ; CHECK-LABEL: @load64le(
189 ; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds i8, i8* [[ARG:%.*]], i64 1
190 ; CHECK-NEXT:    [[G2:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 2
191 ; CHECK-NEXT:    [[G3:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 3
192 ; CHECK-NEXT:    [[G4:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 4
193 ; CHECK-NEXT:    [[G5:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 5
194 ; CHECK-NEXT:    [[G6:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 6
195 ; CHECK-NEXT:    [[G7:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 7
196 ; CHECK-NEXT:    [[LD0:%.*]] = load i8, i8* [[ARG]], align 1
197 ; CHECK-NEXT:    [[LD1:%.*]] = load i8, i8* [[G1]], align 1
198 ; CHECK-NEXT:    [[LD2:%.*]] = load i8, i8* [[G2]], align 1
199 ; CHECK-NEXT:    [[LD3:%.*]] = load i8, i8* [[G3]], align 1
200 ; CHECK-NEXT:    [[LD4:%.*]] = load i8, i8* [[G4]], align 1
201 ; CHECK-NEXT:    [[LD5:%.*]] = load i8, i8* [[G5]], align 1
202 ; CHECK-NEXT:    [[LD6:%.*]] = load i8, i8* [[G6]], align 1
203 ; CHECK-NEXT:    [[LD7:%.*]] = load i8, i8* [[G7]], align 1
204 ; CHECK-NEXT:    [[Z0:%.*]] = zext i8 [[LD0]] to i64
205 ; CHECK-NEXT:    [[Z1:%.*]] = zext i8 [[LD1]] to i64
206 ; CHECK-NEXT:    [[Z2:%.*]] = zext i8 [[LD2]] to i64
207 ; CHECK-NEXT:    [[Z3:%.*]] = zext i8 [[LD3]] to i64
208 ; CHECK-NEXT:    [[Z4:%.*]] = zext i8 [[LD4]] to i64
209 ; CHECK-NEXT:    [[Z5:%.*]] = zext i8 [[LD5]] to i64
210 ; CHECK-NEXT:    [[Z6:%.*]] = zext i8 [[LD6]] to i64
211 ; CHECK-NEXT:    [[Z7:%.*]] = zext i8 [[LD7]] to i64
212 ; CHECK-NEXT:    [[S1:%.*]] = shl nuw nsw i64 [[Z1]], 8
213 ; CHECK-NEXT:    [[S2:%.*]] = shl nuw nsw i64 [[Z2]], 16
214 ; CHECK-NEXT:    [[S3:%.*]] = shl nuw nsw i64 [[Z3]], 24
215 ; CHECK-NEXT:    [[S4:%.*]] = shl nuw nsw i64 [[Z4]], 32
216 ; CHECK-NEXT:    [[S5:%.*]] = shl nuw nsw i64 [[Z5]], 40
217 ; CHECK-NEXT:    [[S6:%.*]] = shl nuw nsw i64 [[Z6]], 48
218 ; CHECK-NEXT:    [[S7:%.*]] = shl nuw i64 [[Z7]], 56
219 ; CHECK-NEXT:    [[O1:%.*]] = or i64 [[S1]], [[Z0]]
220 ; CHECK-NEXT:    [[O2:%.*]] = or i64 [[O1]], [[S2]]
221 ; CHECK-NEXT:    [[O3:%.*]] = or i64 [[O2]], [[S3]]
222 ; CHECK-NEXT:    [[O4:%.*]] = or i64 [[O3]], [[S4]]
223 ; CHECK-NEXT:    [[O5:%.*]] = or i64 [[O4]], [[S5]]
224 ; CHECK-NEXT:    [[O6:%.*]] = or i64 [[O5]], [[S6]]
225 ; CHECK-NEXT:    [[O7:%.*]] = or i64 [[O6]], [[S7]]
226 ; CHECK-NEXT:    ret i64 [[O7]]
228   %g1 = getelementptr inbounds i8, i8* %arg, i64 1
229   %g2 = getelementptr inbounds i8, i8* %arg, i64 2
230   %g3 = getelementptr inbounds i8, i8* %arg, i64 3
231   %g4 = getelementptr inbounds i8, i8* %arg, i64 4
232   %g5 = getelementptr inbounds i8, i8* %arg, i64 5
233   %g6 = getelementptr inbounds i8, i8* %arg, i64 6
234   %g7 = getelementptr inbounds i8, i8* %arg, i64 7
236   %ld0 = load i8, i8* %arg, align 1
237   %ld1 = load i8, i8* %g1, align 1
238   %ld2 = load i8, i8* %g2, align 1
239   %ld3 = load i8, i8* %g3, align 1
240   %ld4 = load i8, i8* %g4, align 1
241   %ld5 = load i8, i8* %g5, align 1
242   %ld6 = load i8, i8* %g6, align 1
243   %ld7 = load i8, i8* %g7, align 1
245   %z0 = zext i8 %ld0 to i64
246   %z1 = zext i8 %ld1 to i64
247   %z2 = zext i8 %ld2 to i64
248   %z3 = zext i8 %ld3 to i64
249   %z4 = zext i8 %ld4 to i64
250   %z5 = zext i8 %ld5 to i64
251   %z6 = zext i8 %ld6 to i64
252   %z7 = zext i8 %ld7 to i64
254 ;  %s0 = shl nuw nsw i64 %z0, 0 <-- missing phantom shift
255   %s1 = shl nuw nsw i64 %z1, 8
256   %s2 = shl nuw nsw i64 %z2, 16
257   %s3 = shl nuw nsw i64 %z3, 24
258   %s4 = shl nuw nsw i64 %z4, 32
259   %s5 = shl nuw nsw i64 %z5, 40
260   %s6 = shl nuw nsw i64 %z6, 48
261   %s7 = shl nuw i64 %z7, 56
263   %o1 = or i64 %s1, %z0
264   %o2 = or i64 %o1, %s2
265   %o3 = or i64 %o2, %s3
266   %o4 = or i64 %o3, %s4
267   %o5 = or i64 %o4, %s5
268   %o6 = or i64 %o5, %s6
269   %o7 = or i64 %o6, %s7
270   ret i64 %o7
273 define i64 @load64le_nop_shift(i8* %arg) {
274 ; CHECK-LABEL: @load64le_nop_shift(
275 ; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds i8, i8* [[ARG:%.*]], i64 1
276 ; CHECK-NEXT:    [[G2:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 2
277 ; CHECK-NEXT:    [[G3:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 3
278 ; CHECK-NEXT:    [[G4:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 4
279 ; CHECK-NEXT:    [[G5:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 5
280 ; CHECK-NEXT:    [[G6:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 6
281 ; CHECK-NEXT:    [[G7:%.*]] = getelementptr inbounds i8, i8* [[ARG]], i64 7
282 ; CHECK-NEXT:    [[LD0:%.*]] = load i8, i8* [[ARG]], align 1
283 ; CHECK-NEXT:    [[LD1:%.*]] = load i8, i8* [[G1]], align 1
284 ; CHECK-NEXT:    [[LD2:%.*]] = load i8, i8* [[G2]], align 1
285 ; CHECK-NEXT:    [[LD3:%.*]] = load i8, i8* [[G3]], align 1
286 ; CHECK-NEXT:    [[LD4:%.*]] = load i8, i8* [[G4]], align 1
287 ; CHECK-NEXT:    [[LD5:%.*]] = load i8, i8* [[G5]], align 1
288 ; CHECK-NEXT:    [[LD6:%.*]] = load i8, i8* [[G6]], align 1
289 ; CHECK-NEXT:    [[LD7:%.*]] = load i8, i8* [[G7]], align 1
290 ; CHECK-NEXT:    [[Z0:%.*]] = zext i8 [[LD0]] to i64
291 ; CHECK-NEXT:    [[Z1:%.*]] = zext i8 [[LD1]] to i64
292 ; CHECK-NEXT:    [[Z2:%.*]] = zext i8 [[LD2]] to i64
293 ; CHECK-NEXT:    [[Z3:%.*]] = zext i8 [[LD3]] to i64
294 ; CHECK-NEXT:    [[Z4:%.*]] = zext i8 [[LD4]] to i64
295 ; CHECK-NEXT:    [[Z5:%.*]] = zext i8 [[LD5]] to i64
296 ; CHECK-NEXT:    [[Z6:%.*]] = zext i8 [[LD6]] to i64
297 ; CHECK-NEXT:    [[Z7:%.*]] = zext i8 [[LD7]] to i64
298 ; CHECK-NEXT:    [[S0:%.*]] = shl nuw nsw i64 [[Z0]], 0
299 ; CHECK-NEXT:    [[S1:%.*]] = shl nuw nsw i64 [[Z1]], 8
300 ; CHECK-NEXT:    [[S2:%.*]] = shl nuw nsw i64 [[Z2]], 16
301 ; CHECK-NEXT:    [[S3:%.*]] = shl nuw nsw i64 [[Z3]], 24
302 ; CHECK-NEXT:    [[S4:%.*]] = shl nuw nsw i64 [[Z4]], 32
303 ; CHECK-NEXT:    [[S5:%.*]] = shl nuw nsw i64 [[Z5]], 40
304 ; CHECK-NEXT:    [[S6:%.*]] = shl nuw nsw i64 [[Z6]], 48
305 ; CHECK-NEXT:    [[S7:%.*]] = shl nuw i64 [[Z7]], 56
306 ; CHECK-NEXT:    [[O1:%.*]] = or i64 [[S1]], [[S0]]
307 ; CHECK-NEXT:    [[O2:%.*]] = or i64 [[O1]], [[S2]]
308 ; CHECK-NEXT:    [[O3:%.*]] = or i64 [[O2]], [[S3]]
309 ; CHECK-NEXT:    [[O4:%.*]] = or i64 [[O3]], [[S4]]
310 ; CHECK-NEXT:    [[O5:%.*]] = or i64 [[O4]], [[S5]]
311 ; CHECK-NEXT:    [[O6:%.*]] = or i64 [[O5]], [[S6]]
312 ; CHECK-NEXT:    [[O7:%.*]] = or i64 [[O6]], [[S7]]
313 ; CHECK-NEXT:    ret i64 [[O7]]
315   %g1 = getelementptr inbounds i8, i8* %arg, i64 1
316   %g2 = getelementptr inbounds i8, i8* %arg, i64 2
317   %g3 = getelementptr inbounds i8, i8* %arg, i64 3
318   %g4 = getelementptr inbounds i8, i8* %arg, i64 4
319   %g5 = getelementptr inbounds i8, i8* %arg, i64 5
320   %g6 = getelementptr inbounds i8, i8* %arg, i64 6
321   %g7 = getelementptr inbounds i8, i8* %arg, i64 7
323   %ld0 = load i8, i8* %arg, align 1
324   %ld1 = load i8, i8* %g1, align 1
325   %ld2 = load i8, i8* %g2, align 1
326   %ld3 = load i8, i8* %g3, align 1
327   %ld4 = load i8, i8* %g4, align 1
328   %ld5 = load i8, i8* %g5, align 1
329   %ld6 = load i8, i8* %g6, align 1
330   %ld7 = load i8, i8* %g7, align 1
332   %z0 = zext i8 %ld0 to i64
333   %z1 = zext i8 %ld1 to i64
334   %z2 = zext i8 %ld2 to i64
335   %z3 = zext i8 %ld3 to i64
336   %z4 = zext i8 %ld4 to i64
337   %z5 = zext i8 %ld5 to i64
338   %z6 = zext i8 %ld6 to i64
339   %z7 = zext i8 %ld7 to i64
341   %s0 = shl nuw nsw i64 %z0, 0
342   %s1 = shl nuw nsw i64 %z1, 8
343   %s2 = shl nuw nsw i64 %z2, 16
344   %s3 = shl nuw nsw i64 %z3, 24
345   %s4 = shl nuw nsw i64 %z4, 32
346   %s5 = shl nuw nsw i64 %z5, 40
347   %s6 = shl nuw nsw i64 %z6, 48
348   %s7 = shl nuw i64 %z7, 56
350   %o1 = or i64 %s1, %s0
351   %o2 = or i64 %o1, %s2
352   %o3 = or i64 %o2, %s3
353   %o4 = or i64 %o3, %s4
354   %o5 = or i64 %o4, %s5
355   %o6 = or i64 %o5, %s6
356   %o7 = or i64 %o6, %s7
357   ret i64 %o7