brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · dfb0fcc Raw
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