101 lines · plain
1// RUN: %clang_cc1 -fobjc-arc -fobjc-runtime-has-weak -fblocks -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=UNOPT2// RUN: %clang_cc1 -fobjc-arc -fobjc-runtime-has-weak -fblocks -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s -O -disable-llvm-passes | FileCheck %s -check-prefix=CHECK -check-prefix=OPT3 4typedef __strong id strong_id;5typedef __weak id weak_id;6 7// CHECK-LABEL: define{{.*}} void @_Z8test_newP11objc_object8void test_new(id invalue) {9 // CHECK: [[INVALUEADDR:%.*]] = alloca ptr10 // UNOPT-NEXT: store ptr null, ptr [[INVALUEADDR]]11 // UNOPT-NEXT: call void @llvm.objc.storeStrong(ptr [[INVALUEADDR]], ptr [[INVALUE:%.*]])12 // OPT-NEXT: [[T0:%.*]] = call ptr @llvm.objc.retain(ptr [[INVALUE:%.*]])13 // OPT-NEXT: store ptr [[T0]], ptr [[INVALUEADDR]]14 15 // CHECK: [[CALL:%.*]] = call noalias noundef nonnull ptr @_Znwm16 // CHECK-NEXT: store ptr null, ptr17 new strong_id;18 // CHECK: [[CALL:%.*]] = call noalias noundef nonnull ptr @_Znwm19 // UNOPT-NEXT: store ptr null, ptr20 // OPT-NEXT: call ptr @llvm.objc.initWeak(ptr {{.*}}, ptr null)21 new weak_id;22 23 // CHECK: [[CALL:%.*]] = call noalias noundef nonnull ptr @_Znwm24 // CHECK-NEXT: store ptr null, ptr25 new __strong id;26 // CHECK: [[CALL:%.*]] = call noalias noundef nonnull ptr @_Znwm27 // UNOPT-NEXT: store ptr null, ptr28 // OPT-NEXT: call ptr @llvm.objc.initWeak(ptr {{.*}}, ptr null)29 new __weak id;30 31 // CHECK: [[CALL:%.*]] = call noalias noundef nonnull ptr @_Znwm32 // CHECK: call ptr @llvm.objc.retain33 // CHECK: store ptr34 new __strong id(invalue);35 36 // CHECK: [[CALL:%.*]] = call noalias noundef nonnull ptr @_Znwm37 // CHECK: call ptr @llvm.objc.initWeak38 new __weak id(invalue);39 40 // UNOPT: call void @llvm.objc.storeStrong41 // OPT: call void @llvm.objc.release42 // CHECK: ret void43}44 45// CHECK-LABEL: define{{.*}} void @_Z14test_array_new46void test_array_new() {47 // CHECK: call noalias noundef nonnull ptr @_Znam48 // CHECK: store i64 17, ptr49 // CHECK: call void @llvm.memset.p0.i6450 new strong_id[17];51 52 // CHECK: call noalias noundef nonnull ptr @_Znam53 // CHECK: store i64 17, ptr54 // CHECK: call void @llvm.memset.p0.i6455 new weak_id[17];56 // CHECK: ret void57}58 59// CHECK-LABEL: define{{.*}} void @_Z11test_deletePU8__strongP11objc_objectPU6__weakS0_60void test_delete(__strong id *sptr, __weak id *wptr) {61 // CHECK: br i162 // UNOPT: call void @llvm.objc.storeStrong(ptr {{.*}}, ptr null)63 // OPT: load ptr, ptr64 // OPT-NEXT: call void @llvm.objc.release65 // CHECK: call void @_ZdlPv66 delete sptr;67 68 // CHECK: call void @llvm.objc.destroyWeak69 // CHECK: call void @_ZdlPv70 delete wptr;71 72 // CHECK: ret void73}74 75// CHECK-LABEL: define{{.*}} void @_Z17test_array_deletePU8__strongP11objc_objectPU6__weakS0_76void test_array_delete(__strong id *sptr, __weak id *wptr) {77 // CHECK: icmp eq ptr [[BEGIN:%.*]], null78 // CHECK: [[LEN:%.*]] = load i64, ptr {{%.*}}79 // CHECK: [[END:%.*]] = getelementptr inbounds ptr, ptr [[BEGIN]], i64 [[LEN]]80 // CHECK-NEXT: icmp eq ptr [[BEGIN]], [[END]]81 // CHECK: [[PAST:%.*]] = phi ptr [ [[END]], {{%.*}} ], [ [[CUR:%.*]],82 // CHECK-NEXT: [[CUR]] = getelementptr inbounds ptr, ptr [[PAST]], i64 -183 // UNOPT-NEXT: call void @llvm.objc.storeStrong(ptr [[CUR]], ptr null)84 // OPT-NEXT: [[T0:%.*]] = load ptr, ptr [[CUR]]85 // OPT-NEXT: llvm.objc.release(ptr [[T0]])86 // CHECK-NEXT: icmp eq ptr [[CUR]], [[BEGIN]]87 // CHECK: call void @_ZdaPv88 delete [] sptr;89 90 // CHECK: icmp eq ptr [[BEGIN:%.*]], null91 // CHECK: [[LEN:%.*]] = load i64, ptr {{%.*}}92 // CHECK: [[END:%.*]] = getelementptr inbounds ptr, ptr [[BEGIN]], i64 [[LEN]]93 // CHECK-NEXT: icmp eq ptr [[BEGIN]], [[END]]94 // CHECK: [[PAST:%.*]] = phi ptr [ [[END]], {{%.*}} ], [ [[CUR:%.*]],95 // CHECK-NEXT: [[CUR]] = getelementptr inbounds ptr, ptr [[PAST]], i64 -196 // CHECK-NEXT: call void @llvm.objc.destroyWeak(ptr [[CUR]])97 // CHECK-NEXT: icmp eq ptr [[CUR]], [[BEGIN]]98 // CHECK: call void @_ZdaPv99 delete [] wptr;100}101