brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 8d4027a Raw
108 lines · plain
1// RUN: %clang_cc1 -triple x86_64-unknown-freebsd -fobjc-arc -emit-llvm -fobjc-runtime=gnustep-2.0 -o - %s | FileCheck %s2 3typedef struct {4  int x[12];5} Big;6 7@protocol P8- (Big) foo;9- (Big) fooConsuming: (__attribute__((ns_consumed)) id) arg;10- (_Complex float) complex;11@end12 13@interface SuperClass14- (Big) foo;15@end16 17@implementation TestClass : SuperClass18//   Check that we don't do a nil check when messaging self in ARC19//   (which forbids reassigning self)20// CHECK-LABEL: define{{.*}} void @_i_TestClass__test_self_send(21// CHECK-NOT:   icmp22// CHECK:       @objc_msg_lookup_sender23- (void) test_self_send {24  Big big = [self foo];25}26 27//   Check that we don't do a nil test when messaging super.28// CHECK-LABEL: define{{.*}} void @_i_TestClass__test_super_send(29// CHECK-NOT:   icmp30// CHECK:       @objc_msg_lookup_super31- (void) test_super_send {32  Big big = [super foo];33}34@end35 36// CHECK-LABEL: define{{.*}} void @test_loop_zeroing(37// CHECK:         [[P:%.*]] = alloca ptr,38// CHECK:         [[BIG:%.*]] = alloca %struct.Big,39// CHECK:         br label %for.cond40//41// CHECK:       for.cond:42// CHECK-NEXT:    [[RECEIVER:%.*]] = load ptr, ptr [[P]],43// CHECK-NEXT:    [[ISNIL:%.*]] = icmp eq ptr [[RECEIVER]], null44// CHECK-NEXT:    br i1 [[ISNIL]], label %nilReceiverCleanup, label %msgSend45//46// CHECK:       msgSend:47// CHECK:         @objc_msg_lookup_sender48// CHECK:         call void {{%.*}}({{.*}} [[BIG]],49// CHECK:         br label %continue50//51// CHECK:       nilReceiverCleanup:52// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[BIG]], i8 0, i64 48, i1 false)53// CHECK-NEXT:    br label %continue54//55// CHECK:       continue:56// CHECK-NEXT:    br label %for.cond57void test_loop_zeroing(id<P> p) {58  for (;;) {59    Big big = [p foo];60  }61}62 63// CHECK-LABEL: define{{.*}} void @test_zeroing_and_consume(64// CHECK:         [[P:%.*]] = alloca ptr,65// CHECK:         [[Q:%.*]] = alloca ptr,66// CHECK:         [[BIG:%.*]] = alloca %struct.Big,67// CHECK:         br label %for.cond68//69// CHECK:       for.cond:70// CHECK-NEXT:    [[RECEIVER:%.*]] = load ptr, ptr [[P]],71// CHECK-NEXT:    [[Q_LOAD:%.*]] = load ptr, ptr [[Q]],72// CHECK-NEXT:    [[Q_RETAIN:%.*]] = call ptr @llvm.objc.retain(ptr [[Q_LOAD]])73// CHECK-NEXT:    [[ISNIL:%.*]] = icmp eq ptr [[RECEIVER]], null74// CHECK-NEXT:    br i1 [[ISNIL]], label %nilReceiverCleanup, label %msgSend75//76// CHECK:       msgSend:77// CHECK:         @objc_msg_lookup_sender78// CHECK:         call void {{%.*}}({{.*}} [[BIG]],79// CHECK:         br label %continue80//81// CHECK:       nilReceiverCleanup:82// CHECK-NEXT:    call void @llvm.objc.release(ptr [[Q_RETAIN]])83// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[BIG]], i8 0, i64 48, i1 false)84// CHECK-NEXT:    br label %continue85//86// CHECK:       continue:87// CHECK-NEXT:    br label %for.cond88void test_zeroing_and_consume(id<P> p, id q) {89  for (;;) {90    Big big = [p fooConsuming: q];91  }92}93 94// CHECK-LABEL: define{{.*}} void @test_complex(95// CHECK:         [[P:%.*]] = alloca ptr,96// CHECK:         [[RECEIVER:%.*]] = load ptr, ptr [[P]],97// CHECK-NEXT:    [[ISNIL:%.*]] = icmp eq ptr [[RECEIVER]], null98// CHECK-NEXT:    br i1 [[ISNIL]], label %continue, label %msgSend99// CHECK:       msgSend:100// CHECK:         @objc_msg_lookup_sender101// CHECK:         br label %continue102// CHECK:       continue:103// CHECK-NEXT:    phi float104// CHECK-NEXT:    phi float105void test_complex(id<P> p) {106  _Complex float f = [p complex];107}108