summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2011-10-17 18:48:25 +0000
committerDan Gohman <gohman@apple.com>2011-10-17 18:48:25 +0000
commit90b8bcd33ab4fd7dd95bd1dc9a2d7d03dcd83ad6 (patch)
treeecfce8de92b1f5a2bfd8d40d85e969bcdb99523f /test
parent3c5e60994f53eef2808a33b5ca6c3dffc2168054 (diff)
downloadllvm-90b8bcd33ab4fd7dd95bd1dc9a2d7d03dcd83ad6.tar.gz
llvm-90b8bcd33ab4fd7dd95bd1dc9a2d7d03dcd83ad6.tar.bz2
llvm-90b8bcd33ab4fd7dd95bd1dc9a2d7d03dcd83ad6.tar.xz
Suppress partial retain+release elimination when there's a
possibility that it will span multiple CFG diamonds/triangles which could have different controlling predicates. rdar://10282956 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142222 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/Transforms/ObjCARC/basic.ll31
1 files changed, 31 insertions, 0 deletions
diff --git a/test/Transforms/ObjCARC/basic.ll b/test/Transforms/ObjCARC/basic.ll
index 575cf42d4e..861173b9c9 100644
--- a/test/Transforms/ObjCARC/basic.ll
+++ b/test/Transforms/ObjCARC/basic.ll
@@ -86,6 +86,37 @@ alt_return:
ret void
}
+; Don't do partial elimination into two different CFG diamonds.
+
+; CHECK: define void @test1b(
+; CHECK: entry:
+; CHECK: tail call i8* @objc_retain(i8* %x) nounwind
+; CHECK-NOT: @objc_
+; CHECK: if.end5:
+; CHECK: tail call void @objc_release(i8* %x) nounwind, !clang.imprecise_release !0
+; CHECK-NOT: @objc_
+; CHECK: }
+define void @test1b(i8* %x, i1 %p, i1 %q) {
+entry:
+ tail call i8* @objc_retain(i8* %x) nounwind
+ br i1 %p, label %if.then, label %if.end
+
+if.then: ; preds = %entry
+ tail call void @callee()
+ br label %if.end
+
+if.end: ; preds = %if.then, %entry
+ br i1 %q, label %if.then3, label %if.end5
+
+if.then3: ; preds = %if.end
+ tail call void @use_pointer(i8* %x)
+ br label %if.end5
+
+if.end5: ; preds = %if.then3, %if.end
+ tail call void @objc_release(i8* %x) nounwind, !clang.imprecise_release !0
+ ret void
+}
+
; Like test0 but the pointer is passed to an intervening call,
; so the optimization is not safe.