summaryrefslogtreecommitdiffstats
path: root/llvm/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
commit1736c14b857c24f613d3e5d6daed725b0543e5f5 (patch)
tree7c94a7a6153913d6702435a83560c4a17c46d399 /llvm/test
parent63a4ea185965b3278fb07b7b865910eb18ee83ad (diff)
downloadbcm5719-llvm-1736c14b857c24f613d3e5d6daed725b0543e5f5.tar.gz
bcm5719-llvm-1736c14b857c24f613d3e5d6daed725b0543e5f5.zip
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 llvm-svn: 142222
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/Transforms/ObjCARC/basic.ll31
1 files changed, 31 insertions, 0 deletions
diff --git a/llvm/test/Transforms/ObjCARC/basic.ll b/llvm/test/Transforms/ObjCARC/basic.ll
index 575cf42d4e6..861173b9c9e 100644
--- a/llvm/test/Transforms/ObjCARC/basic.ll
+++ b/llvm/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.
OpenPOWER on IntegriCloud