forked from OSchip/llvm-project
Objective-C [IRGen]. Generator a tail call to objc_getProperty() in
synthesized getters for performance improvement. // rdar://15884113 llvm-svn: 200430
This commit is contained in:
parent
1ba7305974
commit
13b4304937
|
@ -892,10 +892,14 @@ CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
|
|||
|
||||
// FIXME: We shouldn't need to get the function info here, the
|
||||
// runtime already should have computed it to build the function.
|
||||
llvm::Instruction *CallInstruction;
|
||||
RValue RV = EmitCall(getTypes().arrangeFreeFunctionCall(propType, args,
|
||||
FunctionType::ExtInfo(),
|
||||
RequiredArgs::All),
|
||||
getPropertyFn, ReturnValueSlot(), args);
|
||||
getPropertyFn, ReturnValueSlot(), args, 0,
|
||||
&CallInstruction);
|
||||
if (llvm::CallInst *call = dyn_cast<llvm::CallInst>(CallInstruction))
|
||||
call->setTailCall();
|
||||
|
||||
// We need to fix the type here. Ivars with copy & retain are
|
||||
// always objects so we don't need to worry about complex or
|
||||
|
|
|
@ -67,7 +67,7 @@ static Class theGlobalClass;
|
|||
|
||||
// CHECK: define internal i8* @"\01-[Test2 theClass]"(
|
||||
// CHECK: [[OFFSET:%.*]] = load i64* @"OBJC_IVAR_$_Test2._theClass"
|
||||
// CHECK-NEXT: [[T0:%.*]] = call i8* @objc_getProperty(i8* {{.*}}, i8* {{.*}}, i64 [[OFFSET]], i1 zeroext true)
|
||||
// CHECK-NEXT: [[T0:%.*]] = tail call i8* @objc_getProperty(i8* {{.*}}, i8* {{.*}}, i64 [[OFFSET]], i1 zeroext true)
|
||||
// CHECK-NEXT: ret i8* [[T0]]
|
||||
|
||||
// CHECK: define internal void @"\01-[Test2 setTheClass:]"(
|
||||
|
|
|
@ -1004,7 +1004,7 @@ void test37(void) {
|
|||
@synthesize x;
|
||||
@end
|
||||
// CHECK: define internal i8* @"\01-[Test45 x]"(
|
||||
// CHECK: [[CALL:%.*]] = call i8* @objc_getProperty(
|
||||
// CHECK: [[CALL:%.*]] = tail call i8* @objc_getProperty(
|
||||
// CHECK-NEXT: ret i8* [[CALL]]
|
||||
|
||||
// rdar://problem/9315552
|
||||
|
@ -1352,7 +1352,7 @@ void test62(void) {
|
|||
@implementation Person
|
||||
@synthesize address;
|
||||
@end
|
||||
// CHECK: call i8* @objc_getProperty
|
||||
// CHECK: tail call i8* @objc_getProperty
|
||||
// CHECK: call void @objc_setProperty
|
||||
|
||||
// Verify that we successfully parse and preserve this attribute in
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
@synthesize filenamesToServerLocation=_filenamesToServerLocation;
|
||||
@end
|
||||
|
||||
// CHECK: [[CALL:%.*]] = call i8* @objc_getProperty
|
||||
// CHECK: [[CALL:%.*]] = tail call i8* @objc_getProperty
|
||||
// CHECK: [[ONE:%.*]] = bitcast i8* [[CALL:%.*]] to [[T1:%.*]]*
|
||||
// CHECK: [[TWO:%.*]] = bitcast [[T1]]* [[ONE]] to [[T2:%.*]]*
|
||||
// CHECK: ret [[T2]]* [[TWO]]
|
||||
|
|
Loading…
Reference in New Issue