|  | // RUN: %clang_cc1 -triple x86_64-apple-darwin -fblocks -emit-llvm -o - %s | FileCheck %s | 
|  |  | 
|  | @interface NSObject | 
|  | + (id) new; | 
|  | - (id) init; | 
|  | @end | 
|  |  | 
|  | @interface Base : NSObject @end | 
|  |  | 
|  | // @implementation Base | 
|  | // { | 
|  | //     int dummy; | 
|  | // } | 
|  | // @end | 
|  |  | 
|  | @interface Derived : Base | 
|  | { | 
|  | @public int member; | 
|  | } | 
|  | @end | 
|  |  | 
|  | @implementation Derived | 
|  | - (id) init | 
|  | { | 
|  | self = [super init]; | 
|  | member = 42; | 
|  | return self; | 
|  | } | 
|  | @end | 
|  |  | 
|  | // CHECK: define internal i8* @"\01-[Derived init]" | 
|  | // CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_Derived.member", align 8, !invariant.load | 
|  |  | 
|  | void * variant_load_1(int i) { | 
|  | void *ptr; | 
|  | while (i--) { | 
|  | Derived *d = [Derived new]; | 
|  | ptr = &d->member; | 
|  | } | 
|  | return ptr; | 
|  | } | 
|  |  | 
|  | // CHECK-LABEL: define i8* @variant_load_1(i32 %i) | 
|  | // CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_Derived.member", align 8{{$}} | 
|  |  | 
|  | @interface Container : Derived @end | 
|  | @implementation Container | 
|  | - (void *) invariant_load_1 | 
|  | { | 
|  | return &self->member; | 
|  | } | 
|  | @end | 
|  |  | 
|  | // CHECK-LABEL: define internal i8* @"\01-[Container invariant_load_1]" | 
|  | // CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_Derived.member", align 8, !invariant.load | 
|  |  | 
|  | @interface ForBlock | 
|  | { | 
|  | @public | 
|  | id foo; | 
|  | } | 
|  | @end | 
|  |  | 
|  | // CHECK-LABEL: define internal i8* @block_block_invoke | 
|  | // CHECK: load i64, i64* @"OBJC_IVAR_$_ForBlock.foo" | 
|  | id (^block)(ForBlock*) = ^(ForBlock* a) { | 
|  | return a->foo; | 
|  | }; |