xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGenObjC/optimize-ivar-offset-load.m (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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