diff options
Diffstat (limited to 'llvm/test/Transforms/ObjCARC/unsafe-claim-rv.ll')
-rw-r--r-- | llvm/test/Transforms/ObjCARC/unsafe-claim-rv.ll | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/llvm/test/Transforms/ObjCARC/unsafe-claim-rv.ll b/llvm/test/Transforms/ObjCARC/unsafe-claim-rv.ll new file mode 100644 index 00000000000..8b648025655 --- /dev/null +++ b/llvm/test/Transforms/ObjCARC/unsafe-claim-rv.ll @@ -0,0 +1,47 @@ +; RUN: opt -objc-arc -S < %s | FileCheck %s + +; Generated by compiling: +; +; id baz(void *X) { return (__bridge_transfer id)X; } +; +; void foo(id X) { +; void *Y = 0; +; if (X) +; Y = (__bridge_retained void *)X; +; baz(Y); +; } +; +; clang -x objective-c -mllvm -enable-objc-arc-opts=0 -fobjc-arc -S -emit-llvm test.m +; +; And then hand-reduced further. + +declare i8* @llvm.objc.autoreleaseReturnValue(i8*) +declare i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8*) +declare i8* @llvm.objc.retain(i8*) +declare void @llvm.objc.release(i8*) + +define void @foo(i8* %X) { +entry: + %0 = tail call i8* @llvm.objc.retain(i8* %X) + %tobool = icmp eq i8* %0, null + br i1 %tobool, label %if.end, label %if.then + +if.then: ; preds = %entry + %1 = tail call i8* @llvm.objc.retain(i8* nonnull %0) + br label %if.end + +if.end: ; preds = %if.then, %entry + %Y.0 = phi i8* [ %1, %if.then ], [ null, %entry ] + %2 = tail call i8* @llvm.objc.autoreleaseReturnValue(i8* %Y.0) + %3 = tail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %2) + tail call void @llvm.objc.release(i8* %0) + ret void +} + +; CHECK: if.then +; CHECK: tail call i8* @llvm.objc.retain +; CHECK-NEXT: call i8* @llvm.objc.autorelease +; CHECK: %Y.0 = phi +; CHECK-NEXT: tail call i8* @llvm.objc.unsafeClaimAutoreleasedReturnValue(i8* %Y.0) +; CHECK-NEXT: tail call void @llvm.objc.release + |