brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · be70bee Raw
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