Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index 1590ab36698d9d5b98605111966ed17b8c7bc2a8..3e4cefe1562bdd633ce8ec1f3a0b91df1fff9750 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -138,6 +138,7 @@ HSimulate* HBasicBlock::CreateSimulate(BailoutId ast_id, |
| ASSERT(HasEnvironment()); |
| HEnvironment* environment = last_environment(); |
| ASSERT(ast_id.IsNone() || |
| + ast_id == BailoutId::StubEntry() || |
| environment->closure()->shared()->VerifyBailoutId(ast_id)); |
| int push_count = environment->push_count(); |
| @@ -621,33 +622,206 @@ HConstant* HGraph::GetConstantHole() { |
| } |
| -HGraphBuilder::HGraphBuilder(CompilationInfo* info, |
| - TypeFeedbackOracle* oracle) |
| - : function_state_(NULL), |
| +HGraph* HGraphBuilder::CreateGraph() { |
| + graph_ = new(zone()) HGraph(info_); |
| + if (FLAG_hydrogen_stats) HStatistics::Instance()->Initialize(info_); |
| + { |
|
Jakob Kummerow
2012/11/28 16:28:22
why this block? Shouldn't make a difference if you
danno
2012/11/30 16:23:24
Done.
|
| + HPhase phase("H_Block building"); |
| + set_current_block(graph()->entry_block()); |
| + if (!BuildGraph()) return NULL; |
| + } |
| + return graph_; |
| +} |
| + |
| + |
| +HInstruction* HGraphBuilder::AddInstruction(HInstruction* instr) { |
| + ASSERT(current_block() != NULL); |
| + current_block()->AddInstruction(instr); |
| + return instr; |
| +} |
| + |
| + |
| +void HGraphBuilder::AddSimulate(BailoutId id, |
| + RemovableSimulate removable) { |
| + ASSERT(current_block() != NULL); |
| + current_block()->AddSimulate(id, removable); |
| +} |
| + |
| + |
| +HInstruction* HGraphBuilder::BuildExternalArrayElementAccess( |
| + HValue* external_elements, |
| + HValue* checked_key, |
| + HValue* val, |
| + HValue* dependency, |
| + ElementsKind elements_kind, |
| + bool is_store) { |
| + Zone* zone = this->zone(); |
| + if (is_store) { |
| + ASSERT(val != NULL); |
| + switch (elements_kind) { |
| + case EXTERNAL_PIXEL_ELEMENTS: { |
| + val = AddInstruction(new(zone) HClampToUint8(val)); |
| + break; |
| + } |
| + case EXTERNAL_BYTE_ELEMENTS: |
| + case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| + case EXTERNAL_SHORT_ELEMENTS: |
| + case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| + case EXTERNAL_INT_ELEMENTS: |
| + case EXTERNAL_UNSIGNED_INT_ELEMENTS: { |
| + break; |
| + } |
| + case EXTERNAL_FLOAT_ELEMENTS: |
| + case EXTERNAL_DOUBLE_ELEMENTS: |
| + break; |
| + case FAST_SMI_ELEMENTS: |
| + case FAST_ELEMENTS: |
| + case FAST_DOUBLE_ELEMENTS: |
| + case FAST_HOLEY_SMI_ELEMENTS: |
| + case FAST_HOLEY_ELEMENTS: |
| + case FAST_HOLEY_DOUBLE_ELEMENTS: |
| + case DICTIONARY_ELEMENTS: |
| + case NON_STRICT_ARGUMENTS_ELEMENTS: |
| + UNREACHABLE(); |
| + break; |
| + } |
| + return new(zone) HStoreKeyed(external_elements, checked_key, |
| + val, elements_kind); |
| + } else { |
| + ASSERT(val == NULL); |
| + HLoadKeyed* load = |
| + new(zone) HLoadKeyed( |
| + external_elements, checked_key, dependency, elements_kind); |
| + if (FLAG_opt_safe_uint32_operations && |
| + elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) { |
| + graph()->RecordUint32Instruction(load); |
| + } |
| + return load; |
| + } |
| +} |
| + |
| + |
| +HInstruction* HGraphBuilder::BuildFastElementAccess( |
| + HValue* elements, |
| + HValue* checked_key, |
| + HValue* val, |
| + HValue* load_dependency, |
| + ElementsKind elements_kind, |
| + bool is_store) { |
| + Zone* zone = this->zone(); |
| + if (is_store) { |
| + ASSERT(val != NULL); |
| + switch (elements_kind) { |
| + case FAST_SMI_ELEMENTS: |
| + case FAST_HOLEY_SMI_ELEMENTS: |
| + // Smi-only arrays need a smi check. |
| + AddInstruction(new(zone) HCheckSmi(val)); |
| + // Fall through. |
| + case FAST_ELEMENTS: |
| + case FAST_HOLEY_ELEMENTS: |
| + case FAST_DOUBLE_ELEMENTS: |
| + case FAST_HOLEY_DOUBLE_ELEMENTS: |
| + return new(zone) HStoreKeyed(elements, checked_key, val, elements_kind); |
| + default: |
| + UNREACHABLE(); |
| + return NULL; |
| + } |
| + } |
| + // It's an element load (!is_store). |
| + return new(zone) HLoadKeyed(elements, |
| + checked_key, |
| + load_dependency, |
| + elements_kind); |
| +} |
| + |
| + |
| +HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
| + HValue* object, |
| + HValue* key, |
| + HValue* val, |
| + HCheckMaps* mapcheck, |
| + bool is_js_array, |
| + ElementsKind elements_kind, |
| + bool is_store) { |
| + Zone* zone = this->zone(); |
| + // No GVNFlag is necessary for ElementsKind if there is an explicit dependency |
| + // on a HElementsTransition instruction. The flag can also be removed if the |
| + // map to check has FAST_HOLEY_ELEMENTS, since there can be no further |
| + // ElementsKind transitions. Finally, the dependency can be removed for stores |
| + // for FAST_ELEMENTS, since a transition to HOLEY elements won't change the |
| + // generated store code. |
| + if ((elements_kind == FAST_HOLEY_ELEMENTS) || |
| + (elements_kind == FAST_ELEMENTS && is_store)) { |
| + if (mapcheck != NULL) { |
| + mapcheck->ClearGVNFlag(kDependsOnElementsKind); |
| + } |
| + } |
| + bool fast_smi_only_elements = IsFastSmiElementsKind(elements_kind); |
| + bool fast_elements = IsFastObjectElementsKind(elements_kind); |
| + HInstruction* elements = |
| + AddInstruction(new(zone) HLoadElements(object, mapcheck)); |
| + if (is_store && (fast_elements || fast_smi_only_elements)) { |
| + HCheckMaps* check_cow_map = new(zone) HCheckMaps( |
| + elements, Isolate::Current()->factory()->fixed_array_map(), zone); |
| + check_cow_map->ClearGVNFlag(kDependsOnElementsKind); |
| + AddInstruction(check_cow_map); |
| + } |
| + HInstruction* length = NULL; |
| + HInstruction* checked_key = NULL; |
| + if (IsExternalArrayElementsKind(elements_kind)) { |
| + length = AddInstruction(new(zone) HFixedArrayBaseLength(elements)); |
| + checked_key = AddInstruction(new(zone) HBoundsCheck(key, length, |
| + ALLOW_SMI_KEY)); |
| + HLoadExternalArrayPointer* external_elements = |
| + new(zone) HLoadExternalArrayPointer(elements); |
| + AddInstruction(external_elements); |
| + return BuildExternalArrayElementAccess( |
| + external_elements, checked_key, val, mapcheck, |
| + elements_kind, is_store); |
| + } |
| + ASSERT(fast_smi_only_elements || |
| + fast_elements || |
| + IsFastDoubleElementsKind(elements_kind)); |
| + if (is_js_array) { |
| + length = AddInstruction(new(zone) HJSArrayLength(object, mapcheck, |
| + HType::Smi())); |
| + } else { |
| + length = AddInstruction(new(zone) HFixedArrayBaseLength(elements)); |
| + } |
| + checked_key = AddInstruction(new(zone) HBoundsCheck(key, length, |
| + ALLOW_SMI_KEY)); |
| + return BuildFastElementAccess(elements, checked_key, val, mapcheck, |
| + elements_kind, is_store); |
| +} |
| + |
| + |
| +HOptimizedGraphBuilder::HOptimizedGraphBuilder(CompilationInfo* info, |
| + TypeFeedbackOracle* oracle) |
| + : HGraphBuilder(info), |
| + function_state_(NULL), |
| initial_function_state_(this, info, oracle, NORMAL_RETURN), |
| ast_context_(NULL), |
| break_scope_(NULL), |
| - graph_(NULL), |
| - current_block_(NULL), |
| inlined_count_(0), |
| globals_(10, info->zone()), |
| - zone_(info->zone()), |
| inline_bailout_(false) { |
| // This is not initialized in the initializer list because the |
| // constructor for the initial state relies on function_state_ == NULL |
| // to know it's the initial state. |
| function_state_= &initial_function_state_; |
| + InitializeAstVisitor(); |
| } |
| -HBasicBlock* HGraphBuilder::CreateJoin(HBasicBlock* first, |
| - HBasicBlock* second, |
| - BailoutId join_id) { |
| + |
| +HBasicBlock* HOptimizedGraphBuilder::CreateJoin(HBasicBlock* first, |
| + HBasicBlock* second, |
| + BailoutId join_id) { |
| if (first == NULL) { |
| return second; |
| } else if (second == NULL) { |
| return first; |
| } else { |
| - HBasicBlock* join_block = graph_->CreateBasicBlock(); |
| + HBasicBlock* join_block = graph()->CreateBasicBlock(); |
| first->Goto(join_block); |
| second->Goto(join_block); |
| join_block->SetJoinId(join_id); |
| @@ -656,9 +830,9 @@ HBasicBlock* HGraphBuilder::CreateJoin(HBasicBlock* first, |
| } |
| -HBasicBlock* HGraphBuilder::JoinContinue(IterationStatement* statement, |
| - HBasicBlock* exit_block, |
| - HBasicBlock* continue_block) { |
| +HBasicBlock* HOptimizedGraphBuilder::JoinContinue(IterationStatement* statement, |
| + HBasicBlock* exit_block, |
| + HBasicBlock* continue_block) { |
| if (continue_block != NULL) { |
| if (exit_block != NULL) exit_block->Goto(continue_block); |
| continue_block->SetJoinId(statement->ContinueId()); |
| @@ -668,11 +842,11 @@ HBasicBlock* HGraphBuilder::JoinContinue(IterationStatement* statement, |
| } |
| -HBasicBlock* HGraphBuilder::CreateLoop(IterationStatement* statement, |
| - HBasicBlock* loop_entry, |
| - HBasicBlock* body_exit, |
| - HBasicBlock* loop_successor, |
| - HBasicBlock* break_block) { |
| +HBasicBlock* HOptimizedGraphBuilder::CreateLoop(IterationStatement* statement, |
| + HBasicBlock* loop_entry, |
| + HBasicBlock* body_exit, |
| + HBasicBlock* loop_successor, |
| + HBasicBlock* break_block) { |
| if (body_exit != NULL) body_exit->Goto(loop_entry); |
| loop_entry->PostProcessLoopHeader(statement); |
| if (break_block != NULL) { |
| @@ -703,8 +877,13 @@ HGraph::HGraph(CompilationInfo* info) |
| is_recursive_(false), |
| use_optimistic_licm_(false), |
| type_change_checksum_(0) { |
| - start_environment_ = |
| - new(zone_) HEnvironment(NULL, info->scope(), info->closure(), zone_); |
| + if (info->IsStub()) { |
| + start_environment_ = |
| + new(zone_) HEnvironment(zone_); |
| + } else { |
| + start_environment_ = |
| + new(zone_) HEnvironment(NULL, info->scope(), info->closure(), zone_); |
| + } |
| start_environment_->set_ast_id(BailoutId::FunctionEntry()); |
| entry_block_ = CreateBasicBlock(); |
| entry_block_->SetInitialEnvironment(start_environment_); |
| @@ -2893,7 +3072,7 @@ void HGraph::ComputeMinusZeroChecks() { |
| // Implementation of utility class to encapsulate the translation state for |
| // a (possibly inlined) function. |
| -FunctionState::FunctionState(HGraphBuilder* owner, |
| +FunctionState::FunctionState(HOptimizedGraphBuilder* owner, |
| CompilationInfo* info, |
| TypeFeedbackOracle* oracle, |
| InliningKind inlining_kind) |
| @@ -2942,7 +3121,7 @@ FunctionState::~FunctionState() { |
| // Implementation of utility classes to represent an expression's context in |
| // the AST. |
| -AstContext::AstContext(HGraphBuilder* owner, Expression::Context kind) |
| +AstContext::AstContext(HOptimizedGraphBuilder* owner, Expression::Context kind) |
| : owner_(owner), |
| kind_(kind), |
| outer_(owner->ast_context()), |
| @@ -3053,7 +3232,7 @@ void ValueContext::ReturnControl(HControlInstruction* instr, BailoutId ast_id) { |
| void TestContext::ReturnInstruction(HInstruction* instr, BailoutId ast_id) { |
| ASSERT(!instr->IsControlInstruction()); |
| - HGraphBuilder* builder = owner(); |
| + HOptimizedGraphBuilder* builder = owner(); |
| builder->AddInstruction(instr); |
| // We expect a simulate after every expression with side effects, though |
| // this one isn't actually needed (and wouldn't work if it were targeted). |
| @@ -3084,7 +3263,7 @@ void TestContext::BuildBranch(HValue* value) { |
| // connects a branch node to a join node. We conservatively ensure that |
| // property by always adding an empty block on the outgoing edges of this |
| // branch. |
| - HGraphBuilder* builder = owner(); |
| + HOptimizedGraphBuilder* builder = owner(); |
| if (value != NULL && value->CheckFlag(HValue::kIsArguments)) { |
| builder->Bailout("arguments object value in a test context"); |
| } |
| @@ -3101,7 +3280,7 @@ void TestContext::BuildBranch(HValue* value) { |
| } |
| -// HGraphBuilder infrastructure for bailing out and checking bailouts. |
| +// HOptimizedGraphBuilder infrastructure for bailing out and checking bailouts. |
| #define CHECK_BAILOUT(call) \ |
| do { \ |
| call; \ |
| @@ -3116,25 +3295,26 @@ void TestContext::BuildBranch(HValue* value) { |
| } while (false) |
| -void HGraphBuilder::Bailout(const char* reason) { |
| +void HOptimizedGraphBuilder::Bailout(const char* reason) { |
| info()->set_bailout_reason(reason); |
| SetStackOverflow(); |
| } |
| -void HGraphBuilder::VisitForEffect(Expression* expr) { |
| +void HOptimizedGraphBuilder::VisitForEffect(Expression* expr) { |
| EffectContext for_effect(this); |
| Visit(expr); |
| } |
| -void HGraphBuilder::VisitForValue(Expression* expr, ArgumentsAllowedFlag flag) { |
| +void HOptimizedGraphBuilder::VisitForValue(Expression* expr, |
| + ArgumentsAllowedFlag flag) { |
| ValueContext for_value(this, flag); |
| Visit(expr); |
| } |
| -void HGraphBuilder::VisitForTypeOf(Expression* expr) { |
| +void HOptimizedGraphBuilder::VisitForTypeOf(Expression* expr) { |
| ValueContext for_value(this, ARGUMENTS_NOT_ALLOWED); |
| for_value.set_for_typeof(true); |
| Visit(expr); |
| @@ -3142,113 +3322,109 @@ void HGraphBuilder::VisitForTypeOf(Expression* expr) { |
| -void HGraphBuilder::VisitForControl(Expression* expr, |
| - HBasicBlock* true_block, |
| - HBasicBlock* false_block) { |
| +void HOptimizedGraphBuilder::VisitForControl( |
| + Expression* expr, |
|
Jakob Kummerow
2012/11/28 16:28:22
nit: line break before first argument not necessar
danno
2012/11/30 16:23:24
Done.
|
| + HBasicBlock* true_block, |
| + HBasicBlock* false_block) { |
| TestContext for_test(this, expr, oracle(), true_block, false_block); |
| Visit(expr); |
| } |
| -void HGraphBuilder::VisitArgument(Expression* expr) { |
| +void HOptimizedGraphBuilder::VisitArgument(Expression* expr) { |
| CHECK_ALIVE(VisitForValue(expr)); |
| Push(AddInstruction(new(zone()) HPushArgument(Pop()))); |
| } |
| -void HGraphBuilder::VisitArgumentList(ZoneList<Expression*>* arguments) { |
| +void HOptimizedGraphBuilder::VisitArgumentList( |
| + ZoneList<Expression*>* arguments) { |
| for (int i = 0; i < arguments->length(); i++) { |
| CHECK_ALIVE(VisitArgument(arguments->at(i))); |
| } |
| } |
| -void HGraphBuilder::VisitExpressions(ZoneList<Expression*>* exprs) { |
| +void HOptimizedGraphBuilder::VisitExpressions( |
| + ZoneList<Expression*>* exprs) { |
| for (int i = 0; i < exprs->length(); ++i) { |
| CHECK_ALIVE(VisitForValue(exprs->at(i))); |
| } |
| } |
| -HGraph* HGraphBuilder::CreateGraph() { |
| - graph_ = new(zone()) HGraph(info()); |
| - if (FLAG_hydrogen_stats) HStatistics::Instance()->Initialize(info()); |
| - |
| - { |
| - HPhase phase("H_Block building"); |
| - current_block_ = graph()->entry_block(); |
| - |
| - Scope* scope = info()->scope(); |
| - if (scope->HasIllegalRedeclaration()) { |
| - Bailout("function with illegal redeclaration"); |
| - return NULL; |
| - } |
| - if (scope->calls_eval()) { |
| - Bailout("function calls eval"); |
| - return NULL; |
| - } |
| - SetUpScope(scope); |
| - |
| - // Add an edge to the body entry. This is warty: the graph's start |
| - // environment will be used by the Lithium translation as the initial |
| - // environment on graph entry, but it has now been mutated by the |
| - // Hydrogen translation of the instructions in the start block. This |
| - // environment uses values which have not been defined yet. These |
| - // Hydrogen instructions will then be replayed by the Lithium |
| - // translation, so they cannot have an environment effect. The edge to |
| - // the body's entry block (along with some special logic for the start |
| - // block in HInstruction::InsertAfter) seals the start block from |
| - // getting unwanted instructions inserted. |
| - // |
| - // TODO(kmillikin): Fix this. Stop mutating the initial environment. |
| - // Make the Hydrogen instructions in the initial block into Hydrogen |
| - // values (but not instructions), present in the initial environment and |
| - // not replayed by the Lithium translation. |
| - HEnvironment* initial_env = environment()->CopyWithoutHistory(); |
| - HBasicBlock* body_entry = CreateBasicBlock(initial_env); |
| - current_block()->Goto(body_entry); |
| - body_entry->SetJoinId(BailoutId::FunctionEntry()); |
| - set_current_block(body_entry); |
| - |
| - // Handle implicit declaration of the function name in named function |
| - // expressions before other declarations. |
| - if (scope->is_function_scope() && scope->function() != NULL) { |
| - VisitVariableDeclaration(scope->function()); |
| - } |
| - VisitDeclarations(scope->declarations()); |
| - AddSimulate(BailoutId::Declarations()); |
| +bool HOptimizedGraphBuilder::BuildGraph() { |
| + Scope* scope = info()->scope(); |
| + if (scope->HasIllegalRedeclaration()) { |
| + Bailout("function with illegal redeclaration"); |
| + return false; |
| + } |
| + if (scope->calls_eval()) { |
| + Bailout("function calls eval"); |
| + return false; |
| + } |
| + SetUpScope(scope); |
| + |
| + // Add an edge to the body entry. This is warty: the graph's start |
| + // environment will be used by the Lithium translation as the initial |
| + // environment on graph entry, but it has now been mutated by the |
| + // Hydrogen translation of the instructions in the start block. This |
| + // environment uses values which have not been defined yet. These |
| + // Hydrogen instructions will then be replayed by the Lithium |
| + // translation, so they cannot have an environment effect. The edge to |
| + // the body's entry block (along with some special logic for the start |
| + // block in HInstruction::InsertAfter) seals the start block from |
| + // getting unwanted instructions inserted. |
| + // |
| + // TODO(kmillikin): Fix this. Stop mutating the initial environment. |
| + // Make the Hydrogen instructions in the initial block into Hydrogen |
| + // values (but not instructions), present in the initial environment and |
| + // not replayed by the Lithium translation. |
| + HEnvironment* initial_env = environment()->CopyWithoutHistory(); |
| + HBasicBlock* body_entry = CreateBasicBlock(initial_env); |
| + current_block()->Goto(body_entry); |
| + body_entry->SetJoinId(BailoutId::FunctionEntry()); |
| + set_current_block(body_entry); |
| + |
| + // Handle implicit declaration of the function name in named function |
| + // expressions before other declarations. |
| + if (scope->is_function_scope() && scope->function() != NULL) { |
| + VisitVariableDeclaration(scope->function()); |
| + } |
| + VisitDeclarations(scope->declarations()); |
| + AddSimulate(BailoutId::Declarations()); |
| - HValue* context = environment()->LookupContext(); |
| - AddInstruction( |
| - new(zone()) HStackCheck(context, HStackCheck::kFunctionEntry)); |
| + HValue* context = environment()->LookupContext(); |
| + AddInstruction( |
| + new(zone()) HStackCheck(context, HStackCheck::kFunctionEntry)); |
| - VisitStatements(info()->function()->body()); |
| - if (HasStackOverflow()) return NULL; |
| + VisitStatements(info()->function()->body()); |
| + if (HasStackOverflow()) return false; |
| - if (current_block() != NULL) { |
| - HReturn* instr = new(zone()) HReturn(graph()->GetConstantUndefined()); |
| - current_block()->FinishExit(instr); |
| - set_current_block(NULL); |
| - } |
| - |
| - // If the checksum of the number of type info changes is the same as the |
| - // last time this function was compiled, then this recompile is likely not |
| - // due to missing/inadequate type feedback, but rather too aggressive |
| - // optimization. Disable optimistic LICM in that case. |
| - Handle<Code> unoptimized_code(info()->shared_info()->code()); |
| - ASSERT(unoptimized_code->kind() == Code::FUNCTION); |
| - Handle<TypeFeedbackInfo> type_info( |
| - TypeFeedbackInfo::cast(unoptimized_code->type_feedback_info())); |
| - int checksum = type_info->own_type_change_checksum(); |
| - int composite_checksum = graph()->update_type_change_checksum(checksum); |
| - graph()->set_use_optimistic_licm( |
| - !type_info->matches_inlined_type_change_checksum(composite_checksum)); |
| - type_info->set_inlined_type_change_checksum(composite_checksum); |
| + if (current_block() != NULL) { |
| + HReturn* instr = new(zone()) HReturn(graph()->GetConstantUndefined()); |
| + current_block()->FinishExit(instr); |
| + set_current_block(NULL); |
| } |
| - return graph(); |
| + // If the checksum of the number of type info changes is the same as the |
| + // last time this function was compiled, then this recompile is likely not |
| + // due to missing/inadequate type feedback, but rather too aggressive |
| + // optimization. Disable optimistic LICM in that case. |
| + Handle<Code> unoptimized_code(info()->shared_info()->code()); |
| + ASSERT(unoptimized_code->kind() == Code::FUNCTION); |
| + Handle<TypeFeedbackInfo> type_info( |
| + TypeFeedbackInfo::cast(unoptimized_code->type_feedback_info())); |
| + int checksum = type_info->own_type_change_checksum(); |
| + int composite_checksum = graph()->update_type_change_checksum(checksum); |
| + graph()->set_use_optimistic_licm( |
| + !type_info->matches_inlined_type_change_checksum(composite_checksum)); |
| + type_info->set_inlined_type_change_checksum(composite_checksum); |
| + |
| + return true; |
| } |
| + |
| bool HGraph::Optimize(SmartArrayPointer<char>* bailout_reason) { |
| *bailout_reason = SmartArrayPointer<char>(); |
| OrderBlocks(); |
| @@ -3772,33 +3948,20 @@ void HGraph::DeadCodeElimination() { |
| } |
| -HInstruction* HGraphBuilder::AddInstruction(HInstruction* instr) { |
| - ASSERT(current_block() != NULL); |
| - current_block()->AddInstruction(instr); |
| - return instr; |
| -} |
| - |
| - |
| -void HGraphBuilder::AddSimulate(BailoutId ast_id, RemovableSimulate removable) { |
| - ASSERT(current_block() != NULL); |
| - current_block()->AddSimulate(ast_id, removable); |
| -} |
| - |
| - |
| -void HGraphBuilder::AddPhi(HPhi* instr) { |
| +void HOptimizedGraphBuilder::AddPhi(HPhi* instr) { |
| ASSERT(current_block() != NULL); |
| current_block()->AddPhi(instr); |
| } |
| -void HGraphBuilder::PushAndAdd(HInstruction* instr) { |
| +void HOptimizedGraphBuilder::PushAndAdd(HInstruction* instr) { |
| Push(instr); |
| AddInstruction(instr); |
| } |
| template <class Instruction> |
| -HInstruction* HGraphBuilder::PreProcessCall(Instruction* call) { |
| +HInstruction* HOptimizedGraphBuilder::PreProcessCall(Instruction* call) { |
| int count = call->argument_count(); |
| ZoneList<HValue*> arguments(count, zone()); |
| for (int i = 0; i < count; ++i) { |
| @@ -3812,11 +3975,11 @@ HInstruction* HGraphBuilder::PreProcessCall(Instruction* call) { |
| } |
| -void HGraphBuilder::SetUpScope(Scope* scope) { |
| +void HOptimizedGraphBuilder::SetUpScope(Scope* scope) { |
| HConstant* undefined_constant = new(zone()) HConstant( |
| isolate()->factory()->undefined_value(), Representation::Tagged()); |
| AddInstruction(undefined_constant); |
| - graph_->set_undefined_constant(undefined_constant); |
| + graph()->set_undefined_constant(undefined_constant); |
| HArgumentsObject* object = new(zone()) HArgumentsObject; |
| AddInstruction(object); |
| @@ -3855,21 +4018,21 @@ void HGraphBuilder::SetUpScope(Scope* scope) { |
| } |
| -void HGraphBuilder::VisitStatements(ZoneList<Statement*>* statements) { |
| +void HOptimizedGraphBuilder::VisitStatements(ZoneList<Statement*>* statements) { |
| for (int i = 0; i < statements->length(); i++) { |
| CHECK_ALIVE(Visit(statements->at(i))); |
| } |
| } |
| -HBasicBlock* HGraphBuilder::CreateBasicBlock(HEnvironment* env) { |
| +HBasicBlock* HOptimizedGraphBuilder::CreateBasicBlock(HEnvironment* env) { |
| HBasicBlock* b = graph()->CreateBasicBlock(); |
| b->SetInitialEnvironment(env); |
| return b; |
| } |
| -HBasicBlock* HGraphBuilder::CreateLoopHeaderBlock() { |
| +HBasicBlock* HOptimizedGraphBuilder::CreateLoopHeaderBlock() { |
| HBasicBlock* header = graph()->CreateBasicBlock(); |
| HEnvironment* entry_env = environment()->CopyAsLoopHeader(header); |
| header->SetInitialEnvironment(entry_env); |
| @@ -3878,7 +4041,7 @@ HBasicBlock* HGraphBuilder::CreateLoopHeaderBlock() { |
| } |
| -void HGraphBuilder::VisitBlock(Block* stmt) { |
| +void HOptimizedGraphBuilder::VisitBlock(Block* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -3898,7 +4061,8 @@ void HGraphBuilder::VisitBlock(Block* stmt) { |
| } |
| -void HGraphBuilder::VisitExpressionStatement(ExpressionStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitExpressionStatement( |
| + ExpressionStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -3906,14 +4070,14 @@ void HGraphBuilder::VisitExpressionStatement(ExpressionStatement* stmt) { |
| } |
| -void HGraphBuilder::VisitEmptyStatement(EmptyStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitEmptyStatement(EmptyStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| } |
| -void HGraphBuilder::VisitIfStatement(IfStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitIfStatement(IfStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -3952,7 +4116,7 @@ void HGraphBuilder::VisitIfStatement(IfStatement* stmt) { |
| } |
| -HBasicBlock* HGraphBuilder::BreakAndContinueScope::Get( |
| +HBasicBlock* HOptimizedGraphBuilder::BreakAndContinueScope::Get( |
| BreakableStatement* stmt, |
| BreakType type, |
| int* drop_extra) { |
| @@ -3991,7 +4155,8 @@ HBasicBlock* HGraphBuilder::BreakAndContinueScope::Get( |
| } |
| -void HGraphBuilder::VisitContinueStatement(ContinueStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitContinueStatement( |
| + ContinueStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4005,7 +4170,7 @@ void HGraphBuilder::VisitContinueStatement(ContinueStatement* stmt) { |
| } |
| -void HGraphBuilder::VisitBreakStatement(BreakStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitBreakStatement(BreakStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4019,7 +4184,7 @@ void HGraphBuilder::VisitBreakStatement(BreakStatement* stmt) { |
| } |
| -void HGraphBuilder::VisitReturnStatement(ReturnStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitReturnStatement(ReturnStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4091,7 +4256,7 @@ void HGraphBuilder::VisitReturnStatement(ReturnStatement* stmt) { |
| } |
| -void HGraphBuilder::VisitWithStatement(WithStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitWithStatement(WithStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4099,7 +4264,7 @@ void HGraphBuilder::VisitWithStatement(WithStatement* stmt) { |
| } |
| -void HGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4285,12 +4450,12 @@ void HGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { |
| } |
| -bool HGraphBuilder::HasOsrEntryAt(IterationStatement* statement) { |
| +bool HOptimizedGraphBuilder::HasOsrEntryAt(IterationStatement* statement) { |
| return statement->OsrEntryId() == info()->osr_ast_id(); |
| } |
| -bool HGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
| +bool HOptimizedGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
| if (!HasOsrEntryAt(statement)) return false; |
| HBasicBlock* non_osr_entry = graph()->CreateBasicBlock(); |
| @@ -4340,9 +4505,9 @@ bool HGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { |
| } |
| -void HGraphBuilder::VisitLoopBody(IterationStatement* stmt, |
| - HBasicBlock* loop_entry, |
| - BreakAndContinueInfo* break_info) { |
| +void HOptimizedGraphBuilder::VisitLoopBody(IterationStatement* stmt, |
| + HBasicBlock* loop_entry, |
| + BreakAndContinueInfo* break_info) { |
| BreakAndContinueScope push(break_info, this); |
| AddSimulate(stmt->StackCheckId()); |
| HValue* context = environment()->LookupContext(); |
| @@ -4355,7 +4520,7 @@ void HGraphBuilder::VisitLoopBody(IterationStatement* stmt, |
| } |
| -void HGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4398,7 +4563,7 @@ void HGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
| } |
| -void HGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4442,7 +4607,7 @@ void HGraphBuilder::VisitWhileStatement(WhileStatement* stmt) { |
| } |
| -void HGraphBuilder::VisitForStatement(ForStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitForStatement(ForStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4494,7 +4659,7 @@ void HGraphBuilder::VisitForStatement(ForStatement* stmt) { |
| } |
| -void HGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4615,7 +4780,7 @@ void HGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
| } |
| -void HGraphBuilder::VisitTryCatchStatement(TryCatchStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitTryCatchStatement(TryCatchStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4623,7 +4788,8 @@ void HGraphBuilder::VisitTryCatchStatement(TryCatchStatement* stmt) { |
| } |
| -void HGraphBuilder::VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitTryFinallyStatement( |
| + TryFinallyStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4631,7 +4797,7 @@ void HGraphBuilder::VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
| } |
| -void HGraphBuilder::VisitDebuggerStatement(DebuggerStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitDebuggerStatement(DebuggerStatement* stmt) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4659,7 +4825,7 @@ static Handle<SharedFunctionInfo> SearchSharedFunctionInfo( |
| } |
| -void HGraphBuilder::VisitFunctionLiteral(FunctionLiteral* expr) { |
| +void HOptimizedGraphBuilder::VisitFunctionLiteral(FunctionLiteral* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4678,7 +4844,7 @@ void HGraphBuilder::VisitFunctionLiteral(FunctionLiteral* expr) { |
| } |
| -void HGraphBuilder::VisitSharedFunctionInfoLiteral( |
| +void HOptimizedGraphBuilder::VisitSharedFunctionInfoLiteral( |
| SharedFunctionInfoLiteral* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| @@ -4687,7 +4853,7 @@ void HGraphBuilder::VisitSharedFunctionInfoLiteral( |
| } |
| -void HGraphBuilder::VisitConditional(Conditional* expr) { |
| +void HOptimizedGraphBuilder::VisitConditional(Conditional* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4725,7 +4891,8 @@ void HGraphBuilder::VisitConditional(Conditional* expr) { |
| } |
| -HGraphBuilder::GlobalPropertyAccess HGraphBuilder::LookupGlobalProperty( |
| +HOptimizedGraphBuilder::GlobalPropertyAccess |
| +HOptimizedGraphBuilder::LookupGlobalProperty( |
|
Jakob Kummerow
2012/11/28 16:28:22
nit: I think I'd indent this line (by 4 spaces; an
danno
2012/11/30 16:23:24
Done.
|
| Variable* var, LookupResult* lookup, bool is_store) { |
| if (var->is_this() || !info()->has_global_object()) { |
| return kUseGeneric; |
| @@ -4742,7 +4909,7 @@ HGraphBuilder::GlobalPropertyAccess HGraphBuilder::LookupGlobalProperty( |
| } |
| -HValue* HGraphBuilder::BuildContextChainWalk(Variable* var) { |
| +HValue* HOptimizedGraphBuilder::BuildContextChainWalk(Variable* var) { |
| ASSERT(var->IsContextSlot()); |
| HValue* context = environment()->LookupContext(); |
| int length = info()->scope()->ContextChainLength(var->scope()); |
| @@ -4755,7 +4922,7 @@ HValue* HGraphBuilder::BuildContextChainWalk(Variable* var) { |
| } |
| -void HGraphBuilder::VisitVariableProxy(VariableProxy* expr) { |
| +void HOptimizedGraphBuilder::VisitVariableProxy(VariableProxy* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4828,7 +4995,7 @@ void HGraphBuilder::VisitVariableProxy(VariableProxy* expr) { |
| } |
| -void HGraphBuilder::VisitLiteral(Literal* expr) { |
| +void HOptimizedGraphBuilder::VisitLiteral(Literal* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4838,7 +5005,7 @@ void HGraphBuilder::VisitLiteral(Literal* expr) { |
| } |
| -void HGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { |
| +void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -4997,7 +5164,7 @@ static bool IsFastLiteral(Handle<JSObject> boilerplate, |
| } |
| -void HGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
| +void HOptimizedGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -5102,7 +5269,7 @@ void HGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
| } |
| -void HGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
| +void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -5236,18 +5403,19 @@ static int ComputeLoadStoreFieldIndex(Handle<Map> type, |
| } |
| -void HGraphBuilder::AddCheckMapsWithTransitions(HValue* object, |
| - Handle<Map> map) { |
| +void HOptimizedGraphBuilder::AddCheckMapsWithTransitions(HValue* object, |
| + Handle<Map> map) { |
| AddInstruction(new(zone()) HCheckNonSmi(object)); |
| AddInstruction(HCheckMaps::NewWithTransitions(object, map, zone())); |
| } |
| -HInstruction* HGraphBuilder::BuildStoreNamedField(HValue* object, |
| - Handle<String> name, |
| - HValue* value, |
| - Handle<Map> map, |
| - LookupResult* lookup) { |
| +HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField( |
| + HValue* object, |
| + Handle<String> name, |
| + HValue* value, |
| + Handle<Map> map, |
| + LookupResult* lookup) { |
| ASSERT(lookup->IsFound()); |
| // If the property does not exist yet, we have to check that it wasn't made |
| // readonly or turned into a setter by some meanwhile modifications on the |
| @@ -5299,9 +5467,10 @@ HInstruction* HGraphBuilder::BuildStoreNamedField(HValue* object, |
| } |
| -HInstruction* HGraphBuilder::BuildStoreNamedGeneric(HValue* object, |
| - Handle<String> name, |
| - HValue* value) { |
| +HInstruction* HOptimizedGraphBuilder::BuildStoreNamedGeneric( |
| + HValue* object, |
| + Handle<String> name, |
| + HValue* value) { |
| HValue* context = environment()->LookupContext(); |
| return new(zone()) HStoreNamedGeneric( |
| context, |
| @@ -5312,11 +5481,12 @@ HInstruction* HGraphBuilder::BuildStoreNamedGeneric(HValue* object, |
| } |
| -HInstruction* HGraphBuilder::BuildCallSetter(HValue* object, |
| - HValue* value, |
| - Handle<Map> map, |
| - Handle<JSFunction> setter, |
| - Handle<JSObject> holder) { |
| +HInstruction* HOptimizedGraphBuilder::BuildCallSetter( |
| + HValue* object, |
| + HValue* value, |
| + Handle<Map> map, |
| + Handle<JSFunction> setter, |
| + Handle<JSObject> holder) { |
| AddCheckConstantFunction(holder, object, map); |
| AddInstruction(new(zone()) HPushArgument(object)); |
| AddInstruction(new(zone()) HPushArgument(value)); |
| @@ -5324,10 +5494,11 @@ HInstruction* HGraphBuilder::BuildCallSetter(HValue* object, |
| } |
| -HInstruction* HGraphBuilder::BuildStoreNamedMonomorphic(HValue* object, |
| - Handle<String> name, |
| - HValue* value, |
| - Handle<Map> map) { |
| +HInstruction* HOptimizedGraphBuilder::BuildStoreNamedMonomorphic( |
| + HValue* object, |
| + Handle<String> name, |
| + HValue* value, |
| + Handle<Map> map) { |
| // Handle a store to a known field. |
| LookupResult lookup(isolate()); |
| if (ComputeLoadStoreField(map, name, &lookup, true)) { |
| @@ -5340,10 +5511,11 @@ HInstruction* HGraphBuilder::BuildStoreNamedMonomorphic(HValue* object, |
| } |
| -void HGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr, |
| - HValue* object, |
| - SmallMapList* types, |
| - Handle<String> name) { |
| +void HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField( |
| + Property* expr, |
| + HValue* object, |
| + SmallMapList* types, |
| + Handle<String> name) { |
| int count = 0; |
| int previous_field_offset = 0; |
| bool previous_field_is_in_object = false; |
| @@ -5395,11 +5567,12 @@ void HGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr, |
| } |
| -void HGraphBuilder::HandlePolymorphicStoreNamedField(Assignment* expr, |
| - HValue* object, |
| - HValue* value, |
| - SmallMapList* types, |
| - Handle<String> name) { |
| +void HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField( |
| + Assignment* expr, |
| + HValue* object, |
| + HValue* value, |
| + SmallMapList* types, |
| + Handle<String> name) { |
| // TODO(ager): We should recognize when the prototype chains for different |
| // maps are identical. In that case we can avoid repeatedly generating the |
| // same prototype map checks. |
| @@ -5471,7 +5644,7 @@ void HGraphBuilder::HandlePolymorphicStoreNamedField(Assignment* expr, |
| } |
| -void HGraphBuilder::HandlePropertyAssignment(Assignment* expr) { |
| +void HOptimizedGraphBuilder::HandlePropertyAssignment(Assignment* expr) { |
| Property* prop = expr->target()->AsProperty(); |
| ASSERT(prop != NULL); |
| expr->RecordTypeFeedback(oracle(), zone()); |
| @@ -5554,10 +5727,11 @@ void HGraphBuilder::HandlePropertyAssignment(Assignment* expr) { |
| // Because not every expression has a position and there is not common |
| // superclass of Assignment and CountOperation, we cannot just pass the |
| // owning expression instead of position and ast_id separately. |
| -void HGraphBuilder::HandleGlobalVariableAssignment(Variable* var, |
| - HValue* value, |
| - int position, |
| - BailoutId ast_id) { |
| +void HOptimizedGraphBuilder::HandleGlobalVariableAssignment( |
| + Variable* var, |
| + HValue* value, |
| + int position, |
| + BailoutId ast_id) { |
| LookupResult lookup(isolate()); |
| GlobalPropertyAccess type = LookupGlobalProperty(var, &lookup, true); |
| if (type == kUseCell) { |
| @@ -5588,7 +5762,7 @@ void HGraphBuilder::HandleGlobalVariableAssignment(Variable* var, |
| } |
| -void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
| +void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
| Expression* target = expr->target(); |
| VariableProxy* proxy = target->AsVariableProxy(); |
| Property* prop = target->AsProperty(); |
| @@ -5785,7 +5959,7 @@ void HGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
| } |
| -void HGraphBuilder::VisitAssignment(Assignment* expr) { |
| +void HOptimizedGraphBuilder::VisitAssignment(Assignment* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -5912,7 +6086,7 @@ void HGraphBuilder::VisitAssignment(Assignment* expr) { |
| } |
| -void HGraphBuilder::VisitThrow(Throw* expr) { |
| +void HOptimizedGraphBuilder::VisitThrow(Throw* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -5933,9 +6107,10 @@ void HGraphBuilder::VisitThrow(Throw* expr) { |
| } |
| -HLoadNamedField* HGraphBuilder::BuildLoadNamedField(HValue* object, |
| - Handle<Map> map, |
| - LookupResult* lookup) { |
| +HLoadNamedField* HOptimizedGraphBuilder::BuildLoadNamedField( |
| + HValue* object, |
| + Handle<Map> map, |
| + LookupResult* lookup) { |
| int index = lookup->GetLocalFieldIndexFromMap(*map); |
| if (index < 0) { |
| // Negative property indices are in-object properties, indexed |
| @@ -5950,9 +6125,10 @@ HLoadNamedField* HGraphBuilder::BuildLoadNamedField(HValue* object, |
| } |
| -HInstruction* HGraphBuilder::BuildLoadNamedGeneric(HValue* object, |
| - Handle<String> name, |
| - Property* expr) { |
| +HInstruction* HOptimizedGraphBuilder::BuildLoadNamedGeneric( |
| + HValue* object, |
| + Handle<String> name, |
| + Property* expr) { |
| if (expr->IsUninitialized() && !FLAG_always_opt) { |
| AddInstruction(new(zone()) HSoftDeoptimize); |
| current_block()->MarkAsDeoptimizing(); |
| @@ -5962,20 +6138,22 @@ HInstruction* HGraphBuilder::BuildLoadNamedGeneric(HValue* object, |
| } |
| -HInstruction* HGraphBuilder::BuildCallGetter(HValue* object, |
| - Handle<Map> map, |
| - Handle<JSFunction> getter, |
| - Handle<JSObject> holder) { |
| +HInstruction* HOptimizedGraphBuilder::BuildCallGetter( |
| + HValue* object, |
| + Handle<Map> map, |
| + Handle<JSFunction> getter, |
| + Handle<JSObject> holder) { |
| AddCheckConstantFunction(holder, object, map); |
| AddInstruction(new(zone()) HPushArgument(object)); |
| return new(zone()) HCallConstantFunction(getter, 1); |
| } |
| -HInstruction* HGraphBuilder::BuildLoadNamedMonomorphic(HValue* object, |
| - Handle<String> name, |
| - Property* expr, |
| - Handle<Map> map) { |
| +HInstruction* HOptimizedGraphBuilder::BuildLoadNamedMonomorphic( |
| + HValue* object, |
| + Handle<String> name, |
| + Property* expr, |
| + Handle<Map> map) { |
| // Handle a load from a known field. |
| ASSERT(!map->is_dictionary_map()); |
| LookupResult lookup(isolate()); |
| @@ -6009,174 +6187,34 @@ HInstruction* HGraphBuilder::BuildLoadNamedMonomorphic(HValue* object, |
| } |
| -HInstruction* HGraphBuilder::BuildLoadKeyedGeneric(HValue* object, |
| - HValue* key) { |
| +HInstruction* HOptimizedGraphBuilder::BuildLoadKeyedGeneric(HValue* object, |
| + HValue* key) { |
| HValue* context = environment()->LookupContext(); |
| return new(zone()) HLoadKeyedGeneric(context, object, key); |
| } |
| -HInstruction* HGraphBuilder::BuildExternalArrayElementAccess( |
| - HValue* external_elements, |
| - HValue* checked_key, |
| +HInstruction* HOptimizedGraphBuilder::BuildMonomorphicElementAccess( |
| + HValue* object, |
| + HValue* key, |
| HValue* val, |
| HValue* dependency, |
| - ElementsKind elements_kind, |
| + Handle<Map> map, |
| bool is_store) { |
| - if (is_store) { |
| - ASSERT(val != NULL); |
| - switch (elements_kind) { |
| - case EXTERNAL_PIXEL_ELEMENTS: { |
| - val = AddInstruction(new(zone()) HClampToUint8(val)); |
| - break; |
| - } |
| - case EXTERNAL_BYTE_ELEMENTS: |
| - case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| - case EXTERNAL_SHORT_ELEMENTS: |
| - case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| - case EXTERNAL_INT_ELEMENTS: |
| - case EXTERNAL_UNSIGNED_INT_ELEMENTS: { |
| - break; |
| - } |
| - case EXTERNAL_FLOAT_ELEMENTS: |
| - case EXTERNAL_DOUBLE_ELEMENTS: |
| - break; |
| - case FAST_SMI_ELEMENTS: |
| - case FAST_ELEMENTS: |
| - case FAST_DOUBLE_ELEMENTS: |
| - case FAST_HOLEY_SMI_ELEMENTS: |
| - case FAST_HOLEY_ELEMENTS: |
| - case FAST_HOLEY_DOUBLE_ELEMENTS: |
| - case DICTIONARY_ELEMENTS: |
| - case NON_STRICT_ARGUMENTS_ELEMENTS: |
| - UNREACHABLE(); |
| - break; |
| - } |
| - return new(zone()) HStoreKeyed(external_elements, |
| - checked_key, |
| - val, |
| - elements_kind); |
| - } else { |
| - ASSERT(val == NULL); |
| - HLoadKeyed* load = |
| - new(zone()) HLoadKeyed( |
| - external_elements, checked_key, dependency, elements_kind); |
| - if (FLAG_opt_safe_uint32_operations && |
| - elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) { |
| - graph()->RecordUint32Instruction(load); |
| - } |
| - return load; |
| - } |
| -} |
| - |
| - |
| -HInstruction* HGraphBuilder::BuildFastElementAccess(HValue* elements, |
| - HValue* checked_key, |
| - HValue* val, |
| - HValue* load_dependency, |
| - ElementsKind elements_kind, |
| - bool is_store) { |
| - if (is_store) { |
| - ASSERT(val != NULL); |
| - switch (elements_kind) { |
| - case FAST_SMI_ELEMENTS: |
| - case FAST_HOLEY_SMI_ELEMENTS: |
| - // Smi-only arrays need a smi check. |
| - AddInstruction(new(zone()) HCheckSmi(val)); |
| - // Fall through. |
| - case FAST_ELEMENTS: |
| - case FAST_HOLEY_ELEMENTS: |
| - case FAST_DOUBLE_ELEMENTS: |
| - case FAST_HOLEY_DOUBLE_ELEMENTS: |
| - return new(zone()) HStoreKeyed( |
| - elements, checked_key, val, elements_kind); |
| - default: |
| - UNREACHABLE(); |
| - return NULL; |
| - } |
| - } |
| - // It's an element load (!is_store). |
| - return new(zone()) HLoadKeyed(elements, |
| - checked_key, |
| - load_dependency, |
| - elements_kind); |
| -} |
| - |
| - |
| -HInstruction* HGraphBuilder::BuildMonomorphicElementAccess(HValue* object, |
| - HValue* key, |
| - HValue* val, |
| - HValue* dependency, |
| - Handle<Map> map, |
| - bool is_store) { |
| HCheckMaps* mapcheck = new(zone()) HCheckMaps(object, map, |
| zone(), dependency); |
| AddInstruction(mapcheck); |
| if (dependency) { |
| mapcheck->ClearGVNFlag(kDependsOnElementsKind); |
| } |
| - return BuildUncheckedMonomorphicElementAccess(object, key, val, |
| - mapcheck, map, is_store); |
| + return BuildUncheckedMonomorphicElementAccess( |
| + object, key, val, |
| + mapcheck, map->instance_type() == JS_ARRAY_TYPE, |
| + map->elements_kind(), is_store); |
| } |
| -HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
| - HValue* object, |
| - HValue* key, |
| - HValue* val, |
| - HCheckMaps* mapcheck, |
| - Handle<Map> map, |
| - bool is_store) { |
| - // No GVNFlag is necessary for ElementsKind if there is an explicit dependency |
| - // on a HElementsTransition instruction. The flag can also be removed if the |
| - // map to check has FAST_HOLEY_ELEMENTS, since there can be no further |
| - // ElementsKind transitions. Finally, the dependency can be removed for stores |
| - // for FAST_ELEMENTS, since a transition to HOLEY elements won't change the |
| - // generated store code. |
| - if ((map->elements_kind() == FAST_HOLEY_ELEMENTS) || |
| - (map->elements_kind() == FAST_ELEMENTS && is_store)) { |
| - mapcheck->ClearGVNFlag(kDependsOnElementsKind); |
| - } |
| - bool fast_smi_only_elements = map->has_fast_smi_elements(); |
| - bool fast_elements = map->has_fast_object_elements(); |
| - HInstruction* elements = |
| - AddInstruction(new(zone()) HLoadElements(object, mapcheck)); |
| - if (is_store && (fast_elements || fast_smi_only_elements)) { |
| - HCheckMaps* check_cow_map = new(zone()) HCheckMaps( |
| - elements, isolate()->factory()->fixed_array_map(), zone()); |
| - check_cow_map->ClearGVNFlag(kDependsOnElementsKind); |
| - AddInstruction(check_cow_map); |
| - } |
| - HInstruction* length = NULL; |
| - HInstruction* checked_key = NULL; |
| - if (map->has_external_array_elements()) { |
| - length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); |
| - checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length, |
| - ALLOW_SMI_KEY)); |
| - HLoadExternalArrayPointer* external_elements = |
| - new(zone()) HLoadExternalArrayPointer(elements); |
| - AddInstruction(external_elements); |
| - return BuildExternalArrayElementAccess( |
| - external_elements, checked_key, val, mapcheck, |
| - map->elements_kind(), is_store); |
| - } |
| - ASSERT(fast_smi_only_elements || |
| - fast_elements || |
| - map->has_fast_double_elements()); |
| - if (map->instance_type() == JS_ARRAY_TYPE) { |
| - length = AddInstruction(new(zone()) HJSArrayLength(object, mapcheck, |
| - HType::Smi())); |
| - } else { |
| - length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements)); |
| - } |
| - checked_key = AddInstruction(new(zone()) HBoundsCheck(key, length, |
| - ALLOW_SMI_KEY)); |
| - return BuildFastElementAccess(elements, checked_key, val, mapcheck, |
| - map->elements_kind(), is_store); |
| -} |
| - |
| - |
| -HInstruction* HGraphBuilder::TryBuildConsolidatedElementLoad( |
| +HInstruction* HOptimizedGraphBuilder::TryBuildConsolidatedElementLoad( |
| HValue* object, |
| HValue* key, |
| HValue* val, |
| @@ -6224,19 +6262,23 @@ HInstruction* HGraphBuilder::TryBuildConsolidatedElementLoad( |
| HCheckMaps* check_maps = new(zone()) HCheckMaps(object, maps, zone()); |
| AddInstruction(check_maps); |
| HInstruction* instr = BuildUncheckedMonomorphicElementAccess( |
| - object, key, val, check_maps, most_general_consolidated_map, false); |
| + object, key, val, check_maps, |
| + most_general_consolidated_map->instance_type() == JS_ARRAY_TYPE, |
| + most_general_consolidated_map->elements_kind(), |
| + false); |
| return instr; |
| } |
| -HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
| - HValue* key, |
| - HValue* val, |
| - Expression* prop, |
| - BailoutId ast_id, |
| - int position, |
| - bool is_store, |
| - bool* has_side_effects) { |
| +HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( |
| + HValue* object, |
| + HValue* key, |
| + HValue* val, |
| + Expression* prop, |
| + BailoutId ast_id, |
| + int position, |
| + bool is_store, |
| + bool* has_side_effects) { |
| *has_side_effects = false; |
| AddInstruction(new(zone()) HCheckNonSmi(object)); |
| SmallMapList* maps = prop->GetReceiverTypes(); |
| @@ -6421,8 +6463,8 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
| } |
| } else { // External array elements. |
| access = AddInstruction(BuildExternalArrayElementAccess( |
| - external_elements, checked_key, val, elements_kind_branch, |
| - elements_kind, is_store)); |
| + external_elements, checked_key, val, |
| + elements_kind_branch, elements_kind, is_store)); |
| } |
| *has_side_effects |= access->HasObservableSideEffects(); |
| if (position != RelocInfo::kNoPosition) access->set_position(position); |
| @@ -6442,14 +6484,15 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, |
| } |
| -HValue* HGraphBuilder::HandleKeyedElementAccess(HValue* obj, |
| - HValue* key, |
| - HValue* val, |
| - Expression* expr, |
| - BailoutId ast_id, |
| - int position, |
| - bool is_store, |
| - bool* has_side_effects) { |
| +HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess( |
| + HValue* obj, |
| + HValue* key, |
| + HValue* val, |
| + Expression* expr, |
| + BailoutId ast_id, |
| + int position, |
| + bool is_store, |
| + bool* has_side_effects) { |
| ASSERT(!expr->IsPropertyName()); |
| HInstruction* instr = NULL; |
| if (expr->IsMonomorphic()) { |
| @@ -6479,9 +6522,10 @@ HValue* HGraphBuilder::HandleKeyedElementAccess(HValue* obj, |
| } |
| -HInstruction* HGraphBuilder::BuildStoreKeyedGeneric(HValue* object, |
| - HValue* key, |
| - HValue* value) { |
| +HInstruction* HOptimizedGraphBuilder::BuildStoreKeyedGeneric( |
| + HValue* object, |
| + HValue* key, |
| + HValue* value) { |
| HValue* context = environment()->LookupContext(); |
| return new(zone()) HStoreKeyedGeneric( |
| context, |
| @@ -6492,7 +6536,7 @@ HInstruction* HGraphBuilder::BuildStoreKeyedGeneric(HValue* object, |
| } |
| -void HGraphBuilder::EnsureArgumentsArePushedForAccess() { |
| +void HOptimizedGraphBuilder::EnsureArgumentsArePushedForAccess() { |
| // Outermost function already has arguments on the stack. |
| if (function_state()->outer() == NULL) return; |
| @@ -6520,7 +6564,7 @@ void HGraphBuilder::EnsureArgumentsArePushedForAccess() { |
| } |
| -bool HGraphBuilder::TryArgumentsAccess(Property* expr) { |
| +bool HOptimizedGraphBuilder::TryArgumentsAccess(Property* expr) { |
| VariableProxy* proxy = expr->obj()->AsVariableProxy(); |
| if (proxy == NULL) return false; |
| if (!proxy->var()->IsStackAllocated()) return false; |
| @@ -6579,7 +6623,7 @@ bool HGraphBuilder::TryArgumentsAccess(Property* expr) { |
| } |
| -void HGraphBuilder::VisitProperty(Property* expr) { |
| +void HOptimizedGraphBuilder::VisitProperty(Property* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -6670,8 +6714,8 @@ void HGraphBuilder::VisitProperty(Property* expr) { |
| } |
| -void HGraphBuilder::AddCheckPrototypeMaps(Handle<JSObject> holder, |
| - Handle<Map> receiver_map) { |
| +void HOptimizedGraphBuilder::AddCheckPrototypeMaps(Handle<JSObject> holder, |
| + Handle<Map> receiver_map) { |
| if (!holder.is_null()) { |
| AddInstruction(new(zone()) HCheckPrototypeMaps( |
| Handle<JSObject>(JSObject::cast(receiver_map->prototype())), holder)); |
| @@ -6679,9 +6723,10 @@ void HGraphBuilder::AddCheckPrototypeMaps(Handle<JSObject> holder, |
| } |
| -void HGraphBuilder::AddCheckConstantFunction(Handle<JSObject> holder, |
| - HValue* receiver, |
| - Handle<Map> receiver_map) { |
| +void HOptimizedGraphBuilder::AddCheckConstantFunction( |
| + Handle<JSObject> holder, |
| + HValue* receiver, |
| + Handle<Map> receiver_map) { |
| // Constant functions have the nice property that the map will change if they |
| // are overwritten. Therefore it is enough to check the map of the holder and |
| // its prototypes. |
| @@ -6723,10 +6768,11 @@ static int CompareHotness(void const* a, void const* b) { |
| } |
| -void HGraphBuilder::HandlePolymorphicCallNamed(Call* expr, |
| - HValue* receiver, |
| - SmallMapList* types, |
| - Handle<String> name) { |
| +void HOptimizedGraphBuilder::HandlePolymorphicCallNamed( |
| + Call* expr, |
| + HValue* receiver, |
| + SmallMapList* types, |
| + Handle<String> name) { |
| // TODO(ager): We should recognize when the prototype chains for different |
| // maps are identical. In that case we can avoid repeatedly generating the |
| // same prototype map checks. |
| @@ -6828,9 +6874,9 @@ void HGraphBuilder::HandlePolymorphicCallNamed(Call* expr, |
| } |
| -void HGraphBuilder::TraceInline(Handle<JSFunction> target, |
| - Handle<JSFunction> caller, |
| - const char* reason) { |
| +void HOptimizedGraphBuilder::TraceInline(Handle<JSFunction> target, |
| + Handle<JSFunction> caller, |
| + const char* reason) { |
| if (FLAG_trace_inlining) { |
| SmartArrayPointer<char> target_name = |
| target->shared()->DebugName()->ToCString(); |
| @@ -6849,7 +6895,7 @@ void HGraphBuilder::TraceInline(Handle<JSFunction> target, |
| static const int kNotInlinable = 1000000000; |
| -int HGraphBuilder::InliningAstSize(Handle<JSFunction> target) { |
| +int HOptimizedGraphBuilder::InliningAstSize(Handle<JSFunction> target) { |
| if (!FLAG_use_inlining) return kNotInlinable; |
| // Precondition: call is monomorphic and we have found a target with the |
| @@ -6880,13 +6926,13 @@ int HGraphBuilder::InliningAstSize(Handle<JSFunction> target) { |
| } |
| -bool HGraphBuilder::TryInline(CallKind call_kind, |
| - Handle<JSFunction> target, |
| - int arguments_count, |
| - HValue* implicit_return_value, |
| - BailoutId ast_id, |
| - BailoutId return_id, |
| - InliningKind inlining_kind) { |
| +bool HOptimizedGraphBuilder::TryInline(CallKind call_kind, |
| + Handle<JSFunction> target, |
| + int arguments_count, |
| + HValue* implicit_return_value, |
| + BailoutId ast_id, |
| + BailoutId return_id, |
| + InliningKind inlining_kind) { |
| int nodes_added = InliningAstSize(target); |
| if (nodes_added == kNotInlinable) return false; |
| @@ -7195,7 +7241,7 @@ bool HGraphBuilder::TryInline(CallKind call_kind, |
| } |
| -bool HGraphBuilder::TryInlineCall(Call* expr, bool drop_extra) { |
| +bool HOptimizedGraphBuilder::TryInlineCall(Call* expr, bool drop_extra) { |
| // The function call we are inlining is a method call if the call |
| // is a property call. |
| CallKind call_kind = (expr->expression()->AsProperty() == NULL) |
| @@ -7212,8 +7258,8 @@ bool HGraphBuilder::TryInlineCall(Call* expr, bool drop_extra) { |
| } |
| -bool HGraphBuilder::TryInlineConstruct(CallNew* expr, |
| - HValue* implicit_return_value) { |
| +bool HOptimizedGraphBuilder::TryInlineConstruct(CallNew* expr, |
| + HValue* implicit_return_value) { |
| return TryInline(CALL_AS_FUNCTION, |
| expr->target(), |
| expr->arguments()->length(), |
| @@ -7224,8 +7270,8 @@ bool HGraphBuilder::TryInlineConstruct(CallNew* expr, |
| } |
| -bool HGraphBuilder::TryInlineGetter(Handle<JSFunction> getter, |
| - Property* prop) { |
| +bool HOptimizedGraphBuilder::TryInlineGetter(Handle<JSFunction> getter, |
| + Property* prop) { |
| return TryInline(CALL_AS_METHOD, |
| getter, |
| 0, |
| @@ -7236,9 +7282,9 @@ bool HGraphBuilder::TryInlineGetter(Handle<JSFunction> getter, |
| } |
| -bool HGraphBuilder::TryInlineSetter(Handle<JSFunction> setter, |
| - Assignment* assignment, |
| - HValue* implicit_return_value) { |
| +bool HOptimizedGraphBuilder::TryInlineSetter(Handle<JSFunction> setter, |
| + Assignment* assignment, |
| + HValue* implicit_return_value) { |
| return TryInline(CALL_AS_METHOD, |
| setter, |
| 1, |
| @@ -7249,7 +7295,8 @@ bool HGraphBuilder::TryInlineSetter(Handle<JSFunction> setter, |
| } |
| -bool HGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr, bool drop_extra) { |
| +bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr, |
| + bool drop_extra) { |
| if (!expr->target()->shared()->HasBuiltinFunctionId()) return false; |
| BuiltinFunctionId id = expr->target()->shared()->builtin_function_id(); |
| switch (id) { |
| @@ -7283,10 +7330,11 @@ bool HGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr, bool drop_extra) { |
| } |
| -bool HGraphBuilder::TryInlineBuiltinMethodCall(Call* expr, |
| - HValue* receiver, |
| - Handle<Map> receiver_map, |
| - CheckType check_type) { |
| +bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall( |
| + Call* expr, |
| + HValue* receiver, |
| + Handle<Map> receiver_map, |
| + CheckType check_type) { |
| ASSERT(check_type != RECEIVER_MAP_CHECK || !receiver_map.is_null()); |
| // Try to inline calls like Math.* as operations in the calling function. |
| if (!expr->target()->shared()->HasBuiltinFunctionId()) return false; |
| @@ -7416,7 +7464,7 @@ bool HGraphBuilder::TryInlineBuiltinMethodCall(Call* expr, |
| } |
| -bool HGraphBuilder::TryCallApply(Call* expr) { |
| +bool HOptimizedGraphBuilder::TryCallApply(Call* expr) { |
| Expression* callee = expr->expression(); |
| Property* prop = callee->AsProperty(); |
| ASSERT(prop != NULL); |
| @@ -7544,7 +7592,7 @@ static Map* CheckSameElementsFamily(SmallMapList* types) { |
| } |
| -void HGraphBuilder::VisitCall(Call* expr) { |
| +void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -7774,7 +7822,7 @@ static bool IsAllocationInlineable(Handle<JSFunction> constructor) { |
| } |
| -void HGraphBuilder::VisitCallNew(CallNew* expr) { |
| +void HOptimizedGraphBuilder::VisitCallNew(CallNew* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -7838,20 +7886,21 @@ void HGraphBuilder::VisitCallNew(CallNew* expr) { |
| // Support for generating inlined runtime functions. |
| -// Lookup table for generators for runtime calls that are generated inline. |
| -// Elements of the table are member pointers to functions of HGraphBuilder. |
| +// Lookup table for generators for runtime calls that are generated inline. |
| +// Elements of the table are member pointers to functions of |
| +// HOptimizedGraphBuilder. |
| #define INLINE_FUNCTION_GENERATOR_ADDRESS(Name, argc, ressize) \ |
| - &HGraphBuilder::Generate##Name, |
| + &HOptimizedGraphBuilder::Generate##Name, |
| -const HGraphBuilder::InlineFunctionGenerator |
| - HGraphBuilder::kInlineFunctionGenerators[] = { |
| +const HOptimizedGraphBuilder::InlineFunctionGenerator |
| + HOptimizedGraphBuilder::kInlineFunctionGenerators[] = { |
| INLINE_FUNCTION_LIST(INLINE_FUNCTION_GENERATOR_ADDRESS) |
| INLINE_RUNTIME_FUNCTION_LIST(INLINE_FUNCTION_GENERATOR_ADDRESS) |
| }; |
| #undef INLINE_FUNCTION_GENERATOR_ADDRESS |
| -void HGraphBuilder::VisitCallRuntime(CallRuntime* expr) { |
| +void HOptimizedGraphBuilder::VisitCallRuntime(CallRuntime* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -7889,7 +7938,7 @@ void HGraphBuilder::VisitCallRuntime(CallRuntime* expr) { |
| } |
| -void HGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -7905,7 +7954,7 @@ void HGraphBuilder::VisitUnaryOperation(UnaryOperation* expr) { |
| } |
| } |
| -void HGraphBuilder::VisitDelete(UnaryOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitDelete(UnaryOperation* expr) { |
| Property* prop = expr->expression()->AsProperty(); |
| VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
| if (prop != NULL) { |
| @@ -7940,13 +7989,13 @@ void HGraphBuilder::VisitDelete(UnaryOperation* expr) { |
| } |
| -void HGraphBuilder::VisitVoid(UnaryOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitVoid(UnaryOperation* expr) { |
| CHECK_ALIVE(VisitForEffect(expr->expression())); |
| return ast_context()->ReturnValue(graph()->GetConstantUndefined()); |
| } |
| -void HGraphBuilder::VisitTypeof(UnaryOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitTypeof(UnaryOperation* expr) { |
| CHECK_ALIVE(VisitForTypeOf(expr->expression())); |
| HValue* value = Pop(); |
| HValue* context = environment()->LookupContext(); |
| @@ -7955,22 +8004,22 @@ void HGraphBuilder::VisitTypeof(UnaryOperation* expr) { |
| } |
| -void HGraphBuilder::VisitAdd(UnaryOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitAdd(UnaryOperation* expr) { |
| CHECK_ALIVE(VisitForValue(expr->expression())); |
| HValue* value = Pop(); |
| HValue* context = environment()->LookupContext(); |
| HInstruction* instr = |
| - new(zone()) HMul(context, value, graph_->GetConstant1()); |
| + new(zone()) HMul(context, value, graph()->GetConstant1()); |
| return ast_context()->ReturnInstruction(instr, expr->id()); |
| } |
| -void HGraphBuilder::VisitSub(UnaryOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitSub(UnaryOperation* expr) { |
| CHECK_ALIVE(VisitForValue(expr->expression())); |
| HValue* value = Pop(); |
| HValue* context = environment()->LookupContext(); |
| HInstruction* instr = |
| - new(zone()) HMul(context, value, graph_->GetConstantMinus1()); |
| + new(zone()) HMul(context, value, graph()->GetConstantMinus1()); |
| TypeInfo info = oracle()->UnaryType(expr); |
| Representation rep = ToRepresentation(info); |
| if (info.IsUninitialized()) { |
| @@ -7983,7 +8032,7 @@ void HGraphBuilder::VisitSub(UnaryOperation* expr) { |
| } |
| -void HGraphBuilder::VisitBitNot(UnaryOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitBitNot(UnaryOperation* expr) { |
| CHECK_ALIVE(VisitForValue(expr->expression())); |
| HValue* value = Pop(); |
| TypeInfo info = oracle()->UnaryType(expr); |
| @@ -7996,7 +8045,7 @@ void HGraphBuilder::VisitBitNot(UnaryOperation* expr) { |
| } |
| -void HGraphBuilder::VisitNot(UnaryOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitNot(UnaryOperation* expr) { |
| if (ast_context()->IsTest()) { |
| TestContext* context = TestContext::cast(ast_context()); |
| VisitForControl(expr->expression(), |
| @@ -8040,8 +8089,9 @@ void HGraphBuilder::VisitNot(UnaryOperation* expr) { |
| } |
| -HInstruction* HGraphBuilder::BuildIncrement(bool returns_original_input, |
| - CountOperation* expr) { |
| +HInstruction* HOptimizedGraphBuilder::BuildIncrement( |
| + bool returns_original_input, |
| + CountOperation* expr) { |
| // The input to the count operation is on top of the expression stack. |
| TypeInfo info = oracle()->IncrementType(expr); |
| Representation rep = ToRepresentation(info); |
| @@ -8063,8 +8113,8 @@ HInstruction* HGraphBuilder::BuildIncrement(bool returns_original_input, |
| // to simulate the expression stack after this instruction. |
| // Any later failures deopt to the load of the input or earlier. |
| HConstant* delta = (expr->op() == Token::INC) |
| - ? graph_->GetConstant1() |
| - : graph_->GetConstantMinus1(); |
| + ? graph()->GetConstant1() |
| + : graph()->GetConstantMinus1(); |
| HValue* context = environment()->LookupContext(); |
| HInstruction* instr = new(zone()) HAdd(context, Top(), delta); |
| // We can't insert a simulate here, because it would break deoptimization, |
| @@ -8077,7 +8127,7 @@ HInstruction* HGraphBuilder::BuildIncrement(bool returns_original_input, |
| } |
| -void HGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -8161,7 +8211,7 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| if (prop->key()->IsPropertyName()) { |
| // Named property. |
| - if (returns_original_input) Push(graph_->GetConstantUndefined()); |
| + if (returns_original_input) Push(graph()->GetConstantUndefined()); |
| CHECK_ALIVE(VisitForValue(prop->obj())); |
| HValue* object = Top(); |
| @@ -8222,7 +8272,7 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| } else { |
| // Keyed property. |
| - if (returns_original_input) Push(graph_->GetConstantUndefined()); |
| + if (returns_original_input) Push(graph()->GetConstantUndefined()); |
| CHECK_ALIVE(VisitForValue(prop->obj())); |
| CHECK_ALIVE(VisitForValue(prop->key())); |
| @@ -8262,9 +8312,10 @@ void HGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| } |
| -HStringCharCodeAt* HGraphBuilder::BuildStringCharCodeAt(HValue* context, |
| - HValue* string, |
| - HValue* index) { |
| +HStringCharCodeAt* HOptimizedGraphBuilder::BuildStringCharCodeAt( |
| + HValue* context, |
| + HValue* string, |
| + HValue* index) { |
| AddInstruction(new(zone()) HCheckNonSmi(string)); |
| AddInstruction(HCheckInstanceType::NewIsString(string, zone())); |
| HStringLength* length = new(zone()) HStringLength(string); |
| @@ -8292,10 +8343,10 @@ static bool ShiftAmountsAllowReplaceByRotate(HValue* sa, |
| // directions that can be replaced by one rotate right instruction or not. |
| // Returns the operand and the shift amount for the rotate instruction in the |
| // former case. |
| -bool HGraphBuilder::MatchRotateRight(HValue* left, |
| - HValue* right, |
| - HValue** operand, |
| - HValue** shift_amount) { |
| +bool HOptimizedGraphBuilder::MatchRotateRight(HValue* left, |
| + HValue* right, |
| + HValue** operand, |
| + HValue** shift_amount) { |
| HShl* shl; |
| HShr* shr; |
| if (left->IsShl() && right->IsShr()) { |
| @@ -8330,9 +8381,10 @@ bool CanBeZero(HValue *right) { |
| } |
| -HInstruction* HGraphBuilder::BuildBinaryOperation(BinaryOperation* expr, |
| - HValue* left, |
| - HValue* right) { |
| +HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation( |
| + BinaryOperation* expr, |
| + HValue* left, |
| + HValue* right) { |
| HValue* context = environment()->LookupContext(); |
| TypeInfo left_info, right_info, result_info, combined_info; |
| oracle()->BinaryType(expr, &left_info, &right_info, &result_info); |
| @@ -8425,7 +8477,7 @@ static bool IsClassOfTest(CompareOperation* expr) { |
| } |
| -void HGraphBuilder::VisitBinaryOperation(BinaryOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitBinaryOperation(BinaryOperation* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -8441,7 +8493,7 @@ void HGraphBuilder::VisitBinaryOperation(BinaryOperation* expr) { |
| } |
| -void HGraphBuilder::VisitComma(BinaryOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitComma(BinaryOperation* expr) { |
| CHECK_ALIVE(VisitForEffect(expr->left())); |
| // Visit the right subexpression in the same AST context as the entire |
| // expression. |
| @@ -8449,7 +8501,7 @@ void HGraphBuilder::VisitComma(BinaryOperation* expr) { |
| } |
| -void HGraphBuilder::VisitLogicalExpression(BinaryOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitLogicalExpression(BinaryOperation* expr) { |
| bool is_logical_and = expr->op() == Token::AND; |
| if (ast_context()->IsTest()) { |
| TestContext* context = TestContext::cast(ast_context()); |
| @@ -8539,7 +8591,7 @@ void HGraphBuilder::VisitLogicalExpression(BinaryOperation* expr) { |
| } |
| -void HGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) { |
| CHECK_ALIVE(VisitForValue(expr->left())); |
| CHECK_ALIVE(VisitForValue(expr->right())); |
| HValue* right = Pop(); |
| @@ -8550,7 +8602,7 @@ void HGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) { |
| } |
| -Representation HGraphBuilder::ToRepresentation(TypeInfo info) { |
| +Representation HOptimizedGraphBuilder::ToRepresentation(TypeInfo info) { |
| if (info.IsUninitialized()) return Representation::None(); |
| if (info.IsSmi()) return Representation::Integer32(); |
| if (info.IsInteger32()) return Representation::Integer32(); |
| @@ -8560,9 +8612,9 @@ Representation HGraphBuilder::ToRepresentation(TypeInfo info) { |
| } |
| -void HGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, |
| - HTypeof* typeof_expr, |
| - Handle<String> check) { |
| +void HOptimizedGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* expr, |
| + HTypeof* typeof_expr, |
| + Handle<String> check) { |
| // Note: The HTypeof itself is removed during canonicalization, if possible. |
| HValue* value = typeof_expr->value(); |
| HTypeofIsAndBranch* instr = new(zone()) HTypeofIsAndBranch(value, check); |
| @@ -8632,7 +8684,7 @@ static bool IsLiteralCompareBool(HValue* left, |
| } |
| -void HGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
| +void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -8785,9 +8837,9 @@ void HGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
| } |
| -void HGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, |
| - HValue* value, |
| - NilValue nil) { |
| +void HOptimizedGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, |
| + HValue* value, |
| + NilValue nil) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -8799,7 +8851,7 @@ void HGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, |
| } |
| -HInstruction* HGraphBuilder::BuildThisFunction() { |
| +HInstruction* HOptimizedGraphBuilder::BuildThisFunction() { |
| // If we share optimized code between different closures, the |
| // this-function is not a constant, except inside an inlined body. |
| if (function_state()->outer() != NULL) { |
| @@ -8812,7 +8864,7 @@ HInstruction* HGraphBuilder::BuildThisFunction() { |
| } |
| -void HGraphBuilder::VisitThisFunction(ThisFunction* expr) { |
| +void HOptimizedGraphBuilder::VisitThisFunction(ThisFunction* expr) { |
| ASSERT(!HasStackOverflow()); |
| ASSERT(current_block() != NULL); |
| ASSERT(current_block()->HasPredecessor()); |
| @@ -8821,7 +8873,8 @@ void HGraphBuilder::VisitThisFunction(ThisFunction* expr) { |
| } |
| -void HGraphBuilder::VisitDeclarations(ZoneList<Declaration*>* declarations) { |
| +void HOptimizedGraphBuilder::VisitDeclarations( |
| + ZoneList<Declaration*>* declarations) { |
| ASSERT(globals_.is_empty()); |
| AstVisitor::VisitDeclarations(declarations); |
| if (!globals_.is_empty()) { |
| @@ -8839,7 +8892,8 @@ void HGraphBuilder::VisitDeclarations(ZoneList<Declaration*>* declarations) { |
| } |
| -void HGraphBuilder::VisitVariableDeclaration(VariableDeclaration* declaration) { |
| +void HOptimizedGraphBuilder::VisitVariableDeclaration( |
| + VariableDeclaration* declaration) { |
| VariableProxy* proxy = declaration->proxy(); |
| VariableMode mode = declaration->mode(); |
| Variable* variable = proxy->var(); |
| @@ -8876,7 +8930,8 @@ void HGraphBuilder::VisitVariableDeclaration(VariableDeclaration* declaration) { |
| } |
| -void HGraphBuilder::VisitFunctionDeclaration(FunctionDeclaration* declaration) { |
| +void HOptimizedGraphBuilder::VisitFunctionDeclaration( |
| + FunctionDeclaration* declaration) { |
| VariableProxy* proxy = declaration->proxy(); |
| Variable* variable = proxy->var(); |
| switch (variable->location()) { |
| @@ -8914,49 +8969,52 @@ void HGraphBuilder::VisitFunctionDeclaration(FunctionDeclaration* declaration) { |
| } |
| -void HGraphBuilder::VisitModuleDeclaration(ModuleDeclaration* declaration) { |
| +void HOptimizedGraphBuilder::VisitModuleDeclaration( |
| + ModuleDeclaration* declaration) { |
| UNREACHABLE(); |
| } |
| -void HGraphBuilder::VisitImportDeclaration(ImportDeclaration* declaration) { |
| +void HOptimizedGraphBuilder::VisitImportDeclaration( |
| + ImportDeclaration* declaration) { |
| UNREACHABLE(); |
| } |
| -void HGraphBuilder::VisitExportDeclaration(ExportDeclaration* declaration) { |
| +void HOptimizedGraphBuilder::VisitExportDeclaration( |
| + ExportDeclaration* declaration) { |
| UNREACHABLE(); |
| } |
| -void HGraphBuilder::VisitModuleLiteral(ModuleLiteral* module) { |
| +void HOptimizedGraphBuilder::VisitModuleLiteral(ModuleLiteral* module) { |
| UNREACHABLE(); |
| } |
| -void HGraphBuilder::VisitModuleVariable(ModuleVariable* module) { |
| +void HOptimizedGraphBuilder::VisitModuleVariable(ModuleVariable* module) { |
| UNREACHABLE(); |
| } |
| -void HGraphBuilder::VisitModulePath(ModulePath* module) { |
| +void HOptimizedGraphBuilder::VisitModulePath(ModulePath* module) { |
| UNREACHABLE(); |
| } |
| -void HGraphBuilder::VisitModuleUrl(ModuleUrl* module) { |
| +void HOptimizedGraphBuilder::VisitModuleUrl(ModuleUrl* module) { |
| UNREACHABLE(); |
| } |
| -void HGraphBuilder::VisitModuleStatement(ModuleStatement* stmt) { |
| +void HOptimizedGraphBuilder::VisitModuleStatement(ModuleStatement* stmt) { |
| UNREACHABLE(); |
| } |
| // Generators for inline runtime functions. |
| // Support for types. |
| -void HGraphBuilder::GenerateIsSmi(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateIsSmi(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 1); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| HValue* value = Pop(); |
| @@ -8965,7 +9023,7 @@ void HGraphBuilder::GenerateIsSmi(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateIsSpecObject(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateIsSpecObject(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 1); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| HValue* value = Pop(); |
| @@ -8977,7 +9035,7 @@ void HGraphBuilder::GenerateIsSpecObject(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateIsFunction(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateIsFunction(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 1); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| HValue* value = Pop(); |
| @@ -8987,7 +9045,7 @@ void HGraphBuilder::GenerateIsFunction(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateHasCachedArrayIndex(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateHasCachedArrayIndex(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 1); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| HValue* value = Pop(); |
| @@ -8997,7 +9055,7 @@ void HGraphBuilder::GenerateHasCachedArrayIndex(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateIsArray(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateIsArray(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 1); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| HValue* value = Pop(); |
| @@ -9007,7 +9065,7 @@ void HGraphBuilder::GenerateIsArray(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateIsRegExp(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateIsRegExp(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 1); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| HValue* value = Pop(); |
| @@ -9017,7 +9075,7 @@ void HGraphBuilder::GenerateIsRegExp(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateIsObject(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateIsObject(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 1); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| HValue* value = Pop(); |
| @@ -9026,12 +9084,12 @@ void HGraphBuilder::GenerateIsObject(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateIsNonNegativeSmi(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateIsNonNegativeSmi(CallRuntime* call) { |
| return Bailout("inlined runtime function: IsNonNegativeSmi"); |
| } |
| -void HGraphBuilder::GenerateIsUndetectableObject(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateIsUndetectableObject(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 1); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| HValue* value = Pop(); |
| @@ -9041,7 +9099,7 @@ void HGraphBuilder::GenerateIsUndetectableObject(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateIsStringWrapperSafeForDefaultValueOf( |
| +void HOptimizedGraphBuilder::GenerateIsStringWrapperSafeForDefaultValueOf( |
| CallRuntime* call) { |
| return Bailout( |
| "inlined runtime function: IsStringWrapperSafeForDefaultValueOf"); |
| @@ -9049,7 +9107,7 @@ void HGraphBuilder::GenerateIsStringWrapperSafeForDefaultValueOf( |
| // Support for construct call checks. |
| -void HGraphBuilder::GenerateIsConstructCall(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateIsConstructCall(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 0); |
| if (function_state()->outer() != NULL) { |
| // We are generating graph for inlined function. |
| @@ -9065,7 +9123,7 @@ void HGraphBuilder::GenerateIsConstructCall(CallRuntime* call) { |
| // Support for arguments.length and arguments[?]. |
| -void HGraphBuilder::GenerateArgumentsLength(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateArgumentsLength(CallRuntime* call) { |
| // Our implementation of arguments (based on this stack frame or an |
| // adapter below it) does not work for inlined functions. This runtime |
| // function is blacklisted by AstNode::IsInlineable. |
| @@ -9078,7 +9136,7 @@ void HGraphBuilder::GenerateArgumentsLength(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateArguments(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateArguments(CallRuntime* call) { |
| // Our implementation of arguments (based on this stack frame or an |
| // adapter below it) does not work for inlined functions. This runtime |
| // function is blacklisted by AstNode::IsInlineable. |
| @@ -9098,14 +9156,14 @@ void HGraphBuilder::GenerateArguments(CallRuntime* call) { |
| // Support for accessing the class and value fields of an object. |
| -void HGraphBuilder::GenerateClassOf(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateClassOf(CallRuntime* call) { |
| // The special form detected by IsClassOfTest is detected before we get here |
| // and does not cause a bailout. |
| return Bailout("inlined runtime function: ClassOf"); |
| } |
| -void HGraphBuilder::GenerateValueOf(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateValueOf(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 1); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| HValue* value = Pop(); |
| @@ -9114,7 +9172,7 @@ void HGraphBuilder::GenerateValueOf(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateDateField(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateDateField(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 2); |
| ASSERT_NE(NULL, call->arguments()->at(1)->AsLiteral()); |
| Smi* index = Smi::cast(*(call->arguments()->at(1)->AsLiteral()->handle())); |
| @@ -9125,7 +9183,7 @@ void HGraphBuilder::GenerateDateField(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateSetValueOf(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateSetValueOf(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 2); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
| @@ -9168,7 +9226,7 @@ void HGraphBuilder::GenerateSetValueOf(CallRuntime* call) { |
| // Fast support for charCodeAt(n). |
| -void HGraphBuilder::GenerateStringCharCodeAt(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateStringCharCodeAt(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 2); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
| @@ -9181,7 +9239,7 @@ void HGraphBuilder::GenerateStringCharCodeAt(CallRuntime* call) { |
| // Fast support for string.charAt(n) and string[n]. |
| -void HGraphBuilder::GenerateStringCharFromCode(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateStringCharFromCode(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 1); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| HValue* char_code = Pop(); |
| @@ -9193,7 +9251,7 @@ void HGraphBuilder::GenerateStringCharFromCode(CallRuntime* call) { |
| // Fast support for string.charAt(n) and string[n]. |
| -void HGraphBuilder::GenerateStringCharAt(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateStringCharAt(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 2); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
| @@ -9209,7 +9267,7 @@ void HGraphBuilder::GenerateStringCharAt(CallRuntime* call) { |
| // Fast support for object equality testing. |
| -void HGraphBuilder::GenerateObjectEquals(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateObjectEquals(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 2); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
| @@ -9221,14 +9279,14 @@ void HGraphBuilder::GenerateObjectEquals(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateLog(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateLog(CallRuntime* call) { |
| // %_Log is ignored in optimized code. |
| return ast_context()->ReturnValue(graph()->GetConstantUndefined()); |
| } |
| // Fast support for Math.random(). |
| -void HGraphBuilder::GenerateRandomHeapNumber(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateRandomHeapNumber(CallRuntime* call) { |
| HValue* context = environment()->LookupContext(); |
| HGlobalObject* global_object = new(zone()) HGlobalObject(context); |
| AddInstruction(global_object); |
| @@ -9238,7 +9296,7 @@ void HGraphBuilder::GenerateRandomHeapNumber(CallRuntime* call) { |
| // Fast support for StringAdd. |
| -void HGraphBuilder::GenerateStringAdd(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateStringAdd(CallRuntime* call) { |
| ASSERT_EQ(2, call->arguments()->length()); |
| CHECK_ALIVE(VisitArgumentList(call->arguments())); |
| HValue* context = environment()->LookupContext(); |
| @@ -9249,7 +9307,7 @@ void HGraphBuilder::GenerateStringAdd(CallRuntime* call) { |
| // Fast support for SubString. |
| -void HGraphBuilder::GenerateSubString(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateSubString(CallRuntime* call) { |
| ASSERT_EQ(3, call->arguments()->length()); |
| CHECK_ALIVE(VisitArgumentList(call->arguments())); |
| HValue* context = environment()->LookupContext(); |
| @@ -9260,7 +9318,7 @@ void HGraphBuilder::GenerateSubString(CallRuntime* call) { |
| // Fast support for StringCompare. |
| -void HGraphBuilder::GenerateStringCompare(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateStringCompare(CallRuntime* call) { |
| ASSERT_EQ(2, call->arguments()->length()); |
| CHECK_ALIVE(VisitArgumentList(call->arguments())); |
| HValue* context = environment()->LookupContext(); |
| @@ -9272,7 +9330,7 @@ void HGraphBuilder::GenerateStringCompare(CallRuntime* call) { |
| // Support for direct calls from JavaScript to native RegExp code. |
| -void HGraphBuilder::GenerateRegExpExec(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateRegExpExec(CallRuntime* call) { |
| ASSERT_EQ(4, call->arguments()->length()); |
| CHECK_ALIVE(VisitArgumentList(call->arguments())); |
| HValue* context = environment()->LookupContext(); |
| @@ -9283,7 +9341,7 @@ void HGraphBuilder::GenerateRegExpExec(CallRuntime* call) { |
| // Construct a RegExp exec result with two in-object properties. |
| -void HGraphBuilder::GenerateRegExpConstructResult(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateRegExpConstructResult(CallRuntime* call) { |
| ASSERT_EQ(3, call->arguments()->length()); |
| CHECK_ALIVE(VisitArgumentList(call->arguments())); |
| HValue* context = environment()->LookupContext(); |
| @@ -9295,13 +9353,13 @@ void HGraphBuilder::GenerateRegExpConstructResult(CallRuntime* call) { |
| // Support for fast native caches. |
| -void HGraphBuilder::GenerateGetFromCache(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateGetFromCache(CallRuntime* call) { |
| return Bailout("inlined runtime function: GetFromCache"); |
| } |
| // Fast support for number to string. |
| -void HGraphBuilder::GenerateNumberToString(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateNumberToString(CallRuntime* call) { |
| ASSERT_EQ(1, call->arguments()->length()); |
| CHECK_ALIVE(VisitArgumentList(call->arguments())); |
| HValue* context = environment()->LookupContext(); |
| @@ -9313,7 +9371,7 @@ void HGraphBuilder::GenerateNumberToString(CallRuntime* call) { |
| // Fast call for custom callbacks. |
| -void HGraphBuilder::GenerateCallFunction(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateCallFunction(CallRuntime* call) { |
| // 1 ~ The function to call is not itself an argument to the call. |
| int arg_count = call->arguments()->length() - 1; |
| ASSERT(arg_count >= 1); // There's always at least a receiver. |
| @@ -9357,7 +9415,7 @@ void HGraphBuilder::GenerateCallFunction(CallRuntime* call) { |
| // Fast call to math functions. |
| -void HGraphBuilder::GenerateMathPow(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateMathPow(CallRuntime* call) { |
| ASSERT_EQ(2, call->arguments()->length()); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); |
| @@ -9368,7 +9426,7 @@ void HGraphBuilder::GenerateMathPow(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateMathSin(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateMathSin(CallRuntime* call) { |
| ASSERT_EQ(1, call->arguments()->length()); |
| CHECK_ALIVE(VisitArgumentList(call->arguments())); |
| HValue* context = environment()->LookupContext(); |
| @@ -9380,7 +9438,7 @@ void HGraphBuilder::GenerateMathSin(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateMathCos(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateMathCos(CallRuntime* call) { |
| ASSERT_EQ(1, call->arguments()->length()); |
| CHECK_ALIVE(VisitArgumentList(call->arguments())); |
| HValue* context = environment()->LookupContext(); |
| @@ -9392,7 +9450,7 @@ void HGraphBuilder::GenerateMathCos(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateMathTan(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateMathTan(CallRuntime* call) { |
| ASSERT_EQ(1, call->arguments()->length()); |
| CHECK_ALIVE(VisitArgumentList(call->arguments())); |
| HValue* context = environment()->LookupContext(); |
| @@ -9404,7 +9462,7 @@ void HGraphBuilder::GenerateMathTan(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateMathLog(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateMathLog(CallRuntime* call) { |
| ASSERT_EQ(1, call->arguments()->length()); |
| CHECK_ALIVE(VisitArgumentList(call->arguments())); |
| HValue* context = environment()->LookupContext(); |
| @@ -9416,18 +9474,18 @@ void HGraphBuilder::GenerateMathLog(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateMathSqrt(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateMathSqrt(CallRuntime* call) { |
| return Bailout("inlined runtime function: MathSqrt"); |
| } |
| // Check whether two RegExps are equivalent |
| -void HGraphBuilder::GenerateIsRegExpEquivalent(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateIsRegExpEquivalent(CallRuntime* call) { |
| return Bailout("inlined runtime function: IsRegExpEquivalent"); |
| } |
| -void HGraphBuilder::GenerateGetCachedArrayIndex(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateGetCachedArrayIndex(CallRuntime* call) { |
| ASSERT(call->arguments()->length() == 1); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| HValue* value = Pop(); |
| @@ -9436,7 +9494,7 @@ void HGraphBuilder::GenerateGetCachedArrayIndex(CallRuntime* call) { |
| } |
| -void HGraphBuilder::GenerateFastAsciiArrayJoin(CallRuntime* call) { |
| +void HOptimizedGraphBuilder::GenerateFastAsciiArrayJoin(CallRuntime* call) { |
| return Bailout("inlined runtime function: FastAsciiArrayJoin"); |
| } |
| @@ -9466,6 +9524,23 @@ HEnvironment::HEnvironment(HEnvironment* outer, |
| } |
| +HEnvironment::HEnvironment(Zone* zone) |
| + : values_(0, zone), |
| + assigned_variables_(0, zone), |
| + frame_type_(STUB), |
| + parameter_count_(0), |
| + specials_count_(0), |
| + local_count_(0), |
| + outer_(NULL), |
| + entry_(NULL), |
| + pop_count_(0), |
| + push_count_(0), |
| + ast_id_(BailoutId::None()), |
| + zone_(zone) { |
| + Initialize(0, 0, 0); |
| +} |
| + |
| + |
| HEnvironment::HEnvironment(const HEnvironment* other, Zone* zone) |
| : values_(0, zone), |
| assigned_variables_(0, zone), |
| @@ -9733,11 +9808,16 @@ void HEnvironment::PrintToStd() { |
| } |
| -void HTracer::TraceCompilation(FunctionLiteral* function) { |
| +void HTracer::TraceCompilation(CompilationInfo* info) { |
| Tag tag(this, "compilation"); |
| - Handle<String> name = function->debug_name(); |
| - PrintStringProperty("name", *name->ToCString()); |
| - PrintStringProperty("method", *name->ToCString()); |
| + if (info->IsOptimizing()) { |
| + Handle<String> name = info->function()->debug_name(); |
| + PrintStringProperty("name", *name->ToCString()); |
| + PrintStringProperty("method", *name->ToCString()); |
| + } else { |
| + PrintStringProperty("name", "stub"); |
|
Jakob Kummerow
2012/11/28 16:28:22
Can we print info->stub()->major_key() or somethin
danno
2012/11/30 16:23:24
Done.
|
| + PrintStringProperty("method", "stub"); |
| + } |
| PrintLongProperty("date", static_cast<int64_t>(OS::TimeCurrentMillis())); |
| } |