1; RUN: opt -pre-isel-intrinsic-lowering -S -o - %s | FileCheck %s
2; RUN: opt -passes='pre-isel-intrinsic-lowering' -S -o - %s | FileCheck %s
3
4; Make sure calls to the objc intrinsics are translated to calls in to the
5; runtime
6
7define i8* @test_objc_autorelease(i8* %arg0) {
8; CHECK-LABEL: test_objc_autorelease
9; CHECK-NEXT: entry
10; CHECK-NEXT: %0 = call i8* @objc_autorelease(i8* %arg0)
11; CHECK-NEXT: ret i8* %0
12entry:
13  %0 = call i8* @llvm.objc.autorelease(i8* %arg0)
14	ret i8* %0
15}
16
17define void @test_objc_autoreleasePoolPop(i8* %arg0) {
18; CHECK-LABEL: test_objc_autoreleasePoolPop
19; CHECK-NEXT: entry
20; CHECK-NEXT: call void @objc_autoreleasePoolPop(i8* %arg0)
21; CHECK-NEXT: ret void
22entry:
23  call void @llvm.objc.autoreleasePoolPop(i8* %arg0)
24  ret void
25}
26
27define i8* @test_objc_autoreleasePoolPush() {
28; CHECK-LABEL: test_objc_autoreleasePoolPush
29; CHECK-NEXT: entry
30; CHECK-NEXT: %0 = call i8* @objc_autoreleasePoolPush()
31; CHECK-NEXT: ret i8* %0
32entry:
33  %0 = call i8* @llvm.objc.autoreleasePoolPush()
34	ret i8* %0
35}
36
37define i8* @test_objc_autoreleaseReturnValue(i8* %arg0) {
38; CHECK-LABEL: test_objc_autoreleaseReturnValue
39; CHECK-NEXT: entry
40; CHECK-NEXT: %0 = call i8* @objc_autoreleaseReturnValue(i8* %arg0)
41; CHECK-NEXT: ret i8* %0
42entry:
43  %0 = call i8* @llvm.objc.autoreleaseReturnValue(i8* %arg0)
44	ret i8* %0
45}
46
47define void @test_objc_copyWeak(i8** %arg0, i8** %arg1) {
48; CHECK-LABEL: test_objc_copyWeak
49; CHECK-NEXT: entry
50; CHECK-NEXT: call void @objc_copyWeak(i8** %arg0, i8** %arg1)
51; CHECK-NEXT: ret void
52entry:
53  call void @llvm.objc.copyWeak(i8** %arg0, i8** %arg1)
54  ret void
55}
56
57define void @test_objc_destroyWeak(i8** %arg0) {
58; CHECK-LABEL: test_objc_destroyWeak
59; CHECK-NEXT: entry
60; CHECK-NEXT: call void @objc_destroyWeak(i8** %arg0)
61; CHECK-NEXT: ret void
62entry:
63  call void @llvm.objc.destroyWeak(i8** %arg0)
64  ret void
65}
66
67define i8* @test_objc_initWeak(i8** %arg0, i8* %arg1) {
68; CHECK-LABEL: test_objc_initWeak
69; CHECK-NEXT: entry
70; CHECK-NEXT: %0 = call i8* @objc_initWeak(i8** %arg0, i8* %arg1)
71; CHECK-NEXT: ret i8* %0
72entry:
73  %0 = call i8* @llvm.objc.initWeak(i8** %arg0, i8* %arg1)
74	ret i8* %0
75}
76
77define i8* @test_objc_loadWeak(i8** %arg0) {
78; CHECK-LABEL: test_objc_loadWeak
79; CHECK-NEXT: entry
80; CHECK-NEXT: %0 = call i8* @objc_loadWeak(i8** %arg0)
81; CHECK-NEXT: ret i8* %0
82entry:
83  %0 = call i8* @llvm.objc.loadWeak(i8** %arg0)
84	ret i8* %0
85}
86
87define i8* @test_objc_loadWeakRetained(i8** %arg0) {
88; CHECK-LABEL: test_objc_loadWeakRetained
89; CHECK-NEXT: entry
90; CHECK-NEXT: %0 = call i8* @objc_loadWeakRetained(i8** %arg0)
91; CHECK-NEXT: ret i8* %0
92entry:
93  %0 = call i8* @llvm.objc.loadWeakRetained(i8** %arg0)
94	ret i8* %0
95}
96
97define void @test_objc_moveWeak(i8** %arg0, i8** %arg1) {
98; CHECK-LABEL: test_objc_moveWeak
99; CHECK-NEXT: entry
100; CHECK-NEXT: call void @objc_moveWeak(i8** %arg0, i8** %arg1)
101; CHECK-NEXT: ret void
102entry:
103  call void @llvm.objc.moveWeak(i8** %arg0, i8** %arg1)
104  ret void
105}
106
107define void @test_objc_release(i8* %arg0) {
108; CHECK-LABEL: test_objc_release
109; CHECK-NEXT: entry
110; CHECK-NEXT: call void @objc_release(i8* %arg0)
111; CHECK-NEXT: ret void
112entry:
113  call void @llvm.objc.release(i8* %arg0)
114  ret void
115}
116
117define i8* @test_objc_retain(i8* %arg0) {
118; CHECK-LABEL: test_objc_retain
119; CHECK-NEXT: entry
120; CHECK-NEXT: %0 = call i8* @objc_retain(i8* %arg0)
121; CHECK-NEXT: ret i8* %0
122entry:
123  %0 = call i8* @llvm.objc.retain(i8* %arg0)
124	ret i8* %0
125}
126
127define i8* @test_objc_retainAutorelease(i8* %arg0) {
128; CHECK-LABEL: test_objc_retainAutorelease
129; CHECK-NEXT: entry
130; CHECK-NEXT: %0 = call i8* @objc_retainAutorelease(i8* %arg0)
131; CHECK-NEXT: ret i8* %0
132entry:
133  %0 = call i8* @llvm.objc.retainAutorelease(i8* %arg0)
134	ret i8* %0
135}
136
137define i8* @test_objc_retainAutoreleaseReturnValue(i8* %arg0) {
138; CHECK-LABEL: test_objc_retainAutoreleaseReturnValue
139; CHECK-NEXT: entry
140; CHECK-NEXT: %0 = tail call i8* @objc_retainAutoreleaseReturnValue(i8* %arg0)
141; CHECK-NEXT: ret i8* %0
142entry:
143  %0 = tail call i8* @llvm.objc.retainAutoreleaseReturnValue(i8* %arg0)
144	ret i8* %0
145}
146
147define i8* @test_objc_retainAutoreleasedReturnValue(i8* %arg0) {
148; CHECK-LABEL: test_objc_retainAutoreleasedReturnValue
149; CHECK-NEXT: entry
150; CHECK-NEXT: %0 = call i8* @objc_retainAutoreleasedReturnValue(i8* %arg0)
151; CHECK-NEXT: ret i8* %0
152entry:
153  %0 = call i8* @llvm.objc.retainAutoreleasedReturnValue(i8* %arg0)
154	ret i8* %0
155}
156
157define i8* @test_objc_retainBlock(i8* %arg0) {
158; CHECK-LABEL: test_objc_retainBlock
159; CHECK-NEXT: entry
160; CHECK-NEXT: %0 = call i8* @objc_retainBlock(i8* %arg0)
161; CHECK-NEXT: ret i8* %0
162entry:
163  %0 = call i8* @llvm.objc.retainBlock(i8* %arg0)
164	ret i8* %0
165}
166
167define void @test_objc_storeStrong(i8** %arg0, i8* %arg1) {
168; CHECK-LABEL: test_objc_storeStrong
169; CHECK-NEXT: entry
170; CHECK-NEXT: call void @objc_storeStrong(i8** %arg0, i8* %arg1)
171; CHECK-NEXT: ret void
172entry:
173  call void @llvm.objc.storeStrong(i8** %arg0, i8* %arg1)
174	ret void
175}
176
177define i8* @test_objc_storeWeak(i8** %arg0, i8* %arg1) {
178; CHECK-LABEL: test_objc_storeWeak
179; CHECK-NEXT: entry
180; CHECK-NEXT: %0 = call i8* @objc_storeWeak(i8** %arg0, i8* %arg1)
181; CHECK-NEXT: ret i8* %0
182entry:
183  %0 = call i8* @llvm.objc.storeWeak(i8** %arg0, i8* %arg1)
184	ret i8* %0
185}
186
187define i8* @test_objc_unsafeClaimAutoreleasedReturnValue(i8* %arg0) {
188; CHECK-LABEL: test_objc_unsafeClaimAutoreleasedReturnValue
189; CHECK-NEXT: entry
190; CHECK-NEXT: %0 = call i8* @objc_unsafeClaimAutoreleasedReturnValue(i8* %arg0)
191; CHECK-NEXT: ret i8* %0
192entry:
193  %0 = call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %arg0)
194  ret i8* %0
195}
196
197define i8* @test_objc_retainedObject(i8* %arg0) {
198; CHECK-LABEL: test_objc_retainedObject
199; CHECK-NEXT: entry
200; CHECK-NEXT: %0 = call i8* @objc_retainedObject(i8* %arg0)
201; CHECK-NEXT: ret i8* %0
202entry:
203  %0 = call i8* @llvm.objc.retainedObject(i8* %arg0)
204  ret i8* %0
205}
206
207define i8* @test_objc_unretainedObject(i8* %arg0) {
208; CHECK-LABEL: test_objc_unretainedObject
209; CHECK-NEXT: entry
210; CHECK-NEXT: %0 = call i8* @objc_unretainedObject(i8* %arg0)
211; CHECK-NEXT: ret i8* %0
212entry:
213  %0 = call i8* @llvm.objc.unretainedObject(i8* %arg0)
214  ret i8* %0
215}
216
217define i8* @test_objc_unretainedPointer(i8* %arg0) {
218; CHECK-LABEL: test_objc_unretainedPointer
219; CHECK-NEXT: entry
220; CHECK-NEXT: %0 = call i8* @objc_unretainedPointer(i8* %arg0)
221; CHECK-NEXT: ret i8* %0
222entry:
223  %0 = call i8* @llvm.objc.unretainedPointer(i8* %arg0)
224  ret i8* %0
225}
226
227define i8* @test_objc_retain_autorelease(i8* %arg0) {
228; CHECK-LABEL: test_objc_retain_autorelease
229; CHECK-NEXT: entry
230; CHECK-NEXT: %0 = call i8* @objc_retain_autorelease(i8* %arg0)
231; CHECK-NEXT: ret i8* %0
232entry:
233  %0 = call i8* @llvm.objc.retain.autorelease(i8* %arg0)
234  ret i8* %0
235}
236
237define i32 @test_objc_sync_enter(i8* %arg0) {
238; CHECK-LABEL: test_objc_sync_enter
239; CHECK-NEXT: entry
240; CHECK-NEXT: %0 = call i32 @objc_sync_enter(i8* %arg0)
241; CHECK-NEXT: ret i32 %0
242entry:
243  %0 = call i32 @llvm.objc.sync.enter(i8* %arg0)
244  ret i32 %0
245}
246
247define i32 @test_objc_sync_exit(i8* %arg0) {
248; CHECK-LABEL: test_objc_sync_exit
249; CHECK-NEXT: entry
250; CHECK-NEXT: %0 = call i32 @objc_sync_exit(i8* %arg0)
251; CHECK-NEXT: ret i32 %0
252entry:
253  %0 = call i32 @llvm.objc.sync.exit(i8* %arg0)
254  ret i32 %0
255}
256
257declare i8* @llvm.objc.autorelease(i8*)
258declare void @llvm.objc.autoreleasePoolPop(i8*)
259declare i8* @llvm.objc.autoreleasePoolPush()
260declare i8* @llvm.objc.autoreleaseReturnValue(i8*)
261declare void @llvm.objc.copyWeak(i8**, i8**)
262declare void @llvm.objc.destroyWeak(i8**)
263declare extern_weak i8* @llvm.objc.initWeak(i8**, i8*)
264declare i8* @llvm.objc.loadWeak(i8**)
265declare i8* @llvm.objc.loadWeakRetained(i8**)
266declare void @llvm.objc.moveWeak(i8**, i8**)
267declare void @llvm.objc.release(i8*)
268declare i8* @llvm.objc.retain(i8*)
269declare i8* @llvm.objc.retainAutorelease(i8*)
270declare i8* @llvm.objc.retainAutoreleaseReturnValue(i8*)
271declare i8* @llvm.objc.retainAutoreleasedReturnValue(i8*)
272declare i8* @llvm.objc.retainBlock(i8*)
273declare void @llvm.objc.storeStrong(i8**, i8*)
274declare i8* @llvm.objc.storeWeak(i8**, i8*)
275declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*)
276declare i8* @llvm.objc.retainedObject(i8*)
277declare i8* @llvm.objc.unretainedObject(i8*)
278declare i8* @llvm.objc.unretainedPointer(i8*)
279declare i8* @llvm.objc.retain.autorelease(i8*)
280declare i32 @llvm.objc.sync.enter(i8*)
281declare i32 @llvm.objc.sync.exit(i8*)
282
283attributes #0 = { nounwind }
284
285; CHECK: declare i8* @objc_autorelease(i8*)
286; CHECK: declare void @objc_autoreleasePoolPop(i8*)
287; CHECK: declare i8* @objc_autoreleasePoolPush()
288; CHECK: declare i8* @objc_autoreleaseReturnValue(i8*)
289; CHECK: declare void @objc_copyWeak(i8**, i8**)
290; CHECK: declare void @objc_destroyWeak(i8**)
291; CHECK: declare extern_weak i8* @objc_initWeak(i8**, i8*)
292; CHECK: declare i8* @objc_loadWeak(i8**)
293; CHECK: declare i8* @objc_loadWeakRetained(i8**)
294; CHECK: declare void @objc_moveWeak(i8**, i8**)
295; CHECK: declare void @objc_release(i8*) [[NLB:#[0-9]+]]
296; CHECK: declare i8* @objc_retain(i8*) [[NLB]]
297; CHECK: declare i8* @objc_retainAutorelease(i8*)
298; CHECK: declare i8* @objc_retainAutoreleaseReturnValue(i8*)
299; CHECK: declare i8* @objc_retainAutoreleasedReturnValue(i8*)
300; CHECK: declare i8* @objc_retainBlock(i8*)
301; CHECK: declare void @objc_storeStrong(i8**, i8*)
302; CHECK: declare i8* @objc_storeWeak(i8**, i8*)
303; CHECK: declare i8* @objc_unsafeClaimAutoreleasedReturnValue(i8*)
304; CHECK: declare i8* @objc_retainedObject(i8*)
305; CHECK: declare i8* @objc_unretainedObject(i8*)
306; CHECK: declare i8* @objc_unretainedPointer(i8*)
307; CHECK: declare i8* @objc_retain_autorelease(i8*)
308; CHECK: declare i32 @objc_sync_enter(i8*)
309; CHECK: declare i32 @objc_sync_exit(i8*)
310
311; CHECK: attributes #0 = { nounwind }
312; CHECK: attributes [[NLB]] = { nonlazybind }
313