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

Side by Side Diff: src/hydrogen.cc

Issue 16779004: Allow the deoptimizer translation to track de-materialized objects. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Improved comments slightly. Created 7 years, 6 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
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 3532 matching lines...) Expand 10 before | Expand all | Expand 10 after
3543 FunctionState::FunctionState(HOptimizedGraphBuilder* owner, 3543 FunctionState::FunctionState(HOptimizedGraphBuilder* owner,
3544 CompilationInfo* info, 3544 CompilationInfo* info,
3545 InliningKind inlining_kind) 3545 InliningKind inlining_kind)
3546 : owner_(owner), 3546 : owner_(owner),
3547 compilation_info_(info), 3547 compilation_info_(info),
3548 call_context_(NULL), 3548 call_context_(NULL),
3549 inlining_kind_(inlining_kind), 3549 inlining_kind_(inlining_kind),
3550 function_return_(NULL), 3550 function_return_(NULL),
3551 test_context_(NULL), 3551 test_context_(NULL),
3552 entry_(NULL), 3552 entry_(NULL),
3553 arguments_object_(NULL),
3553 arguments_elements_(NULL), 3554 arguments_elements_(NULL),
3554 outer_(owner->function_state()) { 3555 outer_(owner->function_state()) {
3555 if (outer_ != NULL) { 3556 if (outer_ != NULL) {
3556 // State for an inline function. 3557 // State for an inline function.
3557 if (owner->ast_context()->IsTest()) { 3558 if (owner->ast_context()->IsTest()) {
3558 HBasicBlock* if_true = owner->graph()->CreateBasicBlock(); 3559 HBasicBlock* if_true = owner->graph()->CreateBasicBlock();
3559 HBasicBlock* if_false = owner->graph()->CreateBasicBlock(); 3560 HBasicBlock* if_false = owner->graph()->CreateBasicBlock();
3560 if_true->MarkAsInlineReturnTarget(owner->current_block()); 3561 if_true->MarkAsInlineReturnTarget(owner->current_block());
3561 if_false->MarkAsInlineReturnTarget(owner->current_block()); 3562 if_false->MarkAsInlineReturnTarget(owner->current_block());
3562 TestContext* outer_test_context = TestContext::cast(owner->ast_context()); 3563 TestContext* outer_test_context = TestContext::cast(owner->ast_context());
(...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after
4694 return call; 4695 return call;
4695 } 4696 }
4696 4697
4697 4698
4698 void HOptimizedGraphBuilder::SetUpScope(Scope* scope) { 4699 void HOptimizedGraphBuilder::SetUpScope(Scope* scope) {
4699 HConstant* undefined_constant = new(zone()) HConstant( 4700 HConstant* undefined_constant = new(zone()) HConstant(
4700 isolate()->factory()->undefined_value(), Representation::Tagged()); 4701 isolate()->factory()->undefined_value(), Representation::Tagged());
4701 AddInstruction(undefined_constant); 4702 AddInstruction(undefined_constant);
4702 graph()->set_undefined_constant(undefined_constant); 4703 graph()->set_undefined_constant(undefined_constant);
4703 4704
4704 HArgumentsObject* object = new(zone()) HArgumentsObject; 4705 // Create an arguments object containing the initial parameters. Set the
4705 AddInstruction(object); 4706 // initial values of parameters including "this" having parameter index 0.
4706 graph()->SetArgumentsObject(object);
4707
4708 // Set the initial values of parameters including "this". "This" has
4709 // parameter index 0.
4710 ASSERT_EQ(scope->num_parameters() + 1, environment()->parameter_count()); 4707 ASSERT_EQ(scope->num_parameters() + 1, environment()->parameter_count());
4711 4708 HArgumentsObject* arguments_object =
4709 new(zone()) HArgumentsObject(environment()->parameter_count(), zone());
4712 for (int i = 0; i < environment()->parameter_count(); ++i) { 4710 for (int i = 0; i < environment()->parameter_count(); ++i) {
4713 HInstruction* parameter = AddInstruction(new(zone()) HParameter(i)); 4711 HInstruction* parameter = AddInstruction(new(zone()) HParameter(i));
4712 arguments_object->AddArgument(parameter, zone());
4714 environment()->Bind(i, parameter); 4713 environment()->Bind(i, parameter);
4715 } 4714 }
4715 AddInstruction(arguments_object);
4716 graph()->SetArgumentsObject(arguments_object);
4716 4717
4717 // First special is HContext. 4718 // First special is HContext.
4718 HInstruction* context = AddInstruction(new(zone()) HContext); 4719 HInstruction* context = AddInstruction(new(zone()) HContext);
4719 environment()->BindContext(context); 4720 environment()->BindContext(context);
4720 4721
4721 // Initialize specials and locals to undefined. 4722 // Initialize specials and locals to undefined.
4722 for (int i = environment()->parameter_count() + 1; 4723 for (int i = environment()->parameter_count() + 1;
4723 i < environment()->length(); 4724 i < environment()->length();
4724 ++i) { 4725 ++i) {
4725 environment()->Bind(i, undefined_constant); 4726 environment()->Bind(i, undefined_constant);
(...skipping 2697 matching lines...) Expand 10 before | Expand all | Expand 10 after
7423 void HOptimizedGraphBuilder::EnsureArgumentsArePushedForAccess() { 7424 void HOptimizedGraphBuilder::EnsureArgumentsArePushedForAccess() {
7424 // Outermost function already has arguments on the stack. 7425 // Outermost function already has arguments on the stack.
7425 if (function_state()->outer() == NULL) return; 7426 if (function_state()->outer() == NULL) return;
7426 7427
7427 if (function_state()->arguments_pushed()) return; 7428 if (function_state()->arguments_pushed()) return;
7428 7429
7429 // Push arguments when entering inlined function. 7430 // Push arguments when entering inlined function.
7430 HEnterInlined* entry = function_state()->entry(); 7431 HEnterInlined* entry = function_state()->entry();
7431 entry->set_arguments_pushed(); 7432 entry->set_arguments_pushed();
7432 7433
7433 ZoneList<HValue*>* arguments_values = entry->arguments_values(); 7434 HArgumentsObject* arguments = entry->arguments_object();
7435 const ZoneList<HValue*>* arguments_values = arguments->arguments_values();
7434 7436
7435 HInstruction* insert_after = entry; 7437 HInstruction* insert_after = entry;
7436 for (int i = 0; i < arguments_values->length(); i++) { 7438 for (int i = 0; i < arguments_values->length(); i++) {
7437 HValue* argument = arguments_values->at(i); 7439 HValue* argument = arguments_values->at(i);
7438 HInstruction* push_argument = new(zone()) HPushArgument(argument); 7440 HInstruction* push_argument = new(zone()) HPushArgument(argument);
7439 push_argument->InsertAfter(insert_after); 7441 push_argument->InsertAfter(insert_after);
7440 insert_after = push_argument; 7442 insert_after = push_argument;
7441 } 7443 }
7442 7444
7443 HArgumentsElements* arguments_elements = 7445 HArgumentsElements* arguments_elements =
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after
8024 // can remove the unsightly ifdefs in this function. 8026 // can remove the unsightly ifdefs in this function.
8025 HConstant* context = 8027 HConstant* context =
8026 new(zone()) HConstant(Handle<Context>(target->context()), 8028 new(zone()) HConstant(Handle<Context>(target->context()),
8027 Representation::Tagged()); 8029 Representation::Tagged());
8028 AddInstruction(context); 8030 AddInstruction(context);
8029 inner_env->BindContext(context); 8031 inner_env->BindContext(context);
8030 #endif 8032 #endif
8031 8033
8032 AddSimulate(return_id); 8034 AddSimulate(return_id);
8033 current_block()->UpdateEnvironment(inner_env); 8035 current_block()->UpdateEnvironment(inner_env);
8034 ZoneList<HValue*>* arguments_values = NULL; 8036 HArgumentsObject* arguments_object = NULL;
8035 8037
8036 // If the function uses arguments copy current arguments values 8038 // If the function uses arguments object create and bind one, also copy
8037 // to use them for materialization. 8039 // current arguments values to use them for materialization.
8038 if (function->scope()->arguments() != NULL) { 8040 if (function->scope()->arguments() != NULL) {
8041 ASSERT(function->scope()->arguments()->IsStackAllocated());
8039 HEnvironment* arguments_env = inner_env->arguments_environment(); 8042 HEnvironment* arguments_env = inner_env->arguments_environment();
8040 int arguments_count = arguments_env->parameter_count(); 8043 int arguments_count = arguments_env->parameter_count();
8041 arguments_values = new(zone()) ZoneList<HValue*>(arguments_count, zone()); 8044 arguments_object = new(zone()) HArgumentsObject(arguments_count, zone());
8045 inner_env->Bind(function->scope()->arguments(), arguments_object);
8042 for (int i = 0; i < arguments_count; i++) { 8046 for (int i = 0; i < arguments_count; i++) {
8043 arguments_values->Add(arguments_env->Lookup(i), zone()); 8047 arguments_object->AddArgument(arguments_env->Lookup(i), zone());
8044 } 8048 }
8049 AddInstruction(arguments_object);
8045 } 8050 }
8046 8051
8047 HEnterInlined* enter_inlined = 8052 HEnterInlined* enter_inlined =
8048 new(zone()) HEnterInlined(target, 8053 new(zone()) HEnterInlined(target,
8049 arguments_count, 8054 arguments_count,
8050 function, 8055 function,
8051 function_state()->inlining_kind(), 8056 function_state()->inlining_kind(),
8052 function->scope()->arguments(), 8057 function->scope()->arguments(),
8053 arguments_values, 8058 arguments_object,
8054 undefined_receiver, 8059 undefined_receiver,
8055 zone()); 8060 zone());
8056 function_state()->set_entry(enter_inlined); 8061 function_state()->set_entry(enter_inlined);
8057 AddInstruction(enter_inlined); 8062 AddInstruction(enter_inlined);
8058 8063
8059 // If the function uses arguments object create and bind one.
8060 if (function->scope()->arguments() != NULL) {
8061 ASSERT(function->scope()->arguments()->IsStackAllocated());
8062 inner_env->Bind(function->scope()->arguments(),
8063 graph()->GetArgumentsObject());
8064 }
8065
8066
8067 VisitDeclarations(target_info.scope()->declarations()); 8064 VisitDeclarations(target_info.scope()->declarations());
8068 VisitStatements(function->body()); 8065 VisitStatements(function->body());
8069 if (HasStackOverflow()) { 8066 if (HasStackOverflow()) {
8070 // Bail out if the inline function did, as we cannot residualize a call 8067 // Bail out if the inline function did, as we cannot residualize a call
8071 // instead. 8068 // instead.
8072 TraceInline(target, caller, "inline graph construction failed"); 8069 TraceInline(target, caller, "inline graph construction failed");
8073 target_shared->DisableOptimization("inlining bailed out"); 8070 target_shared->DisableOptimization("inlining bailed out");
8074 inline_bailout_ = true; 8071 inline_bailout_ = true;
8075 delete target_state; 8072 delete target_state;
8076 return true; 8073 return true;
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
8487 new(zone()) HApplyArguments(function, 8484 new(zone()) HApplyArguments(function,
8488 wrapped_receiver, 8485 wrapped_receiver,
8489 length, 8486 length,
8490 elements); 8487 elements);
8491 result->set_position(expr->position()); 8488 result->set_position(expr->position());
8492 ast_context()->ReturnInstruction(result, expr->id()); 8489 ast_context()->ReturnInstruction(result, expr->id());
8493 return true; 8490 return true;
8494 } else { 8491 } else {
8495 // We are inside inlined function and we know exactly what is inside 8492 // We are inside inlined function and we know exactly what is inside
8496 // arguments object. But we need to be able to materialize at deopt. 8493 // arguments object. But we need to be able to materialize at deopt.
8497 // TODO(mstarzinger): For now we just ensure arguments are pushed
8498 // right after HEnterInlined, but we could be smarter about this.
8499 EnsureArgumentsArePushedForAccess();
8500 ASSERT_EQ(environment()->arguments_environment()->parameter_count(), 8494 ASSERT_EQ(environment()->arguments_environment()->parameter_count(),
8501 function_state()->entry()->arguments_values()->length()); 8495 function_state()->entry()->arguments_object()->arguments_count());
8502 HEnterInlined* entry = function_state()->entry(); 8496 HArgumentsObject* args = function_state()->entry()->arguments_object();
8503 ZoneList<HValue*>* arguments_values = entry->arguments_values(); 8497 const ZoneList<HValue*>* arguments_values = args->arguments_values();
8504 int arguments_count = arguments_values->length(); 8498 int arguments_count = arguments_values->length();
8505 PushAndAdd(new(zone()) HWrapReceiver(receiver, function)); 8499 PushAndAdd(new(zone()) HWrapReceiver(receiver, function));
8506 for (int i = 1; i < arguments_count; i++) { 8500 for (int i = 1; i < arguments_count; i++) {
8507 Push(arguments_values->at(i)); 8501 Push(arguments_values->at(i));
8508 } 8502 }
8509 8503
8510 Handle<JSFunction> known_function; 8504 Handle<JSFunction> known_function;
8511 if (function->IsConstant()) { 8505 if (function->IsConstant()) {
8512 HConstant* constant_function = HConstant::cast(function); 8506 HConstant* constant_function = HConstant::cast(function);
8513 known_function = Handle<JSFunction>::cast(constant_function->handle()); 8507 known_function = Handle<JSFunction>::cast(constant_function->handle());
(...skipping 2484 matching lines...) Expand 10 before | Expand all | Expand 10 after
10998 10992
10999 HEnvironment::HEnvironment(HEnvironment* outer, 10993 HEnvironment::HEnvironment(HEnvironment* outer,
11000 Handle<JSFunction> closure, 10994 Handle<JSFunction> closure,
11001 FrameType frame_type, 10995 FrameType frame_type,
11002 int arguments, 10996 int arguments,
11003 Zone* zone) 10997 Zone* zone)
11004 : closure_(closure), 10998 : closure_(closure),
11005 values_(arguments, zone), 10999 values_(arguments, zone),
11006 frame_type_(frame_type), 11000 frame_type_(frame_type),
11007 parameter_count_(arguments), 11001 parameter_count_(arguments),
11002 specials_count_(0),
11008 local_count_(0), 11003 local_count_(0),
11009 outer_(outer), 11004 outer_(outer),
11010 entry_(NULL), 11005 entry_(NULL),
11011 pop_count_(0), 11006 pop_count_(0),
11012 push_count_(0), 11007 push_count_(0),
11013 ast_id_(BailoutId::None()), 11008 ast_id_(BailoutId::None()),
11014 zone_(zone) { 11009 zone_(zone) {
11015 } 11010 }
11016 11011
11017 11012
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after
11613 } 11608 }
11614 } 11609 }
11615 11610
11616 #ifdef DEBUG 11611 #ifdef DEBUG
11617 if (graph_ != NULL) graph_->Verify(false); // No full verify. 11612 if (graph_ != NULL) graph_->Verify(false); // No full verify.
11618 if (allocator_ != NULL) allocator_->Verify(); 11613 if (allocator_ != NULL) allocator_->Verify();
11619 #endif 11614 #endif
11620 } 11615 }
11621 11616
11622 } } // namespace v8::internal 11617 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698