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