xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/pic.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; 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*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker@ptr = external global i32*
4*9880d681SAndroid Build Coastguard Worker@dst = external global i32
5*9880d681SAndroid Build Coastguard Worker@src = external global i32
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine void @test0() nounwind {
8*9880d681SAndroid Build Coastguard Workerentry:
9*9880d681SAndroid Build Coastguard Worker    store i32* @dst, i32** @ptr
10*9880d681SAndroid Build Coastguard Worker    %tmp.s = load i32, i32* @src
11*9880d681SAndroid Build Coastguard Worker    store i32 %tmp.s, i32* @dst
12*9880d681SAndroid Build Coastguard Worker    ret void
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL:    test0:
15*9880d681SAndroid Build Coastguard Worker; LINUX:	calll	.L0$pb
16*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .L0$pb:
17*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT:	popl
18*9880d681SAndroid Build Coastguard Worker; LINUX:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L0$pb),
19*9880d681SAndroid Build Coastguard Worker; LINUX:	movl	dst@GOT(%eax),
20*9880d681SAndroid Build Coastguard Worker; LINUX:	movl	ptr@GOT(%eax),
21*9880d681SAndroid Build Coastguard Worker; LINUX:	movl	src@GOT(%eax),
22*9880d681SAndroid Build Coastguard Worker; LINUX:	ret
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker@ptr2 = global i32* null
26*9880d681SAndroid Build Coastguard Worker@dst2 = global i32 0
27*9880d681SAndroid Build Coastguard Worker@src2 = global i32 0
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine void @test1() nounwind {
30*9880d681SAndroid Build Coastguard Workerentry:
31*9880d681SAndroid Build Coastguard Worker    store i32* @dst2, i32** @ptr2
32*9880d681SAndroid Build Coastguard Worker    %tmp.s = load i32, i32* @src2
33*9880d681SAndroid Build Coastguard Worker    store i32 %tmp.s, i32* @dst2
34*9880d681SAndroid Build Coastguard Worker    ret void
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test1:
37*9880d681SAndroid Build Coastguard Worker; LINUX:	calll	.L1$pb
38*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .L1$pb:
39*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT:	popl
40*9880d681SAndroid Build Coastguard Worker; LINUX:	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L1$pb), %eax
41*9880d681SAndroid Build Coastguard Worker; LINUX:	movl	dst2@GOT(%eax),
42*9880d681SAndroid Build Coastguard Worker; LINUX:	movl	ptr2@GOT(%eax),
43*9880d681SAndroid Build Coastguard Worker; LINUX:	movl	src2@GOT(%eax),
44*9880d681SAndroid Build Coastguard Worker; LINUX:	ret
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdeclare i8* @malloc(i32)
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdefine void @test2() nounwind {
51*9880d681SAndroid Build Coastguard Workerentry:
52*9880d681SAndroid Build Coastguard Worker    %ptr = call i8* @malloc(i32 40)
53*9880d681SAndroid Build Coastguard Worker    ret void
54*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test2:
55*9880d681SAndroid Build Coastguard Worker; LINUX: 	pushl	%ebx
56*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: 	subl	$8, %esp
57*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: 	calll	.L2$pb
58*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .L2$pb:
59*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: 	popl	%ebx
60*9880d681SAndroid Build Coastguard Worker; LINUX: 	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L2$pb), %ebx
61*9880d681SAndroid Build Coastguard Worker; LINUX: 	movl	$40, (%esp)
62*9880d681SAndroid Build Coastguard Worker; LINUX: 	calll	malloc@PLT
63*9880d681SAndroid Build Coastguard Worker; LINUX: 	addl	$8, %esp
64*9880d681SAndroid Build Coastguard Worker; LINUX: 	popl	%ebx
65*9880d681SAndroid Build Coastguard Worker; LINUX: 	ret
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker@pfoo = external global void(...)*
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerdefine void @test3() nounwind {
71*9880d681SAndroid Build Coastguard Workerentry:
72*9880d681SAndroid Build Coastguard Worker    %tmp = call void(...)*(...) @afoo()
73*9880d681SAndroid Build Coastguard Worker    store void(...)* %tmp, void(...)** @pfoo
74*9880d681SAndroid Build Coastguard Worker    %tmp1 = load void(...)*, void(...)** @pfoo
75*9880d681SAndroid Build Coastguard Worker    call void(...) %tmp1()
76*9880d681SAndroid Build Coastguard Worker    ret void
77*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test3:
78*9880d681SAndroid Build Coastguard Worker; LINUX: 	calll	.L3$pb
79*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .L3$pb:
80*9880d681SAndroid Build Coastguard Worker; LINUX: 	popl
81*9880d681SAndroid Build Coastguard Worker; LINUX: 	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L3$pb), %[[REG3:e..]]
82*9880d681SAndroid Build Coastguard Worker; LINUX: 	calll	afoo@PLT
83*9880d681SAndroid Build Coastguard Worker; LINUX: 	movl	pfoo@GOT(%[[REG3]]),
84*9880d681SAndroid Build Coastguard Worker; LINUX: 	calll	*
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdeclare void(...)* @afoo(...)
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine void @test4() nounwind {
90*9880d681SAndroid Build Coastguard Workerentry:
91*9880d681SAndroid Build Coastguard Worker    call void(...) @foo()
92*9880d681SAndroid Build Coastguard Worker    ret void
93*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test4:
94*9880d681SAndroid Build Coastguard Worker; LINUX: calll	.L4$pb
95*9880d681SAndroid Build Coastguard Worker; LINUX: popl	%ebx
96*9880d681SAndroid Build Coastguard Worker; LINUX: addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L4$pb), %ebx
97*9880d681SAndroid Build Coastguard Worker; LINUX: calll	foo@PLT
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerdeclare void @foo(...)
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker@ptr6 = internal global i32* null
104*9880d681SAndroid Build Coastguard Worker@dst6 = internal global i32 0
105*9880d681SAndroid Build Coastguard Worker@src6 = internal global i32 0
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerdefine void @test5() nounwind {
108*9880d681SAndroid Build Coastguard Workerentry:
109*9880d681SAndroid Build Coastguard Worker    store i32* @dst6, i32** @ptr6
110*9880d681SAndroid Build Coastguard Worker    %tmp.s = load i32, i32* @src6
111*9880d681SAndroid Build Coastguard Worker    store i32 %tmp.s, i32* @dst6
112*9880d681SAndroid Build Coastguard Worker    ret void
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test5:
115*9880d681SAndroid Build Coastguard Worker; LINUX: 	calll	.L5$pb
116*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .L5$pb:
117*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: 	popl	%eax
118*9880d681SAndroid Build Coastguard Worker; LINUX: 	addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L5$pb), %eax
119*9880d681SAndroid Build Coastguard Worker; LINUX: 	leal	dst6@GOTOFF(%eax), %ecx
120*9880d681SAndroid Build Coastguard Worker; LINUX: 	movl	%ecx, ptr6@GOTOFF(%eax)
121*9880d681SAndroid Build Coastguard Worker; LINUX: 	movl	src6@GOTOFF(%eax), %ecx
122*9880d681SAndroid Build Coastguard Worker; LINUX: 	movl	%ecx, dst6@GOTOFF(%eax)
123*9880d681SAndroid Build Coastguard Worker; LINUX: 	ret
124*9880d681SAndroid Build Coastguard Worker}
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker;; Test constant pool references.
128*9880d681SAndroid Build Coastguard Workerdefine double @test6(i32 %a.u) nounwind {
129*9880d681SAndroid Build Coastguard Workerentry:
130*9880d681SAndroid Build Coastguard Worker    %tmp = icmp eq i32 %a.u,0
131*9880d681SAndroid Build Coastguard Worker    %retval = select i1 %tmp, double 4.561230e+02, double 1.234560e+02
132*9880d681SAndroid Build Coastguard Worker    ret double %retval
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker; LINUX: .LCPI6_0:
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test6:
137*9880d681SAndroid Build Coastguard Worker; LINUX:    calll .L6$pb
138*9880d681SAndroid Build Coastguard Worker; LINUX: .L6$pb:
139*9880d681SAndroid Build Coastguard Worker; LINUX:    addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L6$pb),
140*9880d681SAndroid Build Coastguard Worker; LINUX:    fldl	.LCPI6_0@GOTOFF(
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker;; Test jump table references.
145*9880d681SAndroid Build Coastguard Workerdefine void @test7(i32 %n.u) nounwind {
146*9880d681SAndroid Build Coastguard Workerentry:
147*9880d681SAndroid Build Coastguard Worker    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*9880d681SAndroid Build Coastguard Workerbb:
149*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo1()
150*9880d681SAndroid Build Coastguard Worker    ret void
151*9880d681SAndroid Build Coastguard Workerbb1:
152*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo2()
153*9880d681SAndroid Build Coastguard Worker    ret void
154*9880d681SAndroid Build Coastguard Workerbb2:
155*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo6()
156*9880d681SAndroid Build Coastguard Worker    ret void
157*9880d681SAndroid Build Coastguard Workerbb3:
158*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo3()
159*9880d681SAndroid Build Coastguard Worker    ret void
160*9880d681SAndroid Build Coastguard Workerbb4:
161*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo4()
162*9880d681SAndroid Build Coastguard Worker    ret void
163*9880d681SAndroid Build Coastguard Workerbb5:
164*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo5()
165*9880d681SAndroid Build Coastguard Worker    ret void
166*9880d681SAndroid Build Coastguard Workerbb6:
167*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo1()
168*9880d681SAndroid Build Coastguard Worker    ret void
169*9880d681SAndroid Build Coastguard Workerbb7:
170*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo2()
171*9880d681SAndroid Build Coastguard Worker    ret void
172*9880d681SAndroid Build Coastguard Workerbb8:
173*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo6()
174*9880d681SAndroid Build Coastguard Worker    ret void
175*9880d681SAndroid Build Coastguard Workerbb9:
176*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo3()
177*9880d681SAndroid Build Coastguard Worker    ret void
178*9880d681SAndroid Build Coastguard Workerbb10:
179*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo4()
180*9880d681SAndroid Build Coastguard Worker    ret void
181*9880d681SAndroid Build Coastguard Workerbb11:
182*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo5()
183*9880d681SAndroid Build Coastguard Worker    ret void
184*9880d681SAndroid Build Coastguard Workerbb12:
185*9880d681SAndroid Build Coastguard Worker    tail call void(...) @foo6()
186*9880d681SAndroid Build Coastguard Worker    ret void
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker; LINUX-LABEL: test7:
189*9880d681SAndroid Build Coastguard Worker; LINUX:   calll	.L7$pb
190*9880d681SAndroid Build Coastguard Worker; LINUX: .L7$pb:
191*9880d681SAndroid Build Coastguard Worker; LINUX:   addl	$_GLOBAL_OFFSET_TABLE_+(.L{{.*}}-.L7$pb),
192*9880d681SAndroid Build Coastguard Worker; LINUX:   .LJTI7_0@GOTOFF(
193*9880d681SAndroid Build Coastguard Worker; LINUX:   jmpl	*
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker; LINUX: .p2align 2
196*9880d681SAndroid Build Coastguard Worker; LINUX-NEXT: .LJTI7_0:
197*9880d681SAndroid Build Coastguard Worker; LINUX:   .long	 .LBB7_2@GOTOFF
198*9880d681SAndroid Build Coastguard Worker; LINUX:   .long	 .LBB7_8@GOTOFF
199*9880d681SAndroid Build Coastguard Worker; LINUX:   .long	 .LBB7_4@GOTOFF
200*9880d681SAndroid Build Coastguard Worker; LINUX:   .long	 .LBB7_6@GOTOFF
201*9880d681SAndroid Build Coastguard Worker; LINUX:   .long	 .LBB7_5@GOTOFF
202*9880d681SAndroid Build Coastguard Worker; LINUX:   .long	 .LBB7_8@GOTOFF
203*9880d681SAndroid Build Coastguard Worker; LINUX:   .long	 .LBB7_7@GOTOFF
204*9880d681SAndroid Build Coastguard Worker}
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Workerdeclare void @foo1(...)
207*9880d681SAndroid Build Coastguard Workerdeclare void @foo2(...)
208*9880d681SAndroid Build Coastguard Workerdeclare void @foo6(...)
209*9880d681SAndroid Build Coastguard Workerdeclare void @foo3(...)
210*9880d681SAndroid Build Coastguard Workerdeclare void @foo4(...)
211*9880d681SAndroid Build Coastguard Workerdeclare void @foo5(...)
212