1// RUN: %clang_cc1 -triple x86_64-apple-darwin10  -O0 -emit-llvm %s -o -  | FileCheck %s
2// rdar://16095748
3
4@interface MyNSObject
5@end
6
7@interface SampleClass : MyNSObject {
8    @public
9    int _value;
10}
11+ (SampleClass*) new;
12@end
13
14@interface AppDelegate  : MyNSObject
15@end
16
17extern void foo(int);
18
19@implementation AppDelegate
20- (void)application
21{
22    // Create set of objects in loop
23    for(int i = 0; i < 2; i++) {
24        SampleClass *sample = [SampleClass new];
25        foo (sample->_value);
26    }
27}
28@end
29// CHECK: [[IVAR:%.*]]  = load i64, i64* @"OBJC_IVAR_$_SampleClass._value", align 8
30// CHECK: [[THREE:%.*]] = bitcast [[ONE:%.*]]* [[CALL:%.*]] to i8*
31// CHECK: [[ADDPTR:%.*]] = getelementptr inbounds i8, i8* [[THREE]], i64 [[IVAR]]
32// CHECK: [[FOUR:%.*]] = bitcast i8* [[ADDPTR]] to i32*
33// CHECK: [[FIVE:%.*]] = load i32, i32* [[FOUR]], align 4
34// CHECK:   call void @foo(i32 [[FIVE]])
35
36@implementation SampleClass
37+ (SampleClass*) new { return 0; }
38- (void) SampleClassApplication
39{
40    // Create set of objects in loop
41    for(int i = 0; i < 2; i++) {
42        SampleClass *sample = [SampleClass new];
43        foo (sample->_value);
44    }
45}
46@end
47// CHECK: [[ZERO:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_, align 8, !invariant.load
48// CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_SampleClass._value", align 8, !invariant.load
49
50@interface Sample : SampleClass @end
51
52@implementation Sample
53- (void) SampleApplication
54{
55    // Create set of objects in loop
56    for(int i = 0; i < 2; i++) {
57        SampleClass *sample = [SampleClass new];
58        foo (sample->_value);
59    }
60}
61@end
62// CHECK: [[ZERO:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_, align 8, !invariant.load
63// CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_SampleClass._value", align 8, !invariant.load
64
65