diff options
author | dim <dim@FreeBSD.org> | 2011-10-20 21:10:27 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2011-10-20 21:10:27 +0000 |
commit | 7b3392326c40c3c20697816acae597ba7b3144eb (patch) | |
tree | 2cbcf22585e99f8a87d12d5ff94f392c0d266819 /test/Transforms/ObjCARC/empty-block.ll | |
parent | 1176aa52646fe641a4243a246aa7f960c708a274 (diff) | |
download | FreeBSD-src-7b3392326c40c3c20697816acae597ba7b3144eb.zip FreeBSD-src-7b3392326c40c3c20697816acae597ba7b3144eb.tar.gz |
Vendor import of llvm release_30 branch r142614:
http://llvm.org/svn/llvm-project/llvm/branches/release_30@142614
Diffstat (limited to 'test/Transforms/ObjCARC/empty-block.ll')
-rw-r--r-- | test/Transforms/ObjCARC/empty-block.ll | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/test/Transforms/ObjCARC/empty-block.ll b/test/Transforms/ObjCARC/empty-block.ll new file mode 100644 index 0000000..ca55413 --- /dev/null +++ b/test/Transforms/ObjCARC/empty-block.ll @@ -0,0 +1,59 @@ +; RUN: opt -S -objc-arc < %s | FileCheck %s +; rdar://10210274 + +%0 = type opaque + +declare i8* @objc_retain(i8*) + +declare void @objc_release(i8*) + +declare i8* @objc_autoreleaseReturnValue(i8*) + +; Don't delete the autorelease. + +; CHECK: define %0* @test0( +; CHECK: @objc_retain +; CHECK: .lr.ph: +; CHECK-NOT: @objc_r +; CHECK: @objc_autoreleaseReturnValue +; CHECK-NOT: @objc_ +; CHECK: } +define %0* @test0(%0* %buffer) nounwind { + %1 = bitcast %0* %buffer to i8* + %2 = tail call i8* @objc_retain(i8* %1) nounwind + br i1 undef, label %.lr.ph, label %._crit_edge + +.lr.ph: ; preds = %.lr.ph, %0 + br i1 false, label %.lr.ph, label %._crit_edge + +._crit_edge: ; preds = %.lr.ph, %0 + %3 = tail call i8* @objc_retain(i8* %1) nounwind + tail call void @objc_release(i8* %1) nounwind, !clang.imprecise_release !0 + %4 = tail call i8* @objc_autoreleaseReturnValue(i8* %1) nounwind + ret %0* %buffer +} + +; Do delete the autorelease, even with the retain in a different block. + +; CHECK: define %0* @test1( +; CHECK-NOT: @objc +; CHECK: } +define %0* @test1() nounwind { + %buffer = call %0* @foo() + %1 = bitcast %0* %buffer to i8* + %2 = tail call i8* @objc_retain(i8* %1) nounwind + br i1 undef, label %.lr.ph, label %._crit_edge + +.lr.ph: ; preds = %.lr.ph, %0 + br i1 false, label %.lr.ph, label %._crit_edge + +._crit_edge: ; preds = %.lr.ph, %0 + %3 = tail call i8* @objc_retain(i8* %1) nounwind + tail call void @objc_release(i8* %1) nounwind, !clang.imprecise_release !0 + %4 = tail call i8* @objc_autoreleaseReturnValue(i8* %1) nounwind + ret %0* %buffer +} + +declare %0* @foo() + +!0 = metadata !{} |