xref: /llvm-project/llvm/test/Transforms/ObjCARC/unsafe-claim-rv.ll (revision 01e4f41b43b57dee751146fde9992c660bd7c714)
1; RUN: opt -passes=objc-arc -S < %s | FileCheck %s
2
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.m
15;
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, null
27  br i1 %tobool, label %if.end, label %if.then
28
29if.then:                                          ; preds = %entry
30  %1 = tail call ptr @llvm.objc.retain(ptr nonnull %0)
31  br label %if.end
32
33if.end:                                           ; preds = %if.then, %entry
34  %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 void
39}
40
41; CHECK: if.then
42; CHECK: tail call ptr @llvm.objc.retain
43; CHECK: %Y.0 = phi
44; CHECK-NEXT: tail call void @llvm.objc.release
45; CHECK-NEXT: tail call void @llvm.objc.release
46
47