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