fix testcase for previous patch.
[oota-llvm.git] / test / CodeGen / X86 / abi-isel.ll
1 ; RUN: llvm-as < %s | llc -mtriple=i686-unknown-linux-gnu -march=x86 -relocation-model=static -code-model=small > %t
2 ; RUN: grep leal %t | count 33
3 ; RUN: grep movl %t | count 239
4 ; RUN: grep addl %t | count 20
5 ; RUN: grep subl %t | count 14
6 ; RUN: not grep leaq %t
7 ; RUN: not grep movq %t
8 ; RUN: not grep addq %t
9 ; RUN: not grep subq %t
10 ; RUN: not grep movabs %t
11 ; RUN: not grep largecomm %t
12 ; RUN: not grep _GLOBAL_OFFSET_TABLE_ %t
13 ; RUN: not grep @GOT %t
14 ; RUN: not grep @GOTOFF %t
15 ; RUN: not grep @GOTPCREL %t
16 ; RUN: not grep @GOTPLT %t
17 ; RUN: not grep @PLT %t
18 ; RUN: not grep @PLTOFF %t
19 ; RUN: grep {call       \\\*} %t | count 10
20 ; RUN: not grep %rip %t
21 ; RUN: llvm-as < %s | llc -mtriple=i686-unknown-linux-gnu -march=x86 -relocation-model=pic -code-model=small > %t
22 ; RUN: grep leal %t | count 43
23 ; RUN: grep movl %t | count 377
24 ; RUN: grep addl %t | count 179
25 ; RUN: grep subl %t | count 6
26 ; RUN: not grep leaq %t
27 ; RUN: not grep movq %t
28 ; RUN: not grep addq %t
29 ; RUN: not grep subq %t
30 ; RUN: not grep movabs %t
31 ; RUN: not grep largecomm %t
32 ; RUN: grep _GLOBAL_OFFSET_TABLE_ %t | count 148
33 ; RUN: grep @GOT %t | count 207
34 ; RUN: grep @GOTOFF %t | count 58
35 ; RUN: not grep @GOTPCREL %t
36 ; RUN: not grep @GOTPLT %t
37 ; RUN: grep @PLT %t | count 20
38 ; RUN: not grep @PLTOFF %t
39 ; RUN: grep {call       \\\*} %t | count 10
40 ; RUN: not grep {%rip} %t
41
42 ; RUN: llvm-as < %s | llc -mtriple=x86_64-unknown-linux-gnu -march=x86-64 -relocation-model=static -code-model=small | FileCheck %s -check-prefix=LINUX-64-STATIC
43
44 ; RUN: llvm-as < %s | llc -mtriple=x86_64-unknown-linux-gnu -march=x86-64 -relocation-model=pic -code-model=small > %t
45 ; RUN: not grep leal %t
46 ; RUN: grep movl %t | count 98
47 ; RUN: not grep addl %t
48 ; RUN: not grep subl %t
49 ; RUN: grep leaq %t | count 59
50 ; RUN: grep movq %t | count 195
51 ; RUN: grep addq %t | count 36
52 ; RUN: grep subq %t | count 11
53 ; RUN: not grep movabs %t
54 ; RUN: not grep largecomm %t
55 ; RUN: not grep _GLOBAL_OFFSET_TABLE_ %t
56 ; RUN: grep @GOT %t | count 149
57 ; RUN: not grep @GOTOFF %t
58 ; RUN: grep @GOTPCREL %t | count 149
59 ; RUN: not grep @GOTPLT %t
60 ; RUN: grep @PLT %t | count 20
61 ; RUN: not grep @PLTOFF %t
62 ; RUN: grep {call       \\\*} %t | count 10
63 ; RUN: grep {%rip} %t | count 207
64
65
66
67 ; RUN: llvm-as < %s | llc -mtriple=i686-apple-darwin -march=x86 -relocation-model=static -code-model=small > %t
68 ; RUN: grep leal %t | count 33
69 ; RUN: grep movl %t | count 239
70 ; RUN: grep addl %t | count 20
71 ; RUN: grep subl %t | count 14
72 ; RUN: not grep leaq %t
73 ; RUN: not grep movq %t
74 ; RUN: not grep addq %t
75 ; RUN: not grep subq %t
76 ; RUN: not grep movabs %t
77 ; RUN: not grep largecomm %t
78 ; RUN: not grep _GLOBAL_OFFSET_TABLE_ %t
79 ; RUN: not grep @GOT %t
80 ; RUN: not grep @GOTOFF %t
81 ; RUN: not grep @GOTPCREL %t
82 ; RUN: not grep @GOTPLT %t
83 ; RUN: not grep @PLT %t
84 ; RUN: not grep @PLTOFF %t
85 ; RUN: grep {call       \\\*} %t | count 10
86 ; RUN: not grep %rip %t
87 ; RUN: llvm-as < %s | llc -mtriple=i686-apple-darwin -march=x86 -relocation-model=dynamic-no-pic -code-model=small > %t
88 ; RUN: grep leal %t | count 31
89 ; RUN: grep movl %t | count 312
90 ; RUN: grep addl %t | count 32
91 ; RUN: grep subl %t | count 14
92 ; RUN: not grep leaq %t
93 ; RUN: not grep movq %t
94 ; RUN: not grep addq %t
95 ; RUN: not grep subq %t
96 ; RUN: not grep movabs %t
97 ; RUN: not grep largecomm %t
98 ; RUN: not grep _GLOBAL_OFFSET_TABLE_ %t
99 ; RUN: not grep @GOT %t
100 ; RUN: not grep @GOTOFF %t
101 ; RUN: not grep @GOTPCREL %t
102 ; RUN: not grep @GOTPLT %t
103 ; RUN: not grep @PLT %t
104 ; RUN: not grep @PLTOFF %t
105 ; RUN: grep {call       \\\*} %t | count 10
106 ; RUN: not grep {%rip} %t
107 ; RUN: llvm-as < %s | llc -mtriple=i686-apple-darwin -march=x86 -relocation-model=pic -code-model=small > %t
108 ; RUN: grep leal %t | count 57
109 ; RUN: grep movl %t | count 292
110 ; RUN: grep addl %t | count 32
111 ; RUN: grep subl %t | count 14
112 ; RUN: not grep leaq %t
113 ; RUN: not grep movq %t
114 ; RUN: not grep addq %t
115 ; RUN: not grep subq %t
116 ; RUN: not grep movabs %t
117 ; RUN: not grep largecomm %t
118 ; RUN: not grep _GLOBAL_OFFSET_TABLE_ %t
119 ; RUN: not grep @GOT %t
120 ; RUN: not grep @GOTOFF %t
121 ; RUN: not grep @GOTPCREL %t
122 ; RUN: not grep @GOTPLT %t
123 ; RUN: not grep @PLT %t
124 ; RUN: not grep @PLTOFF %t
125 ; RUN: grep {call       \\\*} %t | count 10
126 ; RUN: not grep {%rip} %t
127 ; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin -march=x86-64 -relocation-model=dynamic-no-pic -code-model=small > %t
128 ; RUN: not grep leal %t
129 ; RUN: grep movl %t | count 95
130 ; RUN: not grep addl %t
131 ; RUN: not grep subl %t
132 ; RUN: grep leaq %t | count 89
133 ; RUN: grep movq %t | count 142
134 ; RUN: grep addq %t | count 30
135 ; RUN: grep subq %t | count 12
136 ; RUN: not grep movabs %t
137 ; RUN: not grep largecomm %t
138 ; RUN: not grep _GLOBAL_OFFSET_TABLE_ %t
139 ; RUN: grep @GOT %t | count 92
140 ; RUN: not grep @GOTOFF %t
141 ; RUN: grep @GOTPCREL %t | count 92
142 ; RUN: not grep @GOTPLT %t
143 ; RUN: not grep @PLT %t
144 ; RUN: not grep @PLTOFF %t
145 ; RUN: grep {call       \\\*} %t | count 10
146 ; RUN: grep {%rip} %t | count 208
147 ; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin -march=x86-64 -relocation-model=pic -code-model=small > %t
148 ; RUN: not grep leal %t
149 ; RUN: grep movl %t | count 95
150 ; RUN: not grep addl %t
151 ; RUN: not grep subl %t
152 ; RUN: grep leaq %t | count 89
153 ; RUN: grep movq %t | count 142
154 ; RUN: grep addq %t | count 30
155 ; RUN: grep subq %t | count 12
156 ; RUN: not grep movabs %t
157 ; RUN: not grep largecomm %t
158 ; RUN: not grep _GLOBAL_OFFSET_TABLE_ %t
159 ; RUN: grep @GOT %t | count 92
160 ; RUN: not grep @GOTOFF %t
161 ; RUN: grep @GOTPCREL %t | count 92
162 ; RUN: not grep @GOTPLT %t
163 ; RUN: not grep @PLT %t
164 ; RUN: not grep @PLTOFF %t
165 ; RUN: grep {call       \\\*} %t | count 10
166 ; RUN: grep {%rip} %t | count 208
167
168 @src = external global [131072 x i32]
169 @dst = external global [131072 x i32]
170 @xsrc = external global [32 x i32]
171 @xdst = external global [32 x i32]
172 @ptr = external global i32*
173 @dsrc = global [131072 x i32] zeroinitializer, align 32
174 @ddst = global [131072 x i32] zeroinitializer, align 32
175 @dptr = global i32* null
176 @lsrc = internal global [131072 x i32] zeroinitializer
177 @ldst = internal global [131072 x i32] zeroinitializer
178 @lptr = internal global i32* null
179 @ifunc = external global void ()*
180 @difunc = global void ()* null
181 @lifunc = internal global void ()* null
182 @lxsrc = internal global [32 x i32] zeroinitializer, align 32
183 @lxdst = internal global [32 x i32] zeroinitializer, align 32
184 @dxsrc = global [32 x i32] zeroinitializer, align 32
185 @dxdst = global [32 x i32] zeroinitializer, align 32
186
187 define void @foo00() nounwind {
188 entry:
189         %0 = load i32* getelementptr ([131072 x i32]* @src, i32 0, i64 0), align 4
190         store i32 %0, i32* getelementptr ([131072 x i32]* @dst, i32 0, i64 0), align 4
191         ret void
192
193 ; LINUX-64-STATIC: foo00:
194 ; LINUX-64-STATIC: movl src, %eax
195 ; LINUX-64-STATIC: movl %eax, dst
196 ; LINUX-64-STATIC: ret
197 }
198
199 define void @fxo00() nounwind {
200 entry:
201         %0 = load i32* getelementptr ([32 x i32]* @xsrc, i32 0, i64 0), align 4
202         store i32 %0, i32* getelementptr ([32 x i32]* @xdst, i32 0, i64 0), align 4
203         ret void
204
205 ; LINUX-64-STATIC: fxo00:
206 ; LINUX-64-STATIC: movl xsrc, %eax
207 ; LINUX-64-STATIC: movl %eax, xdst
208 ; LINUX-64-STATIC: ret
209 }
210
211 define void @foo01() nounwind {
212 entry:
213         store i32* getelementptr ([131072 x i32]* @dst, i32 0, i32 0), i32** @ptr, align 8
214         ret void
215 ; LINUX-64-STATIC: foo01:
216 ; LINUX-64-STATIC: movq $dst, ptr
217 ; LINUX-64-STATIC: ret
218 }
219
220 define void @fxo01() nounwind {
221 entry:
222         store i32* getelementptr ([32 x i32]* @xdst, i32 0, i32 0), i32** @ptr, align 8
223         ret void
224 ; LINUX-64-STATIC: fxo01:
225 ; LINUX-64-STATIC: movq $xdst, ptr
226 ; LINUX-64-STATIC: ret
227 }
228
229 define void @foo02() nounwind {
230 entry:
231         %0 = load i32** @ptr, align 8
232         %1 = load i32* getelementptr ([131072 x i32]* @src, i32 0, i64 0), align 4
233         store i32 %1, i32* %0, align 4
234         ret void
235 ; LINUX-64-STATIC: foo02:
236 ; LINUX-64-STATIC: movl    src, %
237 ; LINUX-64-STATIC: movq    ptr, %
238 ; LINUX-64-STATIC: movl
239 ; LINUX-64-STATIC: ret
240 }
241
242 define void @fxo02() nounwind {
243 entry:
244         %0 = load i32** @ptr, align 8
245         %1 = load i32* getelementptr ([32 x i32]* @xsrc, i32 0, i64 0), align 4
246         store i32 %1, i32* %0, align 4
247 ; LINUX-64-STATIC: fxo02:
248 ; LINUX-64-STATIC: movl    xsrc, %
249 ; LINUX-64-STATIC: movq    ptr, %
250 ; LINUX-64-STATIC: movl
251 ; LINUX-64-STATIC: ret
252         ret void
253 }
254
255 define void @foo03() nounwind {
256 entry:
257         %0 = load i32* getelementptr ([131072 x i32]* @dsrc, i32 0, i64 0), align 32
258         store i32 %0, i32* getelementptr ([131072 x i32]* @ddst, i32 0, i64 0), align 32
259         ret void
260 ; LINUX-64-STATIC: foo03:
261 ; LINUX-64-STATIC: movl    dsrc, %eax
262 ; LINUX-64-STATIC: movl    %eax, ddst
263 ; LINUX-64-STATIC: ret
264 }
265
266 define void @foo04() nounwind {
267 entry:
268         store i32* getelementptr ([131072 x i32]* @ddst, i32 0, i32 0), i32** @dptr, align 8
269         ret void
270 ; LINUX-64-STATIC: foo04:
271 ; LINUX-64-STATIC: movq    $ddst, dptr
272 ; LINUX-64-STATIC: ret
273 }
274
275 define void @foo05() nounwind {
276 entry:
277         %0 = load i32** @dptr, align 8
278         %1 = load i32* getelementptr ([131072 x i32]* @dsrc, i32 0, i64 0), align 32
279         store i32 %1, i32* %0, align 4
280         ret void
281 ; LINUX-64-STATIC: foo05:
282 ; LINUX-64-STATIC: movl    dsrc, %
283 ; LINUX-64-STATIC: movq    dptr, %
284 ; LINUX-64-STATIC: movl
285 ; LINUX-64-STATIC: ret
286 }
287
288 define void @foo06() nounwind {
289 entry:
290         %0 = load i32* getelementptr ([131072 x i32]* @lsrc, i32 0, i64 0), align 4
291         store i32 %0, i32* getelementptr ([131072 x i32]* @ldst, i32 0, i64 0), align 4
292         ret void
293 ; LINUX-64-STATIC: foo06:
294 ; LINUX-64-STATIC: movl    lsrc, %eax
295 ; LINUX-64-STATIC: movl    %eax, ldst
296 ; LINUX-64-STATIC: ret
297 }
298
299 define void @foo07() nounwind {
300 entry:
301         store i32* getelementptr ([131072 x i32]* @ldst, i32 0, i32 0), i32** @lptr, align 8
302         ret void
303 ; LINUX-64-STATIC: foo07:
304 ; LINUX-64-STATIC: movq    $ldst, lptr
305 ; LINUX-64-STATIC: ret
306 }
307
308 define void @foo08() nounwind {
309 entry:
310         %0 = load i32** @lptr, align 8
311         %1 = load i32* getelementptr ([131072 x i32]* @lsrc, i32 0, i64 0), align 4
312         store i32 %1, i32* %0, align 4
313         ret void
314 ; LINUX-64-STATIC: foo08:
315 ; LINUX-64-STATIC: movl    lsrc, %
316 ; LINUX-64-STATIC: movq    lptr, %
317 ; LINUX-64-STATIC: movl
318 ; LINUX-64-STATIC: ret
319 }
320
321 define void @qux00() nounwind {
322 entry:
323         %0 = load i32* getelementptr ([131072 x i32]* @src, i32 0, i64 16), align 4
324         store i32 %0, i32* getelementptr ([131072 x i32]* @dst, i32 0, i64 16), align 4
325         ret void
326 ; LINUX-64-STATIC: qux00:
327 ; LINUX-64-STATIC: movl    src+64, %eax
328 ; LINUX-64-STATIC: movl    %eax, dst+64
329 ; LINUX-64-STATIC: ret
330 }
331
332 define void @qxx00() nounwind {
333 entry:
334         %0 = load i32* getelementptr ([32 x i32]* @xsrc, i32 0, i64 16), align 4
335         store i32 %0, i32* getelementptr ([32 x i32]* @xdst, i32 0, i64 16), align 4
336         ret void
337 ; LINUX-64-STATIC: qxx00:
338 ; LINUX-64-STATIC: movl    xsrc+64, %eax
339 ; LINUX-64-STATIC: movl    %eax, xdst+64
340 ; LINUX-64-STATIC: ret
341 }
342
343 define void @qux01() nounwind {
344 entry:
345         store i32* getelementptr ([131072 x i32]* @dst, i32 0, i64 16), i32** @ptr, align 8
346         ret void
347 ; LINUX-64-STATIC: qux01:
348 ; LINUX-64-STATIC: movq    $dst+64, ptr
349 ; LINUX-64-STATIC: ret
350 }
351
352 define void @qxx01() nounwind {
353 entry:
354         store i32* getelementptr ([32 x i32]* @xdst, i32 0, i64 16), i32** @ptr, align 8
355         ret void
356 ; LINUX-64-STATIC: qxx01:
357 ; LINUX-64-STATIC: movq    $xdst+64, ptr
358 ; LINUX-64-STATIC: ret
359 }
360
361 define void @qux02() nounwind {
362 entry:
363         %0 = load i32** @ptr, align 8
364         %1 = load i32* getelementptr ([131072 x i32]* @src, i32 0, i64 16), align 4
365         %2 = getelementptr i32* %0, i64 16
366         store i32 %1, i32* %2, align 4
367 ; LINUX-64-STATIC: qux02:
368 ; LINUX-64-STATIC: movl    src+64, %eax
369 ; LINUX-64-STATIC: movq    ptr, %rcx
370 ; LINUX-64-STATIC: movl    %eax, 64(%rcx)
371 ; LINUX-64-STATIC: ret
372         ret void
373 }
374
375 define void @qxx02() nounwind {
376 entry:
377         %0 = load i32** @ptr, align 8
378         %1 = load i32* getelementptr ([32 x i32]* @xsrc, i32 0, i64 16), align 4
379         %2 = getelementptr i32* %0, i64 16
380         store i32 %1, i32* %2, align 4
381 ; LINUX-64-STATIC: qxx02:
382 ; LINUX-64-STATIC: movl    xsrc+64, %eax
383 ; LINUX-64-STATIC: movq    ptr, %rcx
384 ; LINUX-64-STATIC: movl    %eax, 64(%rcx)
385 ; LINUX-64-STATIC: ret
386         ret void
387 }
388
389 define void @qux03() nounwind {
390 entry:
391         %0 = load i32* getelementptr ([131072 x i32]* @dsrc, i32 0, i64 16), align 32
392         store i32 %0, i32* getelementptr ([131072 x i32]* @ddst, i32 0, i64 16), align 32
393         ret void
394 ; LINUX-64-STATIC: qux03:
395 ; LINUX-64-STATIC: movl    dsrc+64, %eax
396 ; LINUX-64-STATIC: movl    %eax, ddst+64
397 ; LINUX-64-STATIC: ret
398 }
399
400 define void @qux04() nounwind {
401 entry:
402         store i32* getelementptr ([131072 x i32]* @ddst, i32 0, i64 16), i32** @dptr, align 8
403         ret void
404 ; LINUX-64-STATIC: qux04:
405 ; LINUX-64-STATIC: movq    $ddst+64, dptr
406 ; LINUX-64-STATIC: ret
407 }
408
409 define void @qux05() nounwind {
410 entry:
411         %0 = load i32** @dptr, align 8
412         %1 = load i32* getelementptr ([131072 x i32]* @dsrc, i32 0, i64 16), align 32
413         %2 = getelementptr i32* %0, i64 16
414         store i32 %1, i32* %2, align 4
415 ; LINUX-64-STATIC: qux05:
416 ; LINUX-64-STATIC: movl    dsrc+64, %eax
417 ; LINUX-64-STATIC: movq    dptr, %rcx
418 ; LINUX-64-STATIC: movl    %eax, 64(%rcx)
419 ; LINUX-64-STATIC: ret
420         ret void
421 }
422
423 define void @qux06() nounwind {
424 entry:
425         %0 = load i32* getelementptr ([131072 x i32]* @lsrc, i32 0, i64 16), align 4
426         store i32 %0, i32* getelementptr ([131072 x i32]* @ldst, i32 0, i64 16), align 4
427         ret void
428 ; LINUX-64-STATIC: qux06:
429 ; LINUX-64-STATIC: movl    lsrc+64, %eax
430 ; LINUX-64-STATIC: movl    %eax, ldst+64
431 ; LINUX-64-STATIC: ret
432 }
433
434 define void @qux07() nounwind {
435 entry:
436         store i32* getelementptr ([131072 x i32]* @ldst, i32 0, i64 16), i32** @lptr, align 8
437         ret void
438 ; LINUX-64-STATIC: qux07:
439 ; LINUX-64-STATIC: movq    $ldst+64, lptr
440 ; LINUX-64-STATIC: ret
441 }
442
443 define void @qux08() nounwind {
444 entry:
445         %0 = load i32** @lptr, align 8
446         %1 = load i32* getelementptr ([131072 x i32]* @lsrc, i32 0, i64 16), align 4
447         %2 = getelementptr i32* %0, i64 16
448         store i32 %1, i32* %2, align 4
449 ; LINUX-64-STATIC: qux08:
450 ; LINUX-64-STATIC: movl    lsrc+64, %eax
451 ; LINUX-64-STATIC: movq    lptr, %rcx
452 ; LINUX-64-STATIC: movl    %eax, 64(%rcx)
453 ; LINUX-64-STATIC: ret
454         ret void
455 }
456
457 define void @ind00(i64 %i) nounwind {
458 entry:
459         %0 = getelementptr [131072 x i32]* @src, i64 0, i64 %i
460         %1 = load i32* %0, align 4
461         %2 = getelementptr [131072 x i32]* @dst, i64 0, i64 %i
462         store i32 %1, i32* %2, align 4
463         ret void
464 ; LINUX-64-STATIC: ind00:
465 ; LINUX-64-STATIC: movl    src(,%rdi,4), %eax
466 ; LINUX-64-STATIC: movl    %eax, dst(,%rdi,4)
467 ; LINUX-64-STATIC: ret
468 }
469
470 define void @ixd00(i64 %i) nounwind {
471 entry:
472         %0 = getelementptr [32 x i32]* @xsrc, i64 0, i64 %i
473         %1 = load i32* %0, align 4
474         %2 = getelementptr [32 x i32]* @xdst, i64 0, i64 %i
475         store i32 %1, i32* %2, align 4
476         ret void
477 ; LINUX-64-STATIC: ixd00:
478 ; LINUX-64-STATIC: movl    xsrc(,%rdi,4), %eax
479 ; LINUX-64-STATIC: movl    %eax, xdst(,%rdi,4)
480 ; LINUX-64-STATIC: ret
481 }
482
483 define void @ind01(i64 %i) nounwind {
484 entry:
485         %0 = getelementptr [131072 x i32]* @dst, i64 0, i64 %i
486         store i32* %0, i32** @ptr, align 8
487         ret void
488 ; LINUX-64-STATIC: ind01:
489 ; LINUX-64-STATIC: leaq    dst(,%rdi,4), %rax
490 ; LINUX-64-STATIC: movq    %rax, ptr
491 ; LINUX-64-STATIC: ret
492 }
493
494 define void @ixd01(i64 %i) nounwind {
495 entry:
496         %0 = getelementptr [32 x i32]* @xdst, i64 0, i64 %i
497         store i32* %0, i32** @ptr, align 8
498         ret void
499 ; LINUX-64-STATIC: ixd01:
500 ; LINUX-64-STATIC: leaq    xdst(,%rdi,4), %rax
501 ; LINUX-64-STATIC: movq    %rax, ptr
502 ; LINUX-64-STATIC: ret
503 }
504
505 define void @ind02(i64 %i) nounwind {
506 entry:
507         %0 = load i32** @ptr, align 8
508         %1 = getelementptr [131072 x i32]* @src, i64 0, i64 %i
509         %2 = load i32* %1, align 4
510         %3 = getelementptr i32* %0, i64 %i
511         store i32 %2, i32* %3, align 4
512         ret void
513 ; LINUX-64-STATIC: ind02:
514 ; LINUX-64-STATIC: movl    src(,%rdi,4), %eax
515 ; LINUX-64-STATIC: movq    ptr, %rcx
516 ; LINUX-64-STATIC: movl    %eax, (%rcx,%rdi,4)
517 ; LINUX-64-STATIC: ret
518 }
519
520 define void @ixd02(i64 %i) nounwind {
521 entry:
522         %0 = load i32** @ptr, align 8
523         %1 = getelementptr [32 x i32]* @xsrc, i64 0, i64 %i
524         %2 = load i32* %1, align 4
525         %3 = getelementptr i32* %0, i64 %i
526         store i32 %2, i32* %3, align 4
527         ret void
528 ; LINUX-64-STATIC: ixd02:
529 ; LINUX-64-STATIC: movl    xsrc(,%rdi,4), %eax
530 ; LINUX-64-STATIC: movq    ptr, %rcx
531 ; LINUX-64-STATIC: movl    %eax, (%rcx,%rdi,4)
532 ; LINUX-64-STATIC: ret
533 }
534
535 define void @ind03(i64 %i) nounwind {
536 entry:
537         %0 = getelementptr [131072 x i32]* @dsrc, i64 0, i64 %i
538         %1 = load i32* %0, align 4
539         %2 = getelementptr [131072 x i32]* @ddst, i64 0, i64 %i
540         store i32 %1, i32* %2, align 4
541         ret void
542 ; LINUX-64-STATIC: ind03:
543 ; LINUX-64-STATIC: movl    dsrc(,%rdi,4), %eax
544 ; LINUX-64-STATIC: movl    %eax, ddst(,%rdi,4)
545 ; LINUX-64-STATIC: ret
546 }
547
548 define void @ind04(i64 %i) nounwind {
549 entry:
550         %0 = getelementptr [131072 x i32]* @ddst, i64 0, i64 %i
551         store i32* %0, i32** @dptr, align 8
552         ret void
553 ; LINUX-64-STATIC: ind04:
554 ; LINUX-64-STATIC: leaq    ddst(,%rdi,4), %rax
555 ; LINUX-64-STATIC: movq    %rax, dptr
556 ; LINUX-64-STATIC: ret
557 }
558
559 define void @ind05(i64 %i) nounwind {
560 entry:
561         %0 = load i32** @dptr, align 8
562         %1 = getelementptr [131072 x i32]* @dsrc, i64 0, i64 %i
563         %2 = load i32* %1, align 4
564         %3 = getelementptr i32* %0, i64 %i
565         store i32 %2, i32* %3, align 4
566         ret void
567 ; LINUX-64-STATIC: ind05:
568 ; LINUX-64-STATIC: movl    dsrc(,%rdi,4), %eax
569 ; LINUX-64-STATIC: movq    dptr, %rcx
570 ; LINUX-64-STATIC: movl    %eax, (%rcx,%rdi,4)
571 ; LINUX-64-STATIC: ret
572 }
573
574 define void @ind06(i64 %i) nounwind {
575 entry:
576         %0 = getelementptr [131072 x i32]* @lsrc, i64 0, i64 %i
577         %1 = load i32* %0, align 4
578         %2 = getelementptr [131072 x i32]* @ldst, i64 0, i64 %i
579         store i32 %1, i32* %2, align 4
580         ret void
581 ; LINUX-64-STATIC: ind06:
582 ; LINUX-64-STATIC: movl    lsrc(,%rdi,4), %eax
583 ; LINUX-64-STATIC: movl    %eax, ldst(,%rdi,4)
584 ; LINUX-64-STATIC: ret
585 }
586
587 define void @ind07(i64 %i) nounwind {
588 entry:
589         %0 = getelementptr [131072 x i32]* @ldst, i64 0, i64 %i
590         store i32* %0, i32** @lptr, align 8
591         ret void
592 ; LINUX-64-STATIC: ind07:
593 ; LINUX-64-STATIC: leaq    ldst(,%rdi,4), %rax
594 ; LINUX-64-STATIC: movq    %rax, lptr
595 ; LINUX-64-STATIC: ret
596 }
597
598 define void @ind08(i64 %i) nounwind {
599 entry:
600         %0 = load i32** @lptr, align 8
601         %1 = getelementptr [131072 x i32]* @lsrc, i64 0, i64 %i
602         %2 = load i32* %1, align 4
603         %3 = getelementptr i32* %0, i64 %i
604         store i32 %2, i32* %3, align 4
605         ret void
606 ; LINUX-64-STATIC: ind08:
607 ; LINUX-64-STATIC: movl    lsrc(,%rdi,4), %eax
608 ; LINUX-64-STATIC: movq    lptr, %rcx
609 ; LINUX-64-STATIC: movl    %eax, (%rcx,%rdi,4)
610 ; LINUX-64-STATIC: ret
611 }
612
613 define void @off00(i64 %i) nounwind {
614 entry:
615         %0 = add i64 %i, 16
616         %1 = getelementptr [131072 x i32]* @src, i64 0, i64 %0
617         %2 = load i32* %1, align 4
618         %3 = getelementptr [131072 x i32]* @dst, i64 0, i64 %0
619         store i32 %2, i32* %3, align 4
620         ret void
621 ; LINUX-64-STATIC: off00:
622 ; LINUX-64-STATIC: movl    src+64(,%rdi,4), %eax
623 ; LINUX-64-STATIC: movl    %eax, dst+64(,%rdi,4)
624 ; LINUX-64-STATIC: ret
625 }
626
627 define void @oxf00(i64 %i) nounwind {
628 entry:
629         %0 = add i64 %i, 16
630         %1 = getelementptr [32 x i32]* @xsrc, i64 0, i64 %0
631         %2 = load i32* %1, align 4
632         %3 = getelementptr [32 x i32]* @xdst, i64 0, i64 %0
633         store i32 %2, i32* %3, align 4
634         ret void
635 ; LINUX-64-STATIC: oxf00:
636 ; LINUX-64-STATIC: movl    xsrc+64(,%rdi,4), %eax
637 ; LINUX-64-STATIC: movl    %eax, xdst+64(,%rdi,4)
638 ; LINUX-64-STATIC: ret
639 }
640
641 define void @off01(i64 %i) nounwind {
642 entry:
643         %.sum = add i64 %i, 16
644         %0 = getelementptr [131072 x i32]* @dst, i64 0, i64 %.sum
645         store i32* %0, i32** @ptr, align 8
646         ret void
647 ; LINUX-64-STATIC: off01:
648 ; LINUX-64-STATIC: leaq    dst+64(,%rdi,4), %rax
649 ; LINUX-64-STATIC: movq    %rax, ptr
650 ; LINUX-64-STATIC: ret
651 }
652
653 define void @oxf01(i64 %i) nounwind {
654 entry:
655         %.sum = add i64 %i, 16
656         %0 = getelementptr [32 x i32]* @xdst, i64 0, i64 %.sum
657         store i32* %0, i32** @ptr, align 8
658         ret void
659 ; LINUX-64-STATIC: oxf01:
660 ; LINUX-64-STATIC: leaq    xdst+64(,%rdi,4), %rax
661 ; LINUX-64-STATIC: movq    %rax, ptr
662 ; LINUX-64-STATIC: ret
663 }
664
665 define void @off02(i64 %i) nounwind {
666 entry:
667         %0 = load i32** @ptr, align 8
668         %1 = add i64 %i, 16
669         %2 = getelementptr [131072 x i32]* @src, i64 0, i64 %1
670         %3 = load i32* %2, align 4
671         %4 = getelementptr i32* %0, i64 %1
672         store i32 %3, i32* %4, align 4
673         ret void
674 ; LINUX-64-STATIC: off02:
675 ; LINUX-64-STATIC: movl    src+64(,%rdi,4), %eax
676 ; LINUX-64-STATIC: movq    ptr, %rcx
677 ; LINUX-64-STATIC: movl    %eax, 64(%rcx,%rdi,4)
678 ; LINUX-64-STATIC: ret
679 }
680
681 define void @oxf02(i64 %i) nounwind {
682 entry:
683         %0 = load i32** @ptr, align 8
684         %1 = add i64 %i, 16
685         %2 = getelementptr [32 x i32]* @xsrc, i64 0, i64 %1
686         %3 = load i32* %2, align 4
687         %4 = getelementptr i32* %0, i64 %1
688         store i32 %3, i32* %4, align 4
689         ret void
690 ; LINUX-64-STATIC: oxf02:
691 ; LINUX-64-STATIC: movl    xsrc+64(,%rdi,4), %eax
692 ; LINUX-64-STATIC: movq    ptr, %rcx
693 ; LINUX-64-STATIC: movl    %eax, 64(%rcx,%rdi,4)
694 ; LINUX-64-STATIC: ret
695 }
696
697 define void @off03(i64 %i) nounwind {
698 entry:
699         %0 = add i64 %i, 16
700         %1 = getelementptr [131072 x i32]* @dsrc, i64 0, i64 %0
701         %2 = load i32* %1, align 4
702         %3 = getelementptr [131072 x i32]* @ddst, i64 0, i64 %0
703         store i32 %2, i32* %3, align 4
704         ret void
705 ; LINUX-64-STATIC: off03:
706 ; LINUX-64-STATIC: movl    dsrc+64(,%rdi,4), %eax
707 ; LINUX-64-STATIC: movl    %eax, ddst+64(,%rdi,4)
708 ; LINUX-64-STATIC: ret
709 }
710
711 define void @off04(i64 %i) nounwind {
712 entry:
713         %.sum = add i64 %i, 16
714         %0 = getelementptr [131072 x i32]* @ddst, i64 0, i64 %.sum
715         store i32* %0, i32** @dptr, align 8
716         ret void
717 ; LINUX-64-STATIC: off04:
718 ; LINUX-64-STATIC: leaq    ddst+64(,%rdi,4), %rax
719 ; LINUX-64-STATIC: movq    %rax, dptr
720 ; LINUX-64-STATIC: ret
721 }
722
723 define void @off05(i64 %i) nounwind {
724 entry:
725         %0 = load i32** @dptr, align 8
726         %1 = add i64 %i, 16
727         %2 = getelementptr [131072 x i32]* @dsrc, i64 0, i64 %1
728         %3 = load i32* %2, align 4
729         %4 = getelementptr i32* %0, i64 %1
730         store i32 %3, i32* %4, align 4
731         ret void
732 ; LINUX-64-STATIC: off05:
733 ; LINUX-64-STATIC: movl    dsrc+64(,%rdi,4), %eax
734 ; LINUX-64-STATIC: movq    dptr, %rcx
735 ; LINUX-64-STATIC: movl    %eax, 64(%rcx,%rdi,4)
736 ; LINUX-64-STATIC: ret
737 }
738
739 define void @off06(i64 %i) nounwind {
740 entry:
741         %0 = add i64 %i, 16
742         %1 = getelementptr [131072 x i32]* @lsrc, i64 0, i64 %0
743         %2 = load i32* %1, align 4
744         %3 = getelementptr [131072 x i32]* @ldst, i64 0, i64 %0
745         store i32 %2, i32* %3, align 4
746         ret void
747 ; LINUX-64-STATIC: off06:
748 ; LINUX-64-STATIC: movl    lsrc+64(,%rdi,4), %eax
749 ; LINUX-64-STATIC: movl    %eax, ldst+64(,%rdi,4)
750 ; LINUX-64-STATIC: ret
751 }
752
753 define void @off07(i64 %i) nounwind {
754 entry:
755         %.sum = add i64 %i, 16
756         %0 = getelementptr [131072 x i32]* @ldst, i64 0, i64 %.sum
757         store i32* %0, i32** @lptr, align 8
758         ret void
759 ; LINUX-64-STATIC: off07:
760 ; LINUX-64-STATIC: leaq    ldst+64(,%rdi,4), %rax
761 ; LINUX-64-STATIC: movq    %rax, lptr
762 ; LINUX-64-STATIC: ret
763 }
764
765 define void @off08(i64 %i) nounwind {
766 entry:
767         %0 = load i32** @lptr, align 8
768         %1 = add i64 %i, 16
769         %2 = getelementptr [131072 x i32]* @lsrc, i64 0, i64 %1
770         %3 = load i32* %2, align 4
771         %4 = getelementptr i32* %0, i64 %1
772         store i32 %3, i32* %4, align 4
773         ret void
774 ; LINUX-64-STATIC: off08:
775 ; LINUX-64-STATIC: movl    lsrc+64(,%rdi,4), %eax
776 ; LINUX-64-STATIC: movq    lptr, %rcx
777 ; LINUX-64-STATIC: movl    %eax, 64(%rcx,%rdi,4)
778 ; LINUX-64-STATIC: ret
779 }
780
781 define void @moo00(i64 %i) nounwind {
782 entry:
783         %0 = load i32* getelementptr ([131072 x i32]* @src, i32 0, i64 65536), align 4
784         store i32 %0, i32* getelementptr ([131072 x i32]* @dst, i32 0, i64 65536), align 4
785         ret void
786 ; LINUX-64-STATIC: moo00:
787 ; LINUX-64-STATIC: movl    src+262144, %eax
788 ; LINUX-64-STATIC: movl    %eax, dst+262144
789 ; LINUX-64-STATIC: ret
790 }
791
792 define void @moo01(i64 %i) nounwind {
793 entry:
794         store i32* getelementptr ([131072 x i32]* @dst, i32 0, i64 65536), i32** @ptr, align 8
795         ret void
796 ; LINUX-64-STATIC: moo01:
797 ; LINUX-64-STATIC: movq    $dst+262144, ptr
798 ; LINUX-64-STATIC: ret
799 }
800
801 define void @moo02(i64 %i) nounwind {
802 entry:
803         %0 = load i32** @ptr, align 8
804         %1 = load i32* getelementptr ([131072 x i32]* @src, i32 0, i64 65536), align 4
805         %2 = getelementptr i32* %0, i64 65536
806         store i32 %1, i32* %2, align 4
807         ret void
808 ; LINUX-64-STATIC: moo02:
809 ; LINUX-64-STATIC: movl    src+262144, %eax
810 ; LINUX-64-STATIC: movq    ptr, %rcx
811 ; LINUX-64-STATIC: movl    %eax, 262144(%rcx)
812 ; LINUX-64-STATIC: ret
813 }
814
815 define void @moo03(i64 %i) nounwind {
816 entry:
817         %0 = load i32* getelementptr ([131072 x i32]* @dsrc, i32 0, i64 65536), align 32
818         store i32 %0, i32* getelementptr ([131072 x i32]* @ddst, i32 0, i64 65536), align 32
819         ret void
820 ; LINUX-64-STATIC: moo03:
821 ; LINUX-64-STATIC: movl    dsrc+262144, %eax
822 ; LINUX-64-STATIC: movl    %eax, ddst+262144
823 ; LINUX-64-STATIC: ret
824 }
825
826 define void @moo04(i64 %i) nounwind {
827 entry:
828         store i32* getelementptr ([131072 x i32]* @ddst, i32 0, i64 65536), i32** @dptr, align 8
829         ret void
830 ; LINUX-64-STATIC: moo04:
831 ; LINUX-64-STATIC: movq    $ddst+262144, dptr
832 ; LINUX-64-STATIC: ret
833 }
834
835 define void @moo05(i64 %i) nounwind {
836 entry:
837         %0 = load i32** @dptr, align 8
838         %1 = load i32* getelementptr ([131072 x i32]* @dsrc, i32 0, i64 65536), align 32
839         %2 = getelementptr i32* %0, i64 65536
840         store i32 %1, i32* %2, align 4
841         ret void
842 ; LINUX-64-STATIC: moo05:
843 ; LINUX-64-STATIC: movl    dsrc+262144, %eax
844 ; LINUX-64-STATIC: movq    dptr, %rcx
845 ; LINUX-64-STATIC: movl    %eax, 262144(%rcx)
846 ; LINUX-64-STATIC: ret
847 }
848
849 define void @moo06(i64 %i) nounwind {
850 entry:
851         %0 = load i32* getelementptr ([131072 x i32]* @lsrc, i32 0, i64 65536), align 4
852         store i32 %0, i32* getelementptr ([131072 x i32]* @ldst, i32 0, i64 65536), align 4
853         ret void
854 ; LINUX-64-STATIC: moo06:
855 ; LINUX-64-STATIC: movl    lsrc+262144, %eax
856 ; LINUX-64-STATIC: movl    %eax, ldst+262144
857 ; LINUX-64-STATIC: ret
858 }
859
860 define void @moo07(i64 %i) nounwind {
861 entry:
862         store i32* getelementptr ([131072 x i32]* @ldst, i32 0, i64 65536), i32** @lptr, align 8
863         ret void
864 ; LINUX-64-STATIC: moo07:
865 ; LINUX-64-STATIC: movq    $ldst+262144, lptr
866 ; LINUX-64-STATIC: ret
867 }
868
869 define void @moo08(i64 %i) nounwind {
870 entry:
871         %0 = load i32** @lptr, align 8
872         %1 = load i32* getelementptr ([131072 x i32]* @lsrc, i32 0, i64 65536), align 4
873         %2 = getelementptr i32* %0, i64 65536
874         store i32 %1, i32* %2, align 4
875         ret void
876 ; LINUX-64-STATIC: moo08:
877 ; LINUX-64-STATIC: movl    lsrc+262144, %eax
878 ; LINUX-64-STATIC: movq    lptr, %rcx
879 ; LINUX-64-STATIC: movl    %eax, 262144(%rcx)
880 ; LINUX-64-STATIC: ret
881 }
882
883 define void @big00(i64 %i) nounwind {
884 entry:
885         %0 = add i64 %i, 65536
886         %1 = getelementptr [131072 x i32]* @src, i64 0, i64 %0
887         %2 = load i32* %1, align 4
888         %3 = getelementptr [131072 x i32]* @dst, i64 0, i64 %0
889         store i32 %2, i32* %3, align 4
890         ret void
891 ; LINUX-64-STATIC: big00:
892 ; LINUX-64-STATIC: movl    src+262144(,%rdi,4), %eax
893 ; LINUX-64-STATIC: movl    %eax, dst+262144(,%rdi,4)
894 ; LINUX-64-STATIC: ret
895 }
896
897 define void @big01(i64 %i) nounwind {
898 entry:
899         %.sum = add i64 %i, 65536
900         %0 = getelementptr [131072 x i32]* @dst, i64 0, i64 %.sum
901         store i32* %0, i32** @ptr, align 8
902         ret void
903 ; LINUX-64-STATIC: big01:
904 ; LINUX-64-STATIC: leaq    dst+262144(,%rdi,4), %rax
905 ; LINUX-64-STATIC: movq    %rax, ptr
906 ; LINUX-64-STATIC: ret
907 }
908
909 define void @big02(i64 %i) nounwind {
910 entry:
911         %0 = load i32** @ptr, align 8
912         %1 = add i64 %i, 65536
913         %2 = getelementptr [131072 x i32]* @src, i64 0, i64 %1
914         %3 = load i32* %2, align 4
915         %4 = getelementptr i32* %0, i64 %1
916         store i32 %3, i32* %4, align 4
917         ret void
918 ; LINUX-64-STATIC: big02:
919 ; LINUX-64-STATIC: movl    src+262144(,%rdi,4), %eax
920 ; LINUX-64-STATIC: movq    ptr, %rcx
921 ; LINUX-64-STATIC: movl    %eax, 262144(%rcx,%rdi,4)
922 ; LINUX-64-STATIC: ret
923 }
924
925 define void @big03(i64 %i) nounwind {
926 entry:
927         %0 = add i64 %i, 65536
928         %1 = getelementptr [131072 x i32]* @dsrc, i64 0, i64 %0
929         %2 = load i32* %1, align 4
930         %3 = getelementptr [131072 x i32]* @ddst, i64 0, i64 %0
931         store i32 %2, i32* %3, align 4
932         ret void
933 ; LINUX-64-STATIC: big03:
934 ; LINUX-64-STATIC: movl    dsrc+262144(,%rdi,4), %eax
935 ; LINUX-64-STATIC: movl    %eax, ddst+262144(,%rdi,4)
936 ; LINUX-64-STATIC: ret
937 }
938
939 define void @big04(i64 %i) nounwind {
940 entry:
941         %.sum = add i64 %i, 65536
942         %0 = getelementptr [131072 x i32]* @ddst, i64 0, i64 %.sum
943         store i32* %0, i32** @dptr, align 8
944         ret void
945 ; LINUX-64-STATIC: big04:
946 ; LINUX-64-STATIC: leaq    ddst+262144(,%rdi,4), %rax
947 ; LINUX-64-STATIC: movq    %rax, dptr
948 ; LINUX-64-STATIC: ret
949 }
950
951 define void @big05(i64 %i) nounwind {
952 entry:
953         %0 = load i32** @dptr, align 8
954         %1 = add i64 %i, 65536
955         %2 = getelementptr [131072 x i32]* @dsrc, i64 0, i64 %1
956         %3 = load i32* %2, align 4
957         %4 = getelementptr i32* %0, i64 %1
958         store i32 %3, i32* %4, align 4
959         ret void
960 ; LINUX-64-STATIC: big05:
961 ; LINUX-64-STATIC: movl    dsrc+262144(,%rdi,4), %eax
962 ; LINUX-64-STATIC: movq    dptr, %rcx
963 ; LINUX-64-STATIC: movl    %eax, 262144(%rcx,%rdi,4)
964 ; LINUX-64-STATIC: ret
965 }
966
967 define void @big06(i64 %i) nounwind {
968 entry:
969         %0 = add i64 %i, 65536
970         %1 = getelementptr [131072 x i32]* @lsrc, i64 0, i64 %0
971         %2 = load i32* %1, align 4
972         %3 = getelementptr [131072 x i32]* @ldst, i64 0, i64 %0
973         store i32 %2, i32* %3, align 4
974         ret void
975 ; LINUX-64-STATIC: big06:
976 ; LINUX-64-STATIC: movl    lsrc+262144(,%rdi,4), %eax
977 ; LINUX-64-STATIC: movl    %eax, ldst+262144(,%rdi,4)
978 ; LINUX-64-STATIC: ret
979 }
980
981 define void @big07(i64 %i) nounwind {
982 entry:
983         %.sum = add i64 %i, 65536
984         %0 = getelementptr [131072 x i32]* @ldst, i64 0, i64 %.sum
985         store i32* %0, i32** @lptr, align 8
986         ret void
987 ; LINUX-64-STATIC: big07:
988 ; LINUX-64-STATIC: leaq    ldst+262144(,%rdi,4), %rax
989 ; LINUX-64-STATIC: movq    %rax, lptr
990 ; LINUX-64-STATIC: ret
991 }
992
993 define void @big08(i64 %i) nounwind {
994 entry:
995         %0 = load i32** @lptr, align 8
996         %1 = add i64 %i, 65536
997         %2 = getelementptr [131072 x i32]* @lsrc, i64 0, i64 %1
998         %3 = load i32* %2, align 4
999         %4 = getelementptr i32* %0, i64 %1
1000         store i32 %3, i32* %4, align 4
1001         ret void
1002 ; LINUX-64-STATIC: big08:
1003 ; LINUX-64-STATIC: movl    lsrc+262144(,%rdi,4), %eax
1004 ; LINUX-64-STATIC: movq    lptr, %rcx
1005 ; LINUX-64-STATIC: movl    %eax, 262144(%rcx,%rdi,4)
1006 ; LINUX-64-STATIC: ret
1007 }
1008
1009 define i8* @bar00() nounwind {
1010 entry:
1011         ret i8* bitcast ([131072 x i32]* @src to i8*)
1012 ; LINUX-64-STATIC: bar00:
1013 ; LINUX-64-STATIC: movl    $src, %eax
1014 ; LINUX-64-STATIC: ret
1015 }
1016
1017 define i8* @bxr00() nounwind {
1018 entry:
1019         ret i8* bitcast ([32 x i32]* @xsrc to i8*)
1020 ; LINUX-64-STATIC: bxr00:
1021 ; LINUX-64-STATIC: movl    $xsrc, %eax
1022 ; LINUX-64-STATIC: ret
1023 }
1024
1025 define i8* @bar01() nounwind {
1026 entry:
1027         ret i8* bitcast ([131072 x i32]* @dst to i8*)
1028 ; LINUX-64-STATIC: bar01:
1029 ; LINUX-64-STATIC: movl    $dst, %eax
1030 ; LINUX-64-STATIC: ret
1031 }
1032
1033 define i8* @bxr01() nounwind {
1034 entry:
1035         ret i8* bitcast ([32 x i32]* @xdst to i8*)
1036 ; LINUX-64-STATIC: bxr01:
1037 ; LINUX-64-STATIC: movl    $xdst, %eax
1038 ; LINUX-64-STATIC: ret
1039 }
1040
1041 define i8* @bar02() nounwind {
1042 entry:
1043         ret i8* bitcast (i32** @ptr to i8*)
1044 ; LINUX-64-STATIC: bar02:
1045 ; LINUX-64-STATIC: movl    $ptr, %eax
1046 ; LINUX-64-STATIC: ret
1047 }
1048
1049 define i8* @bar03() nounwind {
1050 entry:
1051         ret i8* bitcast ([131072 x i32]* @dsrc to i8*)
1052 ; LINUX-64-STATIC: bar03:
1053 ; LINUX-64-STATIC: movl    $dsrc, %eax
1054 ; LINUX-64-STATIC: ret
1055 }
1056
1057 define i8* @bar04() nounwind {
1058 entry:
1059         ret i8* bitcast ([131072 x i32]* @ddst to i8*)
1060 ; LINUX-64-STATIC: bar04:
1061 ; LINUX-64-STATIC: movl    $ddst, %eax
1062 ; LINUX-64-STATIC: ret
1063 }
1064
1065 define i8* @bar05() nounwind {
1066 entry:
1067         ret i8* bitcast (i32** @dptr to i8*)
1068 ; LINUX-64-STATIC: bar05:
1069 ; LINUX-64-STATIC: movl    $dptr, %eax
1070 ; LINUX-64-STATIC: ret
1071 }
1072
1073 define i8* @bar06() nounwind {
1074 entry:
1075         ret i8* bitcast ([131072 x i32]* @lsrc to i8*)
1076 ; LINUX-64-STATIC: bar06:
1077 ; LINUX-64-STATIC: movl    $lsrc, %eax
1078 ; LINUX-64-STATIC: ret
1079 }
1080
1081 define i8* @bar07() nounwind {
1082 entry:
1083         ret i8* bitcast ([131072 x i32]* @ldst to i8*)
1084 ; LINUX-64-STATIC: bar07:
1085 ; LINUX-64-STATIC: movl    $ldst, %eax
1086 ; LINUX-64-STATIC: ret
1087 }
1088
1089 define i8* @bar08() nounwind {
1090 entry:
1091         ret i8* bitcast (i32** @lptr to i8*)
1092 ; LINUX-64-STATIC: bar08:
1093 ; LINUX-64-STATIC: movl    $lptr, %eax
1094 ; LINUX-64-STATIC: ret
1095 }
1096
1097 define i8* @har00() nounwind {
1098 entry:
1099         ret i8* bitcast ([131072 x i32]* @src to i8*)
1100 ; LINUX-64-STATIC: har00:
1101 ; LINUX-64-STATIC: movl    $src, %eax
1102 ; LINUX-64-STATIC: ret
1103 }
1104
1105 define i8* @hxr00() nounwind {
1106 entry:
1107         ret i8* bitcast ([32 x i32]* @xsrc to i8*)
1108 ; LINUX-64-STATIC: hxr00:
1109 ; LINUX-64-STATIC: movl    $xsrc, %eax
1110 ; LINUX-64-STATIC: ret
1111 }
1112
1113 define i8* @har01() nounwind {
1114 entry:
1115         ret i8* bitcast ([131072 x i32]* @dst to i8*)
1116 ; LINUX-64-STATIC: har01:
1117 ; LINUX-64-STATIC: movl    $dst, %eax
1118 ; LINUX-64-STATIC: ret
1119 }
1120
1121 define i8* @hxr01() nounwind {
1122 entry:
1123         ret i8* bitcast ([32 x i32]* @xdst to i8*)
1124 ; LINUX-64-STATIC: hxr01:
1125 ; LINUX-64-STATIC: movl    $xdst, %eax
1126 ; LINUX-64-STATIC: ret
1127 }
1128
1129 define i8* @har02() nounwind {
1130 entry:
1131         %0 = load i32** @ptr, align 8
1132         %1 = bitcast i32* %0 to i8*
1133         ret i8* %1
1134 ; LINUX-64-STATIC: har02:
1135 ; LINUX-64-STATIC: movq    ptr, %rax
1136 ; LINUX-64-STATIC: ret
1137 }
1138
1139 define i8* @har03() nounwind {
1140 entry:
1141         ret i8* bitcast ([131072 x i32]* @dsrc to i8*)
1142 ; LINUX-64-STATIC: har03:
1143 ; LINUX-64-STATIC: movl    $dsrc, %eax
1144 ; LINUX-64-STATIC: ret
1145 }
1146
1147 define i8* @har04() nounwind {
1148 entry:
1149         ret i8* bitcast ([131072 x i32]* @ddst to i8*)
1150 ; LINUX-64-STATIC: har04:
1151 ; LINUX-64-STATIC: movl    $ddst, %eax
1152 ; LINUX-64-STATIC: ret
1153 }
1154
1155 define i8* @har05() nounwind {
1156 entry:
1157         %0 = load i32** @dptr, align 8
1158         %1 = bitcast i32* %0 to i8*
1159         ret i8* %1
1160 ; LINUX-64-STATIC: har05:
1161 ; LINUX-64-STATIC: movq    dptr, %rax
1162 ; LINUX-64-STATIC: ret
1163 }
1164
1165 define i8* @har06() nounwind {
1166 entry:
1167         ret i8* bitcast ([131072 x i32]* @lsrc to i8*)
1168 ; LINUX-64-STATIC: har06:
1169 ; LINUX-64-STATIC: movl    $lsrc, %eax
1170 ; LINUX-64-STATIC: ret
1171 }
1172
1173 define i8* @har07() nounwind {
1174 entry:
1175         ret i8* bitcast ([131072 x i32]* @ldst to i8*)
1176 ; LINUX-64-STATIC: har07:
1177 ; LINUX-64-STATIC: movl    $ldst, %eax
1178 ; LINUX-64-STATIC: ret
1179 }
1180
1181 define i8* @har08() nounwind {
1182 entry:
1183         %0 = load i32** @lptr, align 8
1184         %1 = bitcast i32* %0 to i8*
1185         ret i8* %1
1186 ; LINUX-64-STATIC: har08:
1187 ; LINUX-64-STATIC: movq    lptr, %rax
1188 ; LINUX-64-STATIC: ret
1189 }
1190
1191 define i8* @bat00() nounwind {
1192 entry:
1193         ret i8* bitcast (i32* getelementptr ([131072 x i32]* @src, i32 0, i64 16) to i8*)
1194 ; LINUX-64-STATIC: bat00:
1195 ; LINUX-64-STATIC: movl    $src+64, %eax
1196 ; LINUX-64-STATIC: ret
1197 }
1198
1199 define i8* @bxt00() nounwind {
1200 entry:
1201         ret i8* bitcast (i32* getelementptr ([32 x i32]* @xsrc, i32 0, i64 16) to i8*)
1202 ; LINUX-64-STATIC: bxt00:
1203 ; LINUX-64-STATIC: movl    $xsrc+64, %eax
1204 ; LINUX-64-STATIC: ret
1205 }
1206
1207 define i8* @bat01() nounwind {
1208 entry:
1209         ret i8* bitcast (i32* getelementptr ([131072 x i32]* @dst, i32 0, i64 16) to i8*)
1210 ; LINUX-64-STATIC: bat01:
1211 ; LINUX-64-STATIC: movl    $dst+64, %eax
1212 ; LINUX-64-STATIC: ret
1213 }
1214
1215 define i8* @bxt01() nounwind {
1216 entry:
1217         ret i8* bitcast (i32* getelementptr ([32 x i32]* @xdst, i32 0, i64 16) to i8*)
1218 ; LINUX-64-STATIC: bxt01:
1219 ; LINUX-64-STATIC: movl    $xdst+64, %eax
1220 ; LINUX-64-STATIC: ret
1221 }
1222
1223 define i8* @bat02() nounwind {
1224 entry:
1225         %0 = load i32** @ptr, align 8
1226         %1 = getelementptr i32* %0, i64 16
1227         %2 = bitcast i32* %1 to i8*
1228         ret i8* %2
1229 ; LINUX-64-STATIC: bat02:
1230 ; LINUX-64-STATIC: movq    ptr, %rax
1231 ; LINUX-64-STATIC: addq    $64, %rax
1232 ; LINUX-64-STATIC: ret
1233 }
1234
1235 define i8* @bat03() nounwind {
1236 entry:
1237         ret i8* bitcast (i32* getelementptr ([131072 x i32]* @dsrc, i32 0, i64 16) to i8*)
1238 ; LINUX-64-STATIC: bat03:
1239 ; LINUX-64-STATIC: movl    $dsrc+64, %eax
1240 ; LINUX-64-STATIC: ret
1241 }
1242
1243 define i8* @bat04() nounwind {
1244 entry:
1245         ret i8* bitcast (i32* getelementptr ([131072 x i32]* @ddst, i32 0, i64 16) to i8*)
1246 ; LINUX-64-STATIC: bat04:
1247 ; LINUX-64-STATIC: movl    $ddst+64, %eax
1248 ; LINUX-64-STATIC: ret
1249 }
1250
1251 define i8* @bat05() nounwind {
1252 entry:
1253         %0 = load i32** @dptr, align 8
1254         %1 = getelementptr i32* %0, i64 16
1255         %2 = bitcast i32* %1 to i8*
1256         ret i8* %2
1257 ; LINUX-64-STATIC: bat05:
1258 ; LINUX-64-STATIC: movq    dptr, %rax
1259 ; LINUX-64-STATIC: addq    $64, %rax
1260 ; LINUX-64-STATIC: ret
1261 }
1262
1263 define i8* @bat06() nounwind {
1264 entry:
1265         ret i8* bitcast (i32* getelementptr ([131072 x i32]* @lsrc, i32 0, i64 16) to i8*)
1266 ; LINUX-64-STATIC: bat06:
1267 ; LINUX-64-STATIC: movl    $lsrc+64, %eax
1268 ; LINUX-64-STATIC: ret
1269 }
1270
1271 define i8* @bat07() nounwind {
1272 entry:
1273         ret i8* bitcast (i32* getelementptr ([131072 x i32]* @ldst, i32 0, i64 16) to i8*)
1274 ; LINUX-64-STATIC: bat07:
1275 ; LINUX-64-STATIC: movl    $ldst+64, %eax
1276 ; LINUX-64-STATIC: ret
1277 }
1278
1279 define i8* @bat08() nounwind {
1280 entry:
1281         %0 = load i32** @lptr, align 8
1282         %1 = getelementptr i32* %0, i64 16
1283         %2 = bitcast i32* %1 to i8*
1284         ret i8* %2
1285 ; LINUX-64-STATIC: bat08:
1286 ; LINUX-64-STATIC: movq    lptr, %rax
1287 ; LINUX-64-STATIC: addq    $64, %rax
1288 ; LINUX-64-STATIC: ret
1289 }
1290
1291 define i8* @bam00() nounwind {
1292 entry:
1293         ret i8* bitcast (i32* getelementptr ([131072 x i32]* @src, i32 0, i64 65536) to i8*)
1294 ; LINUX-64-STATIC: bam00:
1295 ; LINUX-64-STATIC: movl    $src+262144, %eax
1296 ; LINUX-64-STATIC: ret
1297 }
1298
1299 define i8* @bam01() nounwind {
1300 entry:
1301         ret i8* bitcast (i32* getelementptr ([131072 x i32]* @dst, i32 0, i64 65536) to i8*)
1302 ; LINUX-64-STATIC: bam01:
1303 ; LINUX-64-STATIC: movl    $dst+262144, %eax
1304 ; LINUX-64-STATIC: ret
1305 }
1306
1307 define i8* @bxm01() nounwind {
1308 entry:
1309         ret i8* bitcast (i32* getelementptr ([32 x i32]* @xdst, i32 0, i64 65536) to i8*)
1310 ; LINUX-64-STATIC: bxm01:
1311 ; LINUX-64-STATIC: movl    $xdst+262144, %eax
1312 ; LINUX-64-STATIC: ret
1313 }
1314
1315 define i8* @bam02() nounwind {
1316 entry:
1317         %0 = load i32** @ptr, align 8
1318         %1 = getelementptr i32* %0, i64 65536
1319         %2 = bitcast i32* %1 to i8*
1320         ret i8* %2
1321 ; LINUX-64-STATIC: bam02:
1322 ; LINUX-64-STATIC: movl    $262144, %eax
1323 ; LINUX-64-STATIC: addq    ptr, %rax
1324 ; LINUX-64-STATIC: ret
1325 }
1326
1327 define i8* @bam03() nounwind {
1328 entry:
1329         ret i8* bitcast (i32* getelementptr ([131072 x i32]* @dsrc, i32 0, i64 65536) to i8*)
1330 ; LINUX-64-STATIC: bam03:
1331 ; LINUX-64-STATIC: movl    $dsrc+262144, %eax
1332 ; LINUX-64-STATIC: ret
1333 }
1334
1335 define i8* @bam04() nounwind {
1336 entry:
1337         ret i8* bitcast (i32* getelementptr ([131072 x i32]* @ddst, i32 0, i64 65536) to i8*)
1338 ; LINUX-64-STATIC: bam04:
1339 ; LINUX-64-STATIC: movl    $ddst+262144, %eax
1340 ; LINUX-64-STATIC: ret
1341 }
1342
1343 define i8* @bam05() nounwind {
1344 entry:
1345         %0 = load i32** @dptr, align 8
1346         %1 = getelementptr i32* %0, i64 65536
1347         %2 = bitcast i32* %1 to i8*
1348         ret i8* %2
1349 ; LINUX-64-STATIC: bam05:
1350 ; LINUX-64-STATIC: movl    $262144, %eax
1351 ; LINUX-64-STATIC: addq    dptr, %rax
1352 ; LINUX-64-STATIC: ret
1353 }
1354
1355 define i8* @bam06() nounwind {
1356 entry:
1357         ret i8* bitcast (i32* getelementptr ([131072 x i32]* @lsrc, i32 0, i64 65536) to i8*)
1358 ; LINUX-64-STATIC: bam06:
1359 ; LINUX-64-STATIC: movl    $lsrc+262144, %eax
1360 ; LINUX-64-STATIC: ret
1361 }
1362
1363 define i8* @bam07() nounwind {
1364 entry:
1365         ret i8* bitcast (i32* getelementptr ([131072 x i32]* @ldst, i32 0, i64 65536) to i8*)
1366 ; LINUX-64-STATIC: bam07:
1367 ; LINUX-64-STATIC: movl    $ldst+262144, %eax
1368 ; LINUX-64-STATIC: ret
1369 }
1370
1371 define i8* @bam08() nounwind {
1372 entry:
1373         %0 = load i32** @lptr, align 8
1374         %1 = getelementptr i32* %0, i64 65536
1375         %2 = bitcast i32* %1 to i8*
1376         ret i8* %2
1377 ; LINUX-64-STATIC: bam08:
1378 ; LINUX-64-STATIC: movl    $262144, %eax
1379 ; LINUX-64-STATIC: addq    lptr, %rax
1380 ; LINUX-64-STATIC: ret
1381 }
1382
1383 define i8* @cat00(i64 %i) nounwind {
1384 entry:
1385         %0 = add i64 %i, 16
1386         %1 = getelementptr [131072 x i32]* @src, i64 0, i64 %0
1387         %2 = bitcast i32* %1 to i8*
1388         ret i8* %2
1389 ; LINUX-64-STATIC: cat00:
1390 ; LINUX-64-STATIC: leaq    src+64(,%rdi,4), %rax
1391 ; LINUX-64-STATIC: ret
1392 }
1393
1394 define i8* @cxt00(i64 %i) nounwind {
1395 entry:
1396         %0 = add i64 %i, 16
1397         %1 = getelementptr [32 x i32]* @xsrc, i64 0, i64 %0
1398         %2 = bitcast i32* %1 to i8*
1399         ret i8* %2
1400 ; LINUX-64-STATIC: cxt00:
1401 ; LINUX-64-STATIC: leaq    xsrc+64(,%rdi,4), %rax
1402 ; LINUX-64-STATIC: ret
1403 }
1404
1405 define i8* @cat01(i64 %i) nounwind {
1406 entry:
1407         %0 = add i64 %i, 16
1408         %1 = getelementptr [131072 x i32]* @dst, i64 0, i64 %0
1409         %2 = bitcast i32* %1 to i8*
1410         ret i8* %2
1411 ; LINUX-64-STATIC: cat01:
1412 ; LINUX-64-STATIC: leaq    dst+64(,%rdi,4), %rax
1413 ; LINUX-64-STATIC: ret
1414 }
1415
1416 define i8* @cxt01(i64 %i) nounwind {
1417 entry:
1418         %0 = add i64 %i, 16
1419         %1 = getelementptr [32 x i32]* @xdst, i64 0, i64 %0
1420         %2 = bitcast i32* %1 to i8*
1421         ret i8* %2
1422 ; LINUX-64-STATIC: cxt01:
1423 ; LINUX-64-STATIC: leaq    xdst+64(,%rdi,4), %rax
1424 ; LINUX-64-STATIC: ret
1425 }
1426
1427 define i8* @cat02(i64 %i) nounwind {
1428 entry:
1429         %0 = load i32** @ptr, align 8
1430         %1 = add i64 %i, 16
1431         %2 = getelementptr i32* %0, i64 %1
1432         %3 = bitcast i32* %2 to i8*
1433         ret i8* %3
1434 ; LINUX-64-STATIC: cat02:
1435 ; LINUX-64-STATIC: movq    ptr, %rax
1436 ; LINUX-64-STATIC: leaq    64(%rax,%rdi,4), %rax
1437 ; LINUX-64-STATIC: ret
1438 }
1439
1440 define i8* @cat03(i64 %i) nounwind {
1441 entry:
1442         %0 = add i64 %i, 16
1443         %1 = getelementptr [131072 x i32]* @dsrc, i64 0, i64 %0
1444         %2 = bitcast i32* %1 to i8*
1445         ret i8* %2
1446 ; LINUX-64-STATIC: cat03:
1447 ; LINUX-64-STATIC: leaq    dsrc+64(,%rdi,4), %rax
1448 ; LINUX-64-STATIC: ret
1449 }
1450
1451 define i8* @cat04(i64 %i) nounwind {
1452 entry:
1453         %0 = add i64 %i, 16
1454         %1 = getelementptr [131072 x i32]* @ddst, i64 0, i64 %0
1455         %2 = bitcast i32* %1 to i8*
1456         ret i8* %2
1457 ; LINUX-64-STATIC: cat04:
1458 ; LINUX-64-STATIC: leaq    ddst+64(,%rdi,4), %rax
1459 ; LINUX-64-STATIC: ret
1460 }
1461
1462 define i8* @cat05(i64 %i) nounwind {
1463 entry:
1464         %0 = load i32** @dptr, align 8
1465         %1 = add i64 %i, 16
1466         %2 = getelementptr i32* %0, i64 %1
1467         %3 = bitcast i32* %2 to i8*
1468         ret i8* %3
1469 ; LINUX-64-STATIC: cat05:
1470 ; LINUX-64-STATIC: movq    dptr, %rax
1471 ; LINUX-64-STATIC: leaq    64(%rax,%rdi,4), %rax
1472 ; LINUX-64-STATIC: ret
1473 }
1474
1475 define i8* @cat06(i64 %i) nounwind {
1476 entry:
1477         %0 = add i64 %i, 16
1478         %1 = getelementptr [131072 x i32]* @lsrc, i64 0, i64 %0
1479         %2 = bitcast i32* %1 to i8*
1480         ret i8* %2
1481 ; LINUX-64-STATIC: cat06:
1482 ; LINUX-64-STATIC: leaq    lsrc+64(,%rdi,4), %rax
1483 ; LINUX-64-STATIC: ret
1484 }
1485
1486 define i8* @cat07(i64 %i) nounwind {
1487 entry:
1488         %0 = add i64 %i, 16
1489         %1 = getelementptr [131072 x i32]* @ldst, i64 0, i64 %0
1490         %2 = bitcast i32* %1 to i8*
1491         ret i8* %2
1492 ; LINUX-64-STATIC: cat07:
1493 ; LINUX-64-STATIC: leaq    ldst+64(,%rdi,4), %rax
1494 ; LINUX-64-STATIC: ret
1495 }
1496
1497 define i8* @cat08(i64 %i) nounwind {
1498 entry:
1499         %0 = load i32** @lptr, align 8
1500         %1 = add i64 %i, 16
1501         %2 = getelementptr i32* %0, i64 %1
1502         %3 = bitcast i32* %2 to i8*
1503         ret i8* %3
1504 ; LINUX-64-STATIC: cat08:
1505 ; LINUX-64-STATIC: movq    lptr, %rax
1506 ; LINUX-64-STATIC: leaq    64(%rax,%rdi,4), %rax
1507 ; LINUX-64-STATIC: ret
1508 }
1509
1510 define i8* @cam00(i64 %i) nounwind {
1511 entry:
1512         %0 = add i64 %i, 65536
1513         %1 = getelementptr [131072 x i32]* @src, i64 0, i64 %0
1514         %2 = bitcast i32* %1 to i8*
1515         ret i8* %2
1516 ; LINUX-64-STATIC: cam00:
1517 ; LINUX-64-STATIC: leaq    src+262144(,%rdi,4), %rax
1518 ; LINUX-64-STATIC: ret
1519 }
1520
1521 define i8* @cxm00(i64 %i) nounwind {
1522 entry:
1523         %0 = add i64 %i, 65536
1524         %1 = getelementptr [32 x i32]* @xsrc, i64 0, i64 %0
1525         %2 = bitcast i32* %1 to i8*
1526         ret i8* %2
1527 ; LINUX-64-STATIC: cxm00:
1528 ; LINUX-64-STATIC: leaq    xsrc+262144(,%rdi,4), %rax
1529 ; LINUX-64-STATIC: ret
1530 }
1531
1532 define i8* @cam01(i64 %i) nounwind {
1533 entry:
1534         %0 = add i64 %i, 65536
1535         %1 = getelementptr [131072 x i32]* @dst, i64 0, i64 %0
1536         %2 = bitcast i32* %1 to i8*
1537         ret i8* %2
1538 ; LINUX-64-STATIC: cam01:
1539 ; LINUX-64-STATIC: leaq    dst+262144(,%rdi,4), %rax
1540 ; LINUX-64-STATIC: ret
1541 }
1542
1543 define i8* @cxm01(i64 %i) nounwind {
1544 entry:
1545         %0 = add i64 %i, 65536
1546         %1 = getelementptr [32 x i32]* @xdst, i64 0, i64 %0
1547         %2 = bitcast i32* %1 to i8*
1548         ret i8* %2
1549 ; LINUX-64-STATIC: cxm01:
1550 ; LINUX-64-STATIC: leaq    xdst+262144(,%rdi,4), %rax
1551 ; LINUX-64-STATIC: ret
1552 }
1553
1554 define i8* @cam02(i64 %i) nounwind {
1555 entry:
1556         %0 = load i32** @ptr, align 8
1557         %1 = add i64 %i, 65536
1558         %2 = getelementptr i32* %0, i64 %1
1559         %3 = bitcast i32* %2 to i8*
1560         ret i8* %3
1561 ; LINUX-64-STATIC: cam02:
1562 ; LINUX-64-STATIC: movq    ptr, %rax
1563 ; LINUX-64-STATIC: leaq    262144(%rax,%rdi,4), %rax
1564 ; LINUX-64-STATIC: ret
1565 }
1566
1567 define i8* @cam03(i64 %i) nounwind {
1568 entry:
1569         %0 = add i64 %i, 65536
1570         %1 = getelementptr [131072 x i32]* @dsrc, i64 0, i64 %0
1571         %2 = bitcast i32* %1 to i8*
1572         ret i8* %2
1573 ; LINUX-64-STATIC: cam03:
1574 ; LINUX-64-STATIC: leaq    dsrc+262144(,%rdi,4), %rax
1575 ; LINUX-64-STATIC: ret
1576 }
1577
1578 define i8* @cam04(i64 %i) nounwind {
1579 entry:
1580         %0 = add i64 %i, 65536
1581         %1 = getelementptr [131072 x i32]* @ddst, i64 0, i64 %0
1582         %2 = bitcast i32* %1 to i8*
1583         ret i8* %2
1584 ; LINUX-64-STATIC: cam04:
1585 ; LINUX-64-STATIC: leaq    ddst+262144(,%rdi,4), %rax
1586 ; LINUX-64-STATIC: ret
1587 }
1588
1589 define i8* @cam05(i64 %i) nounwind {
1590 entry:
1591         %0 = load i32** @dptr, align 8
1592         %1 = add i64 %i, 65536
1593         %2 = getelementptr i32* %0, i64 %1
1594         %3 = bitcast i32* %2 to i8*
1595         ret i8* %3
1596 ; LINUX-64-STATIC: cam05:
1597 ; LINUX-64-STATIC: movq    dptr, %rax
1598 ; LINUX-64-STATIC: leaq    262144(%rax,%rdi,4), %rax
1599 ; LINUX-64-STATIC: ret
1600 }
1601
1602 define i8* @cam06(i64 %i) nounwind {
1603 entry:
1604         %0 = add i64 %i, 65536
1605         %1 = getelementptr [131072 x i32]* @lsrc, i64 0, i64 %0
1606         %2 = bitcast i32* %1 to i8*
1607         ret i8* %2
1608 ; LINUX-64-STATIC: cam06:
1609 ; LINUX-64-STATIC: leaq    lsrc+262144(,%rdi,4), %rax
1610 ; LINUX-64-STATIC: ret
1611 }
1612
1613 define i8* @cam07(i64 %i) nounwind {
1614 entry:
1615         %0 = add i64 %i, 65536
1616         %1 = getelementptr [131072 x i32]* @ldst, i64 0, i64 %0
1617         %2 = bitcast i32* %1 to i8*
1618         ret i8* %2
1619 ; LINUX-64-STATIC: cam07:
1620 ; LINUX-64-STATIC: leaq    ldst+262144(,%rdi,4), %rax
1621 ; LINUX-64-STATIC: ret
1622 }
1623
1624 define i8* @cam08(i64 %i) nounwind {
1625 entry:
1626         %0 = load i32** @lptr, align 8
1627         %1 = add i64 %i, 65536
1628         %2 = getelementptr i32* %0, i64 %1
1629         %3 = bitcast i32* %2 to i8*
1630         ret i8* %3
1631 ; LINUX-64-STATIC: cam08:
1632 ; LINUX-64-STATIC: movq    lptr, %rax
1633 ; LINUX-64-STATIC: leaq    262144(%rax,%rdi,4), %rax
1634 ; LINUX-64-STATIC: ret
1635 }
1636
1637 define void @lcallee() nounwind {
1638 entry:
1639         tail call void @x() nounwind
1640         tail call void @x() nounwind
1641         tail call void @x() nounwind
1642         tail call void @x() nounwind
1643         tail call void @x() nounwind
1644         tail call void @x() nounwind
1645         tail call void @x() nounwind
1646         ret void
1647 ; LINUX-64-STATIC: lcallee:
1648 ; LINUX-64-STATIC: call    x
1649 ; LINUX-64-STATIC: call    x
1650 ; LINUX-64-STATIC: call    x
1651 ; LINUX-64-STATIC: call    x
1652 ; LINUX-64-STATIC: call    x
1653 ; LINUX-64-STATIC: call    x
1654 ; LINUX-64-STATIC: call    x
1655 ; LINUX-64-STATIC: ret
1656 }
1657
1658 declare void @x()
1659
1660 define internal void @dcallee() nounwind {
1661 entry:
1662         tail call void @y() nounwind
1663         tail call void @y() nounwind
1664         tail call void @y() nounwind
1665         tail call void @y() nounwind
1666         tail call void @y() nounwind
1667         tail call void @y() nounwind
1668         tail call void @y() nounwind
1669         ret void
1670 ; LINUX-64-STATIC: dcallee:
1671 ; LINUX-64-STATIC: call    y
1672 ; LINUX-64-STATIC: call    y
1673 ; LINUX-64-STATIC: call    y
1674 ; LINUX-64-STATIC: call    y
1675 ; LINUX-64-STATIC: call    y
1676 ; LINUX-64-STATIC: call    y
1677 ; LINUX-64-STATIC: call    y
1678 ; LINUX-64-STATIC: ret
1679 }
1680
1681 declare void @y()
1682
1683 define void ()* @address() nounwind {
1684 entry:
1685         ret void ()* @callee
1686 ; LINUX-64-STATIC: address:
1687 ; LINUX-64-STATIC: movl    $callee, %eax
1688 ; LINUX-64-STATIC: ret
1689 }
1690
1691 declare void @callee()
1692
1693 define void ()* @laddress() nounwind {
1694 entry:
1695         ret void ()* @lcallee
1696 ; LINUX-64-STATIC: laddress:
1697 ; LINUX-64-STATIC: movl    $lcallee, %eax
1698 ; LINUX-64-STATIC: ret
1699 }
1700
1701 define void ()* @daddress() nounwind {
1702 entry:
1703         ret void ()* @dcallee
1704 ; LINUX-64-STATIC: daddress:
1705 ; LINUX-64-STATIC: movl    $dcallee, %eax
1706 ; LINUX-64-STATIC: ret
1707 }
1708
1709 define void @caller() nounwind {
1710 entry:
1711         tail call void @callee() nounwind
1712         tail call void @callee() nounwind
1713         ret void
1714 ; LINUX-64-STATIC: caller:
1715 ; LINUX-64-STATIC: call    callee
1716 ; LINUX-64-STATIC: call    callee
1717 ; LINUX-64-STATIC: ret
1718 }
1719
1720 define void @dcaller() nounwind {
1721 entry:
1722         tail call void @dcallee() nounwind
1723         tail call void @dcallee() nounwind
1724         ret void
1725 ; LINUX-64-STATIC: dcaller:
1726 ; LINUX-64-STATIC: call    dcallee
1727 ; LINUX-64-STATIC: call    dcallee
1728 ; LINUX-64-STATIC: ret
1729 }
1730
1731 define void @lcaller() nounwind {
1732 entry:
1733         tail call void @lcallee() nounwind
1734         tail call void @lcallee() nounwind
1735         ret void
1736 ; LINUX-64-STATIC: lcaller:
1737 ; LINUX-64-STATIC: call    lcallee
1738 ; LINUX-64-STATIC: call    lcallee
1739 ; LINUX-64-STATIC: ret
1740 }
1741
1742 define void @tailcaller() nounwind {
1743 entry:
1744         tail call void @callee() nounwind
1745         ret void
1746 ; LINUX-64-STATIC: tailcaller:
1747 ; LINUX-64-STATIC: call    callee
1748 ; LINUX-64-STATIC: ret
1749 }
1750
1751 define void @dtailcaller() nounwind {
1752 entry:
1753         tail call void @dcallee() nounwind
1754         ret void
1755 ; LINUX-64-STATIC: dtailcaller:
1756 ; LINUX-64-STATIC: call    dcallee
1757 ; LINUX-64-STATIC: ret
1758 }
1759
1760 define void @ltailcaller() nounwind {
1761 entry:
1762         tail call void @lcallee() nounwind
1763         ret void
1764 ; LINUX-64-STATIC: ltailcaller:
1765 ; LINUX-64-STATIC: call    lcallee
1766 ; LINUX-64-STATIC: ret
1767 }
1768
1769 define void @icaller() nounwind {
1770 entry:
1771         %0 = load void ()** @ifunc, align 8
1772         tail call void %0() nounwind
1773         %1 = load void ()** @ifunc, align 8
1774         tail call void %1() nounwind
1775         ret void
1776 ; LINUX-64-STATIC: icaller:
1777 ; LINUX-64-STATIC: call    *ifunc
1778 ; LINUX-64-STATIC: call    *ifunc
1779 ; LINUX-64-STATIC: ret
1780 }
1781
1782 define void @dicaller() nounwind {
1783 entry:
1784         %0 = load void ()** @difunc, align 8
1785         tail call void %0() nounwind
1786         %1 = load void ()** @difunc, align 8
1787         tail call void %1() nounwind
1788         ret void
1789 ; LINUX-64-STATIC: dicaller:
1790 ; LINUX-64-STATIC: call    *difunc
1791 ; LINUX-64-STATIC: call    *difunc
1792 ; LINUX-64-STATIC: ret
1793 }
1794
1795 define void @licaller() nounwind {
1796 entry:
1797         %0 = load void ()** @lifunc, align 8
1798         tail call void %0() nounwind
1799         %1 = load void ()** @lifunc, align 8
1800         tail call void %1() nounwind
1801         ret void
1802 ; LINUX-64-STATIC: licaller:
1803 ; LINUX-64-STATIC: call    *lifunc
1804 ; LINUX-64-STATIC: call    *lifunc
1805 ; LINUX-64-STATIC: ret
1806 }
1807
1808 define void @itailcaller() nounwind {
1809 entry:
1810         %0 = load void ()** @ifunc, align 8
1811         tail call void %0() nounwind
1812         %1 = load void ()** @ifunc, align 8
1813         tail call void %1() nounwind
1814         ret void
1815 ; LINUX-64-STATIC: itailcaller:
1816 ; LINUX-64-STATIC: call    *ifunc
1817 ; LINUX-64-STATIC: call    *ifunc
1818 ; LINUX-64-STATIC: ret
1819 }
1820
1821 define void @ditailcaller() nounwind {
1822 entry:
1823         %0 = load void ()** @difunc, align 8
1824         tail call void %0() nounwind
1825         ret void
1826 ; LINUX-64-STATIC: ditailcaller:
1827 ; LINUX-64-STATIC: call    *difunc
1828 ; LINUX-64-STATIC: ret
1829 }
1830
1831 define void @litailcaller() nounwind {
1832 entry:
1833         %0 = load void ()** @lifunc, align 8
1834         tail call void %0() nounwind
1835         ret void
1836 ; LINUX-64-STATIC: litailcaller:
1837 ; LINUX-64-STATIC: call    *lifunc
1838 ; LINUX-64-STATIC: ret
1839 }