diff options
author | Dan Gohman <gohman@apple.com> | 2011-06-16 20:57:14 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2011-06-16 20:57:14 +0000 |
commit | 0860d0ba2f14e62572434cd159a086f91b20895d (patch) | |
tree | fe5281bdec6c540a153d3eea3db6cedc6a86c1fa /test/Transforms/ObjCARC/invoke.ll | |
parent | 714c0eb811340a41a602509b70ca83cd4b2f2868 (diff) | |
download | llvm-0860d0ba2f14e62572434cd159a086f91b20895d.tar.gz llvm-0860d0ba2f14e62572434cd159a086f91b20895d.tar.bz2 llvm-0860d0ba2f14e62572434cd159a086f91b20895d.tar.xz |
Fix ARCOpt to insert releases on both successors of an invoke rather
than trying to insert them immediately after the invoke.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@133188 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/ObjCARC/invoke.ll')
-rw-r--r-- | test/Transforms/ObjCARC/invoke.ll | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/test/Transforms/ObjCARC/invoke.ll b/test/Transforms/ObjCARC/invoke.ll new file mode 100644 index 0000000000..a1b87d230b --- /dev/null +++ b/test/Transforms/ObjCARC/invoke.ll @@ -0,0 +1,67 @@ +; RUN: opt -S -objc-arc < %s | FileCheck %s + +declare i8* @objc_retain(i8*) +declare void @objc_release(i8*) +declare i8* @objc_msgSend(i8*, i8*, ...) +declare void @use_pointer(i8*) +declare void @callee() + +; ARCOpt shouldn't try to move the releases to the block containing the invoke. + +; CHECK: define void @test0( +; CHECK: invoke.cont: +; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 +; CHECK: ret void +; CHECK: lpad: +; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 +; CHECK: ret void +define void @test0(i8* %zipFile) { +entry: + call i8* @objc_retain(i8* %zipFile) nounwind + call void @use_pointer(i8* %zipFile) + invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*)*)(i8* %zipFile) + to label %invoke.cont unwind label %lpad + +invoke.cont: ; preds = %entry + call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 + ret void + +lpad: ; preds = %entry + call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 + ret void +} + +; ARCOpt should move the release before the callee calls. + +; CHECK: define void @test1( +; CHECK: invoke.cont: +; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 +; CHECK: call void @callee() +; CHECK: br label %done +; CHECK: lpad: +; CHECK: call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 +; CHECK: call void @callee() +; CHECK: br label %done +; CHECK: done: +; CHECK-NEXT: ret void +define void @test1(i8* %zipFile) { +entry: + call i8* @objc_retain(i8* %zipFile) nounwind + call void @use_pointer(i8* %zipFile) + invoke void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*)*)(i8* %zipFile) + to label %invoke.cont unwind label %lpad + +invoke.cont: ; preds = %entry + call void @callee() + br label %done + +lpad: ; preds = %entry + call void @callee() + br label %done + +done: + call void @objc_release(i8* %zipFile) nounwind, !clang.imprecise_release !0 + ret void +} + +!0 = metadata !{} |