xref: /aosp_15_r20/external/clang/test/CodeGenObjC/optimize-ivar-offset-load.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
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