47 lines · plain
1; RUN: opt -passes=objc-arc -S < %s | FileCheck %s2 3; Generated by compiling:4;5; id baz(ptr X) { return (__bridge_transfer id)X; }6; 7; void foo(id X) {8; ptr Y = 0;9; if (X)10; Y = (__bridge_retained ptr)X;11; baz(Y);12; }13;14; clang -x objective-c -mllvm -enable-objc-arc-opts=0 -fobjc-arc -S -emit-llvm test.m15;16; And then hand-reduced further. 17 18declare ptr @llvm.objc.autoreleaseReturnValue(ptr)19declare ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr)20declare ptr @llvm.objc.retain(ptr)21declare void @llvm.objc.release(ptr)22 23define void @foo(ptr %X) {24entry:25 %0 = tail call ptr @llvm.objc.retain(ptr %X) 26 %tobool = icmp eq ptr %0, null27 br i1 %tobool, label %if.end, label %if.then28 29if.then: ; preds = %entry30 %1 = tail call ptr @llvm.objc.retain(ptr nonnull %0)31 br label %if.end32 33if.end: ; preds = %if.then, %entry34 %Y.0 = phi ptr [ %1, %if.then ], [ null, %entry ]35 %2 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %Y.0)36 %3 = tail call ptr @llvm.objc.unsafeClaimAutoreleasedReturnValue(ptr %2)37 tail call void @llvm.objc.release(ptr %0) 38 ret void39}40 41; CHECK: if.then42; CHECK: tail call ptr @llvm.objc.retain43; CHECK: %Y.0 = phi44; CHECK-NEXT: tail call void @llvm.objc.release45; CHECK-NEXT: tail call void @llvm.objc.release46 47