aboutsummaryrefslogtreecommitdiff
path: root/test/CodeGenObjC/optimize-ivar-offset-load.m
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGenObjC/optimize-ivar-offset-load.m')
-rw-r--r--test/CodeGenObjC/optimize-ivar-offset-load.m64
1 files changed, 64 insertions, 0 deletions
diff --git a/test/CodeGenObjC/optimize-ivar-offset-load.m b/test/CodeGenObjC/optimize-ivar-offset-load.m
new file mode 100644
index 000000000000..d34ac137587f
--- /dev/null
+++ b/test/CodeGenObjC/optimize-ivar-offset-load.m
@@ -0,0 +1,64 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -Os -emit-llvm %s -o - | FileCheck %s
+// rdar://16095748
+
+@interface NSObject
+@end
+
+@interface SampleClass : NSObject {
+ @public
+ int _value;
+}
++ (SampleClass*) new;
+@end
+
+@interface AppDelegate : NSObject
+@end
+
+extern void foo(int);
+
+@implementation AppDelegate
+- (void)application
+{
+ // Create set of objects in loop
+ for(int i = 0; i < 2; i++) {
+ SampleClass *sample = [SampleClass new];
+ foo (sample->_value);
+ }
+}
+@end
+// CHECK: [[IVAR:%.*]] = load i64* @"OBJC_IVAR_$_SampleClass._value", align 8
+// CHECK: [[THREE:%.*]] = bitcast [[ONE:%.*]]* [[CALL:%.*]] to i8*
+// CHECK: [[ADDPTR:%.*]] = getelementptr inbounds i8* [[THREE]], i64 [[IVAR]]
+// CHECK: [[FOUR:%.*]] = bitcast i8* [[ADDPTR]] to i32*
+// CHECK: [[FIVE:%.*]] = load i32* [[FOUR]], align 4
+// CHECK: tail call void @foo(i32 [[FIVE]])
+
+@implementation SampleClass
++ (SampleClass*) new { return 0; }
+- (void) SampleClassApplication
+{
+ // Create set of objects in loop
+ for(int i = 0; i < 2; i++) {
+ SampleClass *sample = [SampleClass new];
+ foo (sample->_value);
+ }
+}
+@end
+// CHECK: [[ZERO:%.*]] = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8, !invariant.load
+// CHECK: [[IVAR:%.*]] = load i64* @"OBJC_IVAR_$_SampleClass._value", align 8, !invariant.load
+
+@interface Sample : SampleClass @end
+
+@implementation Sample
+- (void) SampleApplication
+{
+ // Create set of objects in loop
+ for(int i = 0; i < 2; i++) {
+ SampleClass *sample = [SampleClass new];
+ foo (sample->_value);
+ }
+}
+@end
+// CHECK: [[ZERO:%.*]] = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_", align 8, !invariant.load
+// CHECK: [[IVAR:%.*]] = load i64* @"OBJC_IVAR_$_SampleClass._value", align 8, !invariant.load
+