[opaque pointer type] Add textual IR support for explicit type parameter to the call...
[oota-llvm.git] / test / CodeGen / X86 / pic.ll
1 ; RUN: llc < %s -mcpu=generic -mtriple=i686-pc-linux-gnu -relocation-model=pic -asm-verbose=false -post-RA-scheduler=false | FileCheck %s -check-prefix=LINUX
2
3 @ptr = external global i32* 
4 @dst = external global i32 
5 @src = external global i32 
6
7 define void @test0() nounwind {
8 entry:
9     store i32* @dst, i32** @ptr
10     %tmp.s = load i32, i32* @src
11     store i32 %tmp.s, i32* @dst
12     ret void
13     
14 ; LINUX-LABEL:    test0:
15 ; LINUX:        calll   .L0$pb
16 ; LINUX-NEXT: .L0$pb:
17 ; LINUX-NEXT:   popl
18 ; LINUX:        addl    $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L0$pb),
19 ; LINUX:        movl    dst@GOT(%eax),
20 ; LINUX:        movl    ptr@GOT(%eax),
21 ; LINUX:        movl    src@GOT(%eax),
22 ; LINUX:        ret
23 }
24
25 @ptr2 = global i32* null
26 @dst2 = global i32 0
27 @src2 = global i32 0
28
29 define void @test1() nounwind {
30 entry:
31     store i32* @dst2, i32** @ptr2
32     %tmp.s = load i32, i32* @src2
33     store i32 %tmp.s, i32* @dst2
34     ret void
35     
36 ; LINUX-LABEL: test1:
37 ; LINUX:        calll   .L1$pb
38 ; LINUX-NEXT: .L1$pb:
39 ; LINUX-NEXT:   popl
40 ; LINUX:        addl    $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L1$pb), %eax
41 ; LINUX:        movl    dst2@GOT(%eax),
42 ; LINUX:        movl    ptr2@GOT(%eax),
43 ; LINUX:        movl    src2@GOT(%eax),
44 ; LINUX:        ret
45
46 }
47
48 declare i8* @malloc(i32)
49
50 define void @test2() nounwind {
51 entry:
52     %ptr = call i8* @malloc(i32 40)
53     ret void
54 ; LINUX-LABEL: test2:
55 ; LINUX:        pushl   %ebx
56 ; LINUX-NEXT:   subl    $8, %esp
57 ; LINUX-NEXT:   calll   .L2$pb
58 ; LINUX-NEXT: .L2$pb:
59 ; LINUX-NEXT:   popl    %ebx
60 ; LINUX:        addl    $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L2$pb), %ebx
61 ; LINUX:        movl    $40, (%esp)
62 ; LINUX:        calll   malloc@PLT
63 ; LINUX:        addl    $8, %esp
64 ; LINUX:        popl    %ebx
65 ; LINUX:        ret
66 }
67
68 @pfoo = external global void(...)* 
69
70 define void @test3() nounwind {
71 entry:
72     %tmp = call void(...)*(...) @afoo()
73     store void(...)* %tmp, void(...)** @pfoo
74     %tmp1 = load void(...)*, void(...)** @pfoo
75     call void(...) %tmp1()
76     ret void
77 ; LINUX-LABEL: test3:
78 ; LINUX:        calll   .L3$pb
79 ; LINUX-NEXT: .L3$pb:
80 ; LINUX:        popl
81 ; LINUX:        addl    $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L3$pb), %[[REG3:e..]]
82 ; LINUX:        calll   afoo@PLT
83 ; LINUX:        movl    pfoo@GOT(%[[REG3]]),
84 ; LINUX:        calll   *
85 }
86
87 declare void(...)* @afoo(...)
88
89 define void @test4() nounwind {
90 entry:
91     call void(...) @foo()
92     ret void
93 ; LINUX-LABEL: test4:
94 ; LINUX: calll  .L4$pb
95 ; LINUX: popl   %ebx
96 ; LINUX: addl   $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L4$pb), %ebx
97 ; LINUX: calll  foo@PLT
98 }
99
100 declare void @foo(...)
101
102
103 @ptr6 = internal global i32* null
104 @dst6 = internal global i32 0
105 @src6 = internal global i32 0
106
107 define void @test5() nounwind {
108 entry:
109     store i32* @dst6, i32** @ptr6
110     %tmp.s = load i32, i32* @src6
111     store i32 %tmp.s, i32* @dst6
112     ret void
113     
114 ; LINUX-LABEL: test5:
115 ; LINUX:        calll   .L5$pb
116 ; LINUX-NEXT: .L5$pb:
117 ; LINUX-NEXT:   popl    %eax
118 ; LINUX:        addl    $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L5$pb), %eax
119 ; LINUX:        leal    dst6@GOTOFF(%eax), %ecx
120 ; LINUX:        movl    %ecx, ptr6@GOTOFF(%eax)
121 ; LINUX:        movl    src6@GOTOFF(%eax), %ecx
122 ; LINUX:        movl    %ecx, dst6@GOTOFF(%eax)
123 ; LINUX:        ret
124 }
125
126
127 ;; Test constant pool references.
128 define double @test6(i32 %a.u) nounwind {
129 entry:
130     %tmp = icmp eq i32 %a.u,0
131     %retval = select i1 %tmp, double 4.561230e+02, double 1.234560e+02
132     ret double %retval
133
134 ; LINUX: .LCPI6_0:
135
136 ; LINUX-LABEL: test6:
137 ; LINUX:    calll .L6$pb
138 ; LINUX: .L6$pb:
139 ; LINUX:    addl        $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L6$pb), 
140 ; LINUX:    fldl        .LCPI6_0@GOTOFF(
141 }
142
143
144 ;; Test jump table references.
145 define void @test7(i32 %n.u) nounwind {
146 entry:
147     switch i32 %n.u, label %bb12 [i32 1, label %bb i32 2, label %bb6 i32 4, label %bb7 i32 5, label %bb8 i32 6, label %bb10 i32 7, label %bb1 i32 8, label %bb3 i32 9, label %bb4 i32 10, label %bb9 i32 11, label %bb2 i32 12, label %bb5 i32 13, label %bb11 ]
148 bb:
149     tail call void(...) @foo1()
150     ret void
151 bb1:
152     tail call void(...) @foo2()
153     ret void
154 bb2:
155     tail call void(...) @foo6()
156     ret void
157 bb3:
158     tail call void(...) @foo3()
159     ret void
160 bb4:
161     tail call void(...) @foo4()
162     ret void
163 bb5:
164     tail call void(...) @foo5()
165     ret void
166 bb6:
167     tail call void(...) @foo1()
168     ret void
169 bb7:
170     tail call void(...) @foo2()
171     ret void
172 bb8:
173     tail call void(...) @foo6()
174     ret void
175 bb9:
176     tail call void(...) @foo3()
177     ret void
178 bb10:
179     tail call void(...) @foo4()
180     ret void
181 bb11:
182     tail call void(...) @foo5()
183     ret void
184 bb12:
185     tail call void(...) @foo6()
186     ret void
187     
188 ; LINUX-LABEL: test7:
189 ; LINUX:   calll        .L7$pb
190 ; LINUX: .L7$pb:
191 ; LINUX:   addl $_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L7$pb),
192 ; LINUX:   .LJTI7_0@GOTOFF(
193 ; LINUX:   jmpl *
194
195 ; LINUX: .align 4
196 ; LINUX-NEXT: .LJTI7_0:
197 ; LINUX:   .long         .LBB7_2@GOTOFF
198 ; LINUX:   .long         .LBB7_8@GOTOFF
199 ; LINUX:   .long         .LBB7_14@GOTOFF
200 ; LINUX:   .long         .LBB7_9@GOTOFF
201 ; LINUX:   .long         .LBB7_10@GOTOFF
202 }
203
204 declare void @foo1(...)
205 declare void @foo2(...)
206 declare void @foo6(...)
207 declare void @foo3(...)
208 declare void @foo4(...)
209 declare void @foo5(...)