brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.3 KiB · 5e1fe0a Raw
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