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