xref: /aosp_15_r20/external/clang/test/CodeGenObjC/arc-loadweakretained-release.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fblocks -fobjc-arc -fobjc-runtime-has-weak -o - %s | FileCheck %s
2*67e74705SXin Li// rdar://10849570
3*67e74705SXin Li
4*67e74705SXin Li@interface NSObject @end
5*67e74705SXin Li
6*67e74705SXin Li@interface SomeClass : NSObject
7*67e74705SXin Li- (id) init;
8*67e74705SXin Li@end
9*67e74705SXin Li
10*67e74705SXin Li@implementation SomeClass
11*67e74705SXin Li- (void)foo {
12*67e74705SXin Li}
13*67e74705SXin Li- (id) init {
14*67e74705SXin Li    return 0;
15*67e74705SXin Li}
16*67e74705SXin Li+ alloc { return 0; }
17*67e74705SXin Li@end
18*67e74705SXin Li
19*67e74705SXin Liint main (int argc, const char * argv[]) {
20*67e74705SXin Li    @autoreleasepool {
21*67e74705SXin Li        SomeClass *objPtr1 = [[SomeClass alloc] init];
22*67e74705SXin Li        __weak SomeClass *weakRef = objPtr1;
23*67e74705SXin Li
24*67e74705SXin Li        [weakRef foo];
25*67e74705SXin Li
26*67e74705SXin Li        objPtr1 = (void *)0;
27*67e74705SXin Li        return 0;
28*67e74705SXin Li    }
29*67e74705SXin Li}
30*67e74705SXin Li
31*67e74705SXin Li// CHECK: [[SIXTEEN:%.*]]  = call i8* @objc_loadWeakRetained(i8** {{%.*}})
32*67e74705SXin Li// CHECK-NEXT:  [[SEVENTEEN:%.*]] = bitcast i8* [[SIXTEEN]] to {{%.*}}
33*67e74705SXin Li// CHECK-NEXT:  [[EIGHTEEN:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_.6
34*67e74705SXin Li// CHECK-NEXT:  [[NINETEEN:%.*]] = bitcast %0* [[SEVENTEEN]] to i8*
35*67e74705SXin Li// CHECK-NEXT:  call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend
36*67e74705SXin Li// CHECK-NEXT:  [[TWENTY:%.*]] = bitcast %0* [[SEVENTEEN]] to i8*
37*67e74705SXin Li// CHECK-NEXT:  call void @objc_release(i8* [[TWENTY]])
38*67e74705SXin Li
39*67e74705SXin Livoid test1(int cond) {
40*67e74705SXin Li  extern void test34_sink(id *);
41*67e74705SXin Li  __weak id weak;
42*67e74705SXin Li  test34_sink(cond ? &weak : 0);
43*67e74705SXin Li}
44*67e74705SXin Li
45*67e74705SXin Li// CHECK-LABEL: define void @test1(
46*67e74705SXin Li// CHECK: [[CONDADDR:%.*]] = alloca i32
47*67e74705SXin Li// CHECK-NEXT: [[WEAK:%.*]] = alloca i8*
48*67e74705SXin Li// CHECK-NEXT: [[INCRTEMP:%.*]] = alloca i8*
49*67e74705SXin Li// CHECK-NEXT: [[CONDCLEANUPSAVE:%.*]] = alloca i8*
50*67e74705SXin Li// CHECK-NEXT: [[CONDCLEANUP:%.*]] = alloca i1
51*67e74705SXin Li// CHECK-NEXT: store i32
52*67e74705SXin Li// CHECK-NEXT: store i8* null, i8** [[WEAK]]
53*67e74705SXin Li// CHECK:  [[COND1:%.*]] = phi i8**
54*67e74705SXin Li// CHECK-NEXT: [[ICRISNULL:%.*]] = icmp eq i8** [[COND1]], null
55*67e74705SXin Li// CHECK-NEXT: [[ICRARGUMENT:%.*]] = select i1 [[ICRISNULL]], i8** null, i8** [[INCRTEMP]]
56*67e74705SXin Li// CHECK-NEXT: store i1 false, i1* [[CONDCLEANUP]]
57*67e74705SXin Li// CHECK-NEXT: br i1 [[ICRISNULL]], label [[ICRCONT:%.*]], label [[ICRCOPY:%.*]]
58*67e74705SXin Li// CHECK:  [[ONE:%.*]] = call i8* @objc_loadWeakRetained(
59*67e74705SXin Li// CHECK-NEXT: store i8* [[ONE]], i8** [[CONDCLEANUPSAVE]]
60*67e74705SXin Li// CHECK-NEXT: store i1 true, i1* [[CONDCLEANUP]]
61*67e74705SXin Li// CHECK-NEXT: store i8* [[ONE]], i8** [[INCRTEMP]]
62*67e74705SXin Li// CHECK-NEXT: br label
63*67e74705SXin Li
64*67e74705SXin Li// CHECK: call void @test34_sink(
65*67e74705SXin Li// CHECK-NEXT: [[ICRISNULL1:%.*]] = icmp eq i8** [[COND1]], null
66*67e74705SXin Li// CHECK-NEXT: br i1 [[ICRISNULL1]], label [[ICRDONE:%.*]], label [[ICRWRITEBACK:%.*]]
67*67e74705SXin Li// CHECK:  [[TWO:%.*]] = load i8*, i8** [[INCRTEMP]]
68*67e74705SXin Li// CHECK-NEXT:  [[THREE:%.*]] = call i8* @objc_storeWeak(
69*67e74705SXin Li// CHECK-NEXT:  br label [[ICRDONE]]
70*67e74705SXin Li// CHECK:  [[CLEANUPISACTIVE:%.*]] = load i1, i1* [[CONDCLEANUP]]
71*67e74705SXin Li// CHECK-NEXT:  br i1 [[CLEANUPISACTIVE]], label [[CLEASNUPACTION:%.*]], label [[CLEANUPDONE:%.*]]
72*67e74705SXin Li
73*67e74705SXin Li// CHECK: [[FOUR:%.*]] = load i8*, i8** [[CONDCLEANUPSAVE]]
74*67e74705SXin Li// CHECK-NEXT: call void @objc_release(i8* [[FOUR]])
75*67e74705SXin Li// CHECK-NEXT:  br label
76*67e74705SXin Li// CHECK:  call void @objc_destroyWeak(i8** [[WEAK]])
77*67e74705SXin Li// CHECK-NEXT: ret void
78