58 lines · plain
1; RUN: opt -S -passes=objc-arc < %s | FileCheck %s2; rdar://102102743 4%0 = type opaque5 6declare ptr @llvm.objc.retain(ptr)7 8declare void @llvm.objc.release(ptr)9 10declare ptr @llvm.objc.autoreleaseReturnValue(ptr)11 12; Don't delete the autorelease.13 14; CHECK-LABEL: define ptr @test0(15; CHECK: @llvm.objc.retain16; CHECK: .lr.ph:17; CHECK-NOT: @llvm.objc.r18; CHECK: @llvm.objc.autoreleaseReturnValue19; CHECK-NOT: @llvm.objc.20; CHECK: }21define ptr @test0(ptr %buffer, i1 %arg) nounwind {22 %1 = tail call ptr @llvm.objc.retain(ptr %buffer) nounwind23 br i1 %arg, label %.lr.ph, label %._crit_edge24 25.lr.ph: ; preds = %.lr.ph, %026 br i1 false, label %.lr.ph, label %._crit_edge27 28._crit_edge: ; preds = %.lr.ph, %029 %2 = tail call ptr @llvm.objc.retain(ptr %buffer) nounwind30 tail call void @llvm.objc.release(ptr %buffer) nounwind, !clang.imprecise_release !031 %3 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %buffer) nounwind32 ret ptr %buffer33}34 35; Do delete the autorelease, even with the retain in a different block.36 37; CHECK-LABEL: define ptr @test1(38; CHECK-NOT: @objc39; CHECK: }40define ptr @test1(i1 %arg) nounwind {41 %buffer = call ptr @foo()42 %1 = tail call ptr @llvm.objc.retain(ptr %buffer) nounwind43 br i1 %arg, label %.lr.ph, label %._crit_edge44 45.lr.ph: ; preds = %.lr.ph, %046 br i1 false, label %.lr.ph, label %._crit_edge47 48._crit_edge: ; preds = %.lr.ph, %049 %2 = tail call ptr @llvm.objc.retain(ptr %buffer) nounwind50 tail call void @llvm.objc.release(ptr %buffer) nounwind, !clang.imprecise_release !051 %3 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %buffer) nounwind52 ret ptr %buffer53}54 55declare ptr @foo()56 57!0 = !{}58