xref: /llvm-project/llvm/test/Transforms/ObjCARC/clang-arc-use-barrier.ll (revision 01e4f41b43b57dee751146fde9992c660bd7c714)
1; RUN: opt -passes=objc-arc -S %s | FileCheck %s
2
3%0 = type opaque
4
5; Make sure ARC optimizer doesn't sink @obj_retain past @llvm.objc.clang.arc.use.
6
7; CHECK: call ptr @llvm.objc.retain
8; CHECK: call void (...) @llvm.objc.clang.arc.use(
9; CHECK: call ptr @llvm.objc.retain
10; CHECK: call void (...) @llvm.objc.clang.arc.use(
11
12define void @runTest() local_unnamed_addr {
13  %1 = alloca ptr, align 8
14  %2 = alloca ptr, align 8
15  %3 = tail call ptr @foo0()
16  %4 = tail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr %3)
17  store ptr %3, ptr %1, align 8
18  call void @foo1(ptr nonnull %1)
19  %5 = load ptr, ptr %1, align 8
20  %6 = call ptr @llvm.objc.retain(ptr %5)
21  call void (...) @llvm.objc.clang.arc.use(ptr %3)
22  call void @llvm.objc.release(ptr %3)
23  store ptr %5, ptr %2, align 8
24  call void @foo1(ptr nonnull %2)
25  %7 = load ptr, ptr %2, align 8
26  %8 = call ptr @llvm.objc.retain(ptr %7)
27  call void (...) @llvm.objc.clang.arc.use(ptr %5)
28  %tmp1 = load ptr, ptr %2, align 8
29  call void @llvm.objc.release(ptr %5)
30  call void @foo2(ptr %7)
31  call void @llvm.objc.release(ptr %7)
32  ret void
33}
34
35declare ptr @foo0() local_unnamed_addr
36declare void @foo1(ptr) local_unnamed_addr
37declare void @foo2(ptr) local_unnamed_addr
38
39declare ptr @llvm.objc.retainAutoreleasedReturnValue(ptr) local_unnamed_addr
40declare ptr @llvm.objc.retain(ptr) local_unnamed_addr
41declare void @llvm.objc.clang.arc.use(...) local_unnamed_addr
42declare void @llvm.objc.release(ptr) local_unnamed_addr
43