xref: /llvm-project/llvm/test/Transforms/FunctionImport/Inputs/funcimport.ll (revision 41d5033eb162cb92b684855166cabfa3983b74c6)
1target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
2target triple = "x86_64-apple-macosx10.11.0"
3
4@globalvar = global i32 1, align 4
5@staticvar = internal global i32 1, align 4
6@staticconstvar = internal unnamed_addr constant [2 x i32] [i32 10, i32 20], align 4
7@commonvar = common global i32 0, align 4
8@P = internal global ptr null, align 8
9
10@weakalias = weak alias void (...), ptr @globalfunc1
11@analias = alias void (...), ptr @globalfunc2
12@linkoncealias = alias void (...), ptr @linkoncefunc
13
14define void @globalfunc1() #0 {
15entry:
16  call void @funcwithpersonality()
17  call void (...) @variadic_va_start()
18  ret void
19}
20
21define void @globalfunc2() #0 {
22entry:
23  ret void
24}
25
26define linkonce_odr void @linkoncefunc() #0 {
27entry:
28  ret void
29}
30
31define i32 @referencestatics(i32 %i) #0 {
32entry:
33  %i.addr = alloca i32, align 4
34  store i32 %i, ptr %i.addr, align 4
35  %call = call i32 @staticfunc()
36  %0 = load i32, ptr @staticvar, align 4
37  %add = add nsw i32 %call, %0
38  %1 = load i32, ptr %i.addr, align 4
39  %idxprom = sext i32 %1 to i64
40  %arrayidx = getelementptr inbounds [2 x i32], ptr @staticconstvar, i64 0, i64 %idxprom
41  %2 = load i32, ptr %arrayidx, align 4
42  %add1 = add nsw i32 %add, %2
43  ret i32 %add1
44}
45
46define i32 @referenceglobals(i32 %i) #0 {
47entry:
48  %i.addr = alloca i32, align 4
49  store i32 %i, ptr %i.addr, align 4
50  call void @globalfunc1()
51  %0 = load i32, ptr @globalvar, align 4
52  ret i32 %0
53}
54
55define i32 @referencecommon(i32 %i) #0 {
56entry:
57  %i.addr = alloca i32, align 4
58  store i32 %i, ptr %i.addr, align 4
59  %0 = load i32, ptr @commonvar, align 4
60  ret i32 %0
61}
62
63define void @setfuncptr() #0 {
64entry:
65  store ptr @staticfunc2, ptr @P, align 8
66  ret void
67}
68
69define void @callfuncptr() #0 {
70entry:
71  %0 = load ptr, ptr @P, align 8
72  call void %0()
73  ret void
74}
75
76@weakvar = weak global i32 1, align 4
77define weak void @weakfunc() #0 {
78entry:
79  ret void
80}
81
82define linkonce void @linkoncefunc2() #0 {
83entry:
84  ret void
85}
86
87define internal i32 @staticfunc() #0 {
88entry:
89  ret i32 1
90}
91
92declare i32 @__gxx_personality_v0(...)
93
94; Add enough instructions to prevent import with inst limit of 5
95define internal void @funcwithpersonality() #2 personality ptr @__gxx_personality_v0 {
96entry:
97  call void @globalfunc2()
98  call void @globalfunc2()
99  call void @globalfunc2()
100  call void @globalfunc2()
101  call void @globalfunc2()
102  call void @globalfunc2()
103  ret void
104}
105
106define internal void @staticfunc2() #0 {
107entry:
108  ret void
109}
110
111define void @referencelargelinkonce() #0 {
112entry:
113  call void @linkonceodr()
114  ret void
115}
116
117; A large enough linkonce_odr function that should never be imported
118define linkonce_odr void @linkonceodr() #0 {
119entry:
120  call void @globalfunc2()
121  call void @globalfunc2()
122  call void @globalfunc2()
123  call void @globalfunc2()
124  call void @globalfunc2()
125  call void @globalfunc2()
126  call void @globalfunc2()
127  call void @globalfunc2()
128  call void @globalfunc2()
129  call void @globalfunc2()
130  call void @globalfunc2()
131  call void @globalfunc2()
132  call void @globalfunc2()
133  call void @globalfunc2()
134  call void @globalfunc2()
135  call void @globalfunc2()
136  call void @globalfunc2()
137  call void @globalfunc2()
138  call void @globalfunc2()
139  call void @globalfunc2()
140  call void @globalfunc2()
141  call void @globalfunc2()
142  call void @globalfunc2()
143  call void @globalfunc2()
144  call void @globalfunc2()
145  call void @globalfunc2()
146  call void @globalfunc2()
147  call void @globalfunc2()
148  call void @globalfunc2()
149  call void @globalfunc2()
150  ret void
151}
152
153; Variadic function without va_start can be imported because inliner
154; can handle it.
155define void @variadic_no_va_start(...) {
156    ret void
157}
158
159; Variadic function with va_start should not be imported because inliner
160; doesn't handle it.
161define void @variadic_va_start(...) {
162    %ap = alloca ptr, align 8
163    call void @llvm.va_start(ptr %ap)
164    ret void
165}
166
167declare void @llvm.va_start(ptr) nounwind
168