blob: eb1ba9a0d73d9640872bb33c26ff686a83344faf [file] [log] [blame]
Douglas Gregor1c15cd62013-02-18 15:59:24 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin -fblocks -emit-llvm -o - %s | FileCheck %s
Saleem Abdulrasool5f25bc32013-02-17 04:03:34 +00002
3@interface NSObject
4+ (id) new;
5- (id) init;
6@end
7
8@interface Base : NSObject @end
9
10// @implementation Base
11// {
12// int dummy;
13// }
14// @end
15
16@interface Derived : Base
17{
18 @public int member;
19}
20@end
21
22@implementation Derived
23- (id) init
24{
25 self = [super init];
26 member = 42;
27 return self;
28}
29@end
30
Dmitri Gribenkodfe49e82013-02-17 14:59:41 +000031// CHECK: define internal i8* @"\01-[Derived init]"
John McCall7f416cc2015-09-08 08:05:57 +000032// CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_Derived.member", align 8, !invariant.load
Saleem Abdulrasool5f25bc32013-02-17 04:03:34 +000033
34void * variant_load_1(int i) {
35 void *ptr;
36 while (i--) {
37 Derived *d = [Derived new];
38 ptr = &d->member;
39 }
40 return ptr;
41}
42
Stephen Lin43622612013-08-15 06:47:53 +000043// CHECK-LABEL: define i8* @variant_load_1(i32 %i)
John McCall7f416cc2015-09-08 08:05:57 +000044// CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_Derived.member", align 8{{$}}
Saleem Abdulrasool5f25bc32013-02-17 04:03:34 +000045
46@interface Container : Derived @end
47@implementation Container
48- (void *) invariant_load_1
49{
50 return &self->member;
51}
52@end
53
John McCall7f416cc2015-09-08 08:05:57 +000054// CHECK-LABEL: define internal i8* @"\01-[Container invariant_load_1]"
55// CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_Derived.member", align 8, !invariant.load
Saleem Abdulrasool5f25bc32013-02-17 04:03:34 +000056
Douglas Gregor1c15cd62013-02-18 15:59:24 +000057@interface ForBlock
58{
59@public
60 id foo;
61}
62@end
63
Stephen Lin43622612013-08-15 06:47:53 +000064// CHECK-LABEL: define internal i8* @block_block_invoke
David Blaikiea953f282015-02-27 21:19:58 +000065// CHECK: load i64, i64* @"OBJC_IVAR_$_ForBlock.foo"
Douglas Gregor1c15cd62013-02-18 15:59:24 +000066id (^block)(ForBlock*) = ^(ForBlock* a) {
67 return a->foo;
68};