diff options
author | Logan Chien <loganchien@google.com> | 2011-10-20 00:08:13 +0800 |
---|---|---|
committer | Logan Chien <loganchien@google.com> | 2011-10-20 00:09:35 +0800 |
commit | 0ebc07a576037e4e36f68bf5cece32740ca120c0 (patch) | |
tree | c2e40648043d01498ee25af839a071193561e425 /test/Transforms/ObjCARC/empty-block.ll | |
parent | 62383e889e0b06fd12a6b88311717cd33a1925c4 (diff) | |
parent | cdd8e46bec4e975d00a5abea808d8eb4138515c5 (diff) | |
download | external_llvm-0ebc07a576037e4e36f68bf5cece32740ca120c0.tar.gz external_llvm-0ebc07a576037e4e36f68bf5cece32740ca120c0.tar.bz2 external_llvm-0ebc07a576037e4e36f68bf5cece32740ca120c0.zip |
Merge with LLVM upstream 2011/10/20 (r142530)
Conflicts:
lib/Support/Unix/Host.inc
Change-Id: Idc00db3b63912dca6348bddd9f8a1af2a8d5d147
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 0000000000..ca5541365a --- /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 !{} |