Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/hydrogen.cc

Issue 12263004: Allow full inlining of f.apply(this, arguments) calls. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 7736 matching lines...) Expand 10 before | Expand all | Expand 10 after
7747 return TryInline(CALL_AS_METHOD, 7747 return TryInline(CALL_AS_METHOD,
7748 setter, 7748 setter,
7749 1, 7749 1,
7750 implicit_return_value, 7750 implicit_return_value,
7751 assignment->id(), 7751 assignment->id(),
7752 assignment->AssignmentId(), 7752 assignment->AssignmentId(),
7753 SETTER_CALL_RETURN); 7753 SETTER_CALL_RETURN);
7754 } 7754 }
7755 7755
7756 7756
7757 bool HOptimizedGraphBuilder::TryInlineApply(Handle<JSFunction> function,
7758 Call* expr,
7759 int arguments_count) {
7760 return TryInline(CALL_AS_METHOD,
7761 function,
7762 arguments_count,
7763 NULL,
7764 expr->id(),
7765 expr->ReturnId(),
7766 NORMAL_RETURN);
7767 }
7768
7769
7757 bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr, 7770 bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr,
7758 bool drop_extra) { 7771 bool drop_extra) {
7759 if (!expr->target()->shared()->HasBuiltinFunctionId()) return false; 7772 if (!expr->target()->shared()->HasBuiltinFunctionId()) return false;
7760 BuiltinFunctionId id = expr->target()->shared()->builtin_function_id(); 7773 BuiltinFunctionId id = expr->target()->shared()->builtin_function_id();
7761 switch (id) { 7774 switch (id) {
7762 case kMathExp: 7775 case kMathExp:
7763 if (!FLAG_fast_math) break; 7776 if (!FLAG_fast_math) break;
7764 // Fall through if FLAG_fast_math. 7777 // Fall through if FLAG_fast_math.
7765 case kMathRound: 7778 case kMathRound:
7766 case kMathAbs: 7779 case kMathAbs:
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
7974 elements); 7987 elements);
7975 result->set_position(expr->position()); 7988 result->set_position(expr->position());
7976 ast_context()->ReturnInstruction(result, expr->id()); 7989 ast_context()->ReturnInstruction(result, expr->id());
7977 return true; 7990 return true;
7978 } else { 7991 } else {
7979 // We are inside inlined function and we know exactly what is inside 7992 // We are inside inlined function and we know exactly what is inside
7980 // arguments object. But we need to be able to materialize at deopt. 7993 // arguments object. But we need to be able to materialize at deopt.
7981 // TODO(mstarzinger): For now we just ensure arguments are pushed 7994 // TODO(mstarzinger): For now we just ensure arguments are pushed
7982 // right after HEnterInlined, but we could be smarter about this. 7995 // right after HEnterInlined, but we could be smarter about this.
7983 EnsureArgumentsArePushedForAccess(); 7996 EnsureArgumentsArePushedForAccess();
7984 HValue* context = environment()->LookupContext(); 7997 HEnvironment* arguments_env = environment()->arguments_environment();
7998 int parameter_count = arguments_env->parameter_count();
7999 PushAndAdd(new(zone()) HWrapReceiver(receiver, function));
8000 for (int i = 1; i < arguments_env->parameter_count(); i++) {
8001 Push(arguments_env->Lookup(i));
8002 }
7985 8003
7986 HValue* wrapped_receiver = 8004 Handle<JSFunction> known_function;
7987 AddInstruction(new(zone()) HWrapReceiver(receiver, function)); 8005 if (function->IsConstant()) {
7988 PushAndAdd(new(zone()) HPushArgument(wrapped_receiver)); 8006 HConstant* constant_function = HConstant::cast(function);
8007 known_function = Handle<JSFunction>::cast(constant_function->handle());
8008 int arguments_count = parameter_count - 1; // Excluding receiver.
8009 if (TryInlineApply(known_function, expr, arguments_count)) return true;
8010 }
7989 8011
7990 HEnvironment* arguments_env = environment()->arguments_environment(); 8012 Drop(parameter_count - 1);
7991 8013 PushAndAdd(new(zone()) HPushArgument(Pop()));
7992 int parameter_count = arguments_env->parameter_count();
7993 for (int i = 1; i < arguments_env->parameter_count(); i++) { 8014 for (int i = 1; i < arguments_env->parameter_count(); i++) {
7994 PushAndAdd(new(zone()) HPushArgument(arguments_env->Lookup(i))); 8015 PushAndAdd(new(zone()) HPushArgument(arguments_env->Lookup(i)));
7995 } 8016 }
7996 8017
8018 HValue* context = environment()->LookupContext();
7997 HInvokeFunction* call = new(zone()) HInvokeFunction( 8019 HInvokeFunction* call = new(zone()) HInvokeFunction(
7998 context, 8020 context,
7999 function, 8021 function,
8022 known_function,
8000 parameter_count); 8023 parameter_count);
8001 Drop(parameter_count); 8024 Drop(parameter_count);
8002 call->set_position(expr->position()); 8025 call->set_position(expr->position());
8003 ast_context()->ReturnInstruction(call, expr->id()); 8026 ast_context()->ReturnInstruction(call, expr->id());
8004 return true; 8027 return true;
8005 } 8028 }
8006 } 8029 }
8007 8030
8008 8031
8009 // Checks if all maps in |types| are from the same family, i.e., are elements 8032 // Checks if all maps in |types| are from the same family, i.e., are elements
(...skipping 2621 matching lines...) Expand 10 before | Expand all | Expand 10 after
10631 } 10654 }
10632 } 10655 }
10633 10656
10634 #ifdef DEBUG 10657 #ifdef DEBUG
10635 if (graph_ != NULL) graph_->Verify(false); // No full verify. 10658 if (graph_ != NULL) graph_->Verify(false); // No full verify.
10636 if (allocator_ != NULL) allocator_->Verify(); 10659 if (allocator_ != NULL) allocator_->Verify();
10637 #endif 10660 #endif
10638 } 10661 }
10639 10662
10640 } } // namespace v8::internal 10663 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698