diff options
author | Dan Gohman <gohman@apple.com> | 2011-10-17 18:48:25 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2011-10-17 18:48:25 +0000 |
commit | 90b8bcd33ab4fd7dd95bd1dc9a2d7d03dcd83ad6 (patch) | |
tree | ecfce8de92b1f5a2bfd8d40d85e969bcdb99523f /test/Transforms/ObjCARC | |
parent | 3c5e60994f53eef2808a33b5ca6c3dffc2168054 (diff) | |
download | external_llvm-90b8bcd33ab4fd7dd95bd1dc9a2d7d03dcd83ad6.zip external_llvm-90b8bcd33ab4fd7dd95bd1dc9a2d7d03dcd83ad6.tar.gz external_llvm-90b8bcd33ab4fd7dd95bd1dc9a2d7d03dcd83ad6.tar.bz2 |
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/Transforms/ObjCARC')
-rw-r--r-- | test/Transforms/ObjCARC/basic.ll | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/test/Transforms/ObjCARC/basic.ll b/test/Transforms/ObjCARC/basic.ll index 575cf42..861173b 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. |