Chromium Code Reviews| Index: src/compiler/ast-graph-builder.cc |
| diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc |
| index af0b4cf554e0d6404bf39129051d45690451d36e..ede7bf924a83fe5779ad1a51dfc78131c73d2835 100644 |
| --- a/src/compiler/ast-graph-builder.cc |
| +++ b/src/compiler/ast-graph-builder.cc |
| @@ -464,6 +464,16 @@ Node* AstGraphBuilder::GetFunctionClosure() { |
| } |
| +Node* AstGraphBuilder::GetFeedbackVector() { |
| + if (!feedback_vector_.is_set()) { |
| + Node* vector = |
| + jsgraph()->Constant(handle(info()->shared_info()->feedback_vector())); |
| + feedback_vector_.set(vector); |
| + } |
| + return feedback_vector_.get(); |
| +} |
| + |
| + |
| void AstGraphBuilder::CreateFunctionContext(bool constant_context) { |
| function_context_.set(constant_context |
| ? jsgraph()->HeapConstant(info()->context()) |
| @@ -1651,9 +1661,10 @@ void AstGraphBuilder::VisitConditional(Conditional* expr) { |
| void AstGraphBuilder::VisitVariableProxy(VariableProxy* expr) { |
| - VectorSlotPair pair = CreateVectorSlotPair(expr->VariableFeedbackSlot()); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(expr->VariableFeedbackSlot()); |
| FrameStateBeforeAndAfter states(this, BeforeId(expr)); |
| - Node* value = BuildVariableLoad(expr->var(), expr->id(), states, pair, |
| + Node* value = BuildVariableLoad(expr->var(), expr->id(), states, slot, |
| ast_context()->GetStateCombine()); |
| ast_context()->ProduceValue(value); |
| } |
| @@ -2069,21 +2080,21 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) { |
| switch (assign_type) { |
| case VARIABLE: { |
| VariableProxy* proxy = expr->target()->AsVariableProxy(); |
| - VectorSlotPair pair = |
| - CreateVectorSlotPair(proxy->VariableFeedbackSlot()); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(proxy->VariableFeedbackSlot()); |
| FrameStateBeforeAndAfter states(this, BeforeId(proxy)); |
| old_value = |
| - BuildVariableLoad(proxy->var(), expr->target()->id(), states, pair, |
| + BuildVariableLoad(proxy->var(), expr->target()->id(), states, slot, |
| OutputFrameStateCombine::Push()); |
| break; |
| } |
| case NAMED_PROPERTY: { |
| Node* object = environment()->Top(); |
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| - VectorSlotPair pair = |
| - CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(property->PropertyFeedbackSlot()); |
| FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| - old_value = BuildNamedLoad(object, name, pair); |
| + old_value = BuildNamedLoad(object, GetFeedbackVector(), name, slot); |
| states.AddToNode(old_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| break; |
| @@ -2091,10 +2102,10 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) { |
| case KEYED_PROPERTY: { |
| Node* key = environment()->Top(); |
| Node* object = environment()->Peek(1); |
| - VectorSlotPair pair = |
| - CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(property->PropertyFeedbackSlot()); |
| FrameStateBeforeAndAfter states(this, property->key()->id()); |
| - old_value = BuildKeyedLoad(object, key, pair); |
| + old_value = BuildKeyedLoad(object, key, GetFeedbackVector(), slot); |
| states.AddToNode(old_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| break; |
| @@ -2103,10 +2114,10 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) { |
| Node* home_object = environment()->Top(); |
| Node* receiver = environment()->Peek(1); |
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| - VectorSlotPair pair = |
| - CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(property->PropertyFeedbackSlot()); |
| FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| - old_value = BuildNamedSuperLoad(receiver, home_object, name, pair); |
| + old_value = BuildNamedSuperLoad(receiver, home_object, name, slot); |
| states.AddToNode(old_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| break; |
| @@ -2115,10 +2126,10 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) { |
| Node* key = environment()->Top(); |
| Node* home_object = environment()->Peek(1); |
| Node* receiver = environment()->Peek(2); |
| - VectorSlotPair pair = |
| - CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(property->PropertyFeedbackSlot()); |
| FrameStateBeforeAndAfter states(this, property->key()->id()); |
| - old_value = BuildKeyedSuperLoad(receiver, home_object, key, pair); |
| + old_value = BuildKeyedSuperLoad(receiver, home_object, key, slot); |
| states.AddToNode(old_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| break; |
| @@ -2218,7 +2229,8 @@ void AstGraphBuilder::VisitThrow(Throw* expr) { |
| void AstGraphBuilder::VisitProperty(Property* expr) { |
| Node* value = nullptr; |
| LhsKind property_kind = Property::GetAssignType(expr); |
| - VectorSlotPair pair = CreateVectorSlotPair(expr->PropertyFeedbackSlot()); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(expr->PropertyFeedbackSlot()); |
| switch (property_kind) { |
| case VARIABLE: |
| UNREACHABLE(); |
| @@ -2228,7 +2240,7 @@ void AstGraphBuilder::VisitProperty(Property* expr) { |
| FrameStateBeforeAndAfter states(this, expr->obj()->id()); |
| Node* object = environment()->Pop(); |
| Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName(); |
| - value = BuildNamedLoad(object, name, pair); |
| + value = BuildNamedLoad(object, GetFeedbackVector(), name, slot); |
| states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); |
| break; |
| } |
| @@ -2238,7 +2250,7 @@ void AstGraphBuilder::VisitProperty(Property* expr) { |
| FrameStateBeforeAndAfter states(this, expr->key()->id()); |
| Node* key = environment()->Pop(); |
| Node* object = environment()->Pop(); |
| - value = BuildKeyedLoad(object, key, pair); |
| + value = BuildKeyedLoad(object, key, GetFeedbackVector(), slot); |
| states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); |
| break; |
| } |
| @@ -2249,7 +2261,7 @@ void AstGraphBuilder::VisitProperty(Property* expr) { |
| Node* home_object = environment()->Pop(); |
| Node* receiver = environment()->Pop(); |
| Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName(); |
| - value = BuildNamedSuperLoad(receiver, home_object, name, pair); |
| + value = BuildNamedSuperLoad(receiver, home_object, name, slot); |
| states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); |
| break; |
| } |
| @@ -2261,7 +2273,7 @@ void AstGraphBuilder::VisitProperty(Property* expr) { |
| Node* key = environment()->Pop(); |
| Node* home_object = environment()->Pop(); |
| Node* receiver = environment()->Pop(); |
| - value = BuildKeyedSuperLoad(receiver, home_object, key, pair); |
| + value = BuildKeyedSuperLoad(receiver, home_object, key, slot); |
| states.AddToNode(value, expr->id(), ast_context()->GetStateCombine()); |
| break; |
| } |
| @@ -2283,11 +2295,12 @@ void AstGraphBuilder::VisitCall(Call* expr) { |
| switch (call_type) { |
| case Call::GLOBAL_CALL: { |
| VariableProxy* proxy = callee->AsVariableProxy(); |
| - VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot()); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(proxy->VariableFeedbackSlot()); |
| FrameStateBeforeAndAfter states(this, BeforeId(proxy)); |
| callee_value = |
| BuildVariableLoad(proxy->var(), expr->expression()->id(), states, |
| - pair, OutputFrameStateCombine::Push()); |
| + slot, OutputFrameStateCombine::Push()); |
| receiver_value = jsgraph()->UndefinedConstant(); |
| break; |
| } |
| @@ -2307,8 +2320,8 @@ void AstGraphBuilder::VisitCall(Call* expr) { |
| } |
| case Call::PROPERTY_CALL: { |
| Property* property = callee->AsProperty(); |
| - VectorSlotPair pair = |
| - CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(property->PropertyFeedbackSlot()); |
| if (!property->IsSuperAccess()) { |
| VisitForValue(property->obj()); |
| Node* object = environment()->Top(); |
| @@ -2316,14 +2329,15 @@ void AstGraphBuilder::VisitCall(Call* expr) { |
| if (property->key()->IsPropertyName()) { |
| FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| - callee_value = BuildNamedLoad(object, name, pair); |
| + callee_value = |
| + BuildNamedLoad(object, GetFeedbackVector(), name, slot); |
| states.AddToNode(callee_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| } else { |
| VisitForValue(property->key()); |
| FrameStateBeforeAndAfter states(this, property->key()->id()); |
| Node* key = environment()->Pop(); |
| - callee_value = BuildKeyedLoad(object, key, pair); |
| + callee_value = BuildKeyedLoad(object, key, GetFeedbackVector(), slot); |
| states.AddToNode(callee_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| } |
| @@ -2344,7 +2358,7 @@ void AstGraphBuilder::VisitCall(Call* expr) { |
| FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| callee_value = |
| - BuildNamedSuperLoad(receiver_value, home_object, name, pair); |
| + BuildNamedSuperLoad(receiver_value, home_object, name, slot); |
| states.AddToNode(callee_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| @@ -2353,7 +2367,7 @@ void AstGraphBuilder::VisitCall(Call* expr) { |
| FrameStateBeforeAndAfter states(this, property->key()->id()); |
| Node* key = environment()->Pop(); |
| callee_value = |
| - BuildKeyedSuperLoad(receiver_value, home_object, key, pair); |
| + BuildKeyedSuperLoad(receiver_value, home_object, key, slot); |
| states.AddToNode(callee_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| } |
| @@ -2462,10 +2476,12 @@ void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) { |
| // before arguments are being evaluated. |
| CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; |
| Node* receiver_value = BuildLoadBuiltinsObject(); |
| - VectorSlotPair pair = CreateVectorSlotPair(expr->CallRuntimeFeedbackSlot()); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(expr->CallRuntimeFeedbackSlot()); |
| // TODO(jarin): bailout ids for runtime calls. |
| FrameStateBeforeAndAfter states(this, BailoutId::None()); |
| - Node* callee_value = BuildNamedLoad(receiver_value, name, pair); |
| + Node* callee_value = |
| + BuildNamedLoad(receiver_value, GetFeedbackVector(), name, slot); |
| states.AddToNode(callee_value, BailoutId::None(), |
| OutputFrameStateCombine::Push()); |
| environment()->Push(callee_value); |
| @@ -2540,11 +2556,12 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| switch (assign_type) { |
| case VARIABLE: { |
| VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
| - VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot()); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(proxy->VariableFeedbackSlot()); |
| FrameStateBeforeAndAfter states(this, BeforeId(proxy)); |
| old_value = |
| BuildVariableLoad(proxy->var(), expr->expression()->id(), states, |
| - pair, OutputFrameStateCombine::Push()); |
| + slot, OutputFrameStateCombine::Push()); |
| stack_depth = 0; |
| break; |
| } |
| @@ -2553,9 +2570,9 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| FrameStateBeforeAndAfter states(this, property->obj()->id()); |
| Node* object = environment()->Top(); |
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| - VectorSlotPair pair = |
| - CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| - old_value = BuildNamedLoad(object, name, pair); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(property->PropertyFeedbackSlot()); |
| + old_value = BuildNamedLoad(object, GetFeedbackVector(), name, slot); |
| states.AddToNode(old_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| stack_depth = 1; |
| @@ -2567,9 +2584,9 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| FrameStateBeforeAndAfter states(this, property->key()->id()); |
| Node* key = environment()->Top(); |
| Node* object = environment()->Peek(1); |
| - VectorSlotPair pair = |
| - CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| - old_value = BuildKeyedLoad(object, key, pair); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(property->PropertyFeedbackSlot()); |
| + old_value = BuildKeyedLoad(object, key, GetFeedbackVector(), slot); |
| states.AddToNode(old_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| stack_depth = 2; |
| @@ -2582,9 +2599,9 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| Node* home_object = environment()->Top(); |
| Node* receiver = environment()->Peek(1); |
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| - VectorSlotPair pair = |
| - CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| - old_value = BuildNamedSuperLoad(receiver, home_object, name, pair); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(property->PropertyFeedbackSlot()); |
| + old_value = BuildNamedSuperLoad(receiver, home_object, name, slot); |
| states.AddToNode(old_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| stack_depth = 2; |
| @@ -2598,9 +2615,9 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| Node* key = environment()->Top(); |
| Node* home_object = environment()->Peek(1); |
| Node* receiver = environment()->Peek(2); |
| - VectorSlotPair pair = |
| - CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| - old_value = BuildKeyedSuperLoad(receiver, home_object, key, pair); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(property->PropertyFeedbackSlot()); |
| + old_value = BuildKeyedSuperLoad(receiver, home_object, key, slot); |
| states.AddToNode(old_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| stack_depth = 3; |
| @@ -2871,10 +2888,11 @@ void AstGraphBuilder::VisitTypeof(UnaryOperation* expr) { |
| // Typeof does not throw a reference error on global variables, hence we |
| // perform a non-contextual load in case the operand is a variable proxy. |
| VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
| - VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot()); |
| + ResolvedFeedbackSlot slot = |
| + CreateResolvedFeedbackSlot(proxy->VariableFeedbackSlot()); |
| FrameStateBeforeAndAfter states(this, BeforeId(proxy)); |
| operand = |
| - BuildVariableLoad(proxy->var(), expr->expression()->id(), states, pair, |
| + BuildVariableLoad(proxy->var(), expr->expression()->id(), states, slot, |
| OutputFrameStateCombine::Push(), NOT_CONTEXTUAL); |
| } else { |
| VisitForValue(expr->expression()); |
| @@ -2935,9 +2953,10 @@ LanguageMode AstGraphBuilder::language_mode() const { |
| } |
| -VectorSlotPair AstGraphBuilder::CreateVectorSlotPair( |
| +ResolvedFeedbackSlot AstGraphBuilder::CreateResolvedFeedbackSlot( |
| FeedbackVectorICSlot slot) const { |
| - return VectorSlotPair(handle(info()->shared_info()->feedback_vector()), slot); |
| + return ResolvedFeedbackSlot(handle(info()->shared_info()->feedback_vector()), |
| + slot); |
| } |
| @@ -3171,7 +3190,7 @@ Node* AstGraphBuilder::BuildThrowIfStaticPrototype(Node* name, |
| Node* AstGraphBuilder::BuildVariableLoad(Variable* variable, |
| BailoutId bailout_id, |
| FrameStateBeforeAndAfter& states, |
| - const VectorSlotPair& feedback, |
| + const ResolvedFeedbackSlot& feedback, |
| OutputFrameStateCombine combine, |
| ContextualMode contextual_mode) { |
| Node* the_hole = jsgraph()->TheHoleConstant(); |
| @@ -3181,7 +3200,8 @@ Node* AstGraphBuilder::BuildVariableLoad(Variable* variable, |
| // Global var, const, or let variable. |
| Node* global = BuildLoadGlobalObject(); |
| Handle<Name> name = variable->name(); |
| - Node* value = BuildNamedLoad(global, name, feedback, contextual_mode); |
| + Node* value = BuildNamedLoad(global, GetFeedbackVector(), name, feedback, |
| + contextual_mode); |
| states.AddToNode(value, bailout_id, combine); |
| return value; |
| } |
| @@ -3235,7 +3255,7 @@ Node* AstGraphBuilder::BuildVariableLoad(Variable* variable, |
| uint32_t check_bitset = ComputeBitsetForDynamicGlobal(variable); |
| const Operator* op = javascript()->LoadDynamicGlobal( |
| name, check_bitset, feedback, contextual_mode); |
| - value = NewNode(op, current_context()); |
| + value = NewNode(op, GetFeedbackVector(), current_context()); |
| states.AddToNode(value, bailout_id, combine); |
| } else if (mode == DYNAMIC_LOCAL) { |
| Variable* local = variable->local_if_not_shadowed(); |
| @@ -3259,7 +3279,7 @@ Node* AstGraphBuilder::BuildVariableLoad(Variable* variable, |
| uint32_t check_bitset = DynamicGlobalAccess::kFullCheckRequired; |
| const Operator* op = javascript()->LoadDynamicGlobal( |
| name, check_bitset, feedback, contextual_mode); |
| - value = NewNode(op, current_context()); |
| + value = NewNode(op, GetFeedbackVector(), current_context()); |
| states.AddToNode(value, bailout_id, combine); |
| } |
| return value; |
| @@ -3428,19 +3448,22 @@ static inline Node* Record(JSTypeFeedbackTable* js_type_feedback, Node* node, |
| } |
| -Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key, |
| - const VectorSlotPair& feedback) { |
| +Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key, Node* vector, |
|
Michael Starzinger
2015/06/09 13:23:30
nit: Instead of passing the vector as an argument,
mvstanton
2015/06/09 15:21:26
Ah, good point. Done.
|
| + const ResolvedFeedbackSlot& feedback) { |
| const Operator* op = javascript()->LoadProperty(feedback); |
| - return Record(js_type_feedback_, NewNode(op, object, key), feedback.slot()); |
| + return Record(js_type_feedback_, NewNode(op, object, key, vector), |
| + feedback.slot()); |
| } |
| -Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name, |
| - const VectorSlotPair& feedback, |
| +Node* AstGraphBuilder::BuildNamedLoad(Node* object, Node* vector, |
|
Michael Starzinger
2015/06/09 13:23:30
nit: Likewise.
mvstanton
2015/06/09 15:21:26
Done.
|
| + Handle<Name> name, |
| + const ResolvedFeedbackSlot& feedback, |
| ContextualMode mode) { |
| const Operator* op = |
| javascript()->LoadNamed(MakeUnique(name), feedback, mode); |
| - return Record(js_type_feedback_, NewNode(op, object), feedback.slot()); |
| + return Record(js_type_feedback_, NewNode(op, object, vector), |
| + feedback.slot()); |
| } |
| @@ -3459,9 +3482,9 @@ Node* AstGraphBuilder::BuildNamedStore(Node* object, Handle<Name> name, |
| } |
| -Node* AstGraphBuilder::BuildNamedSuperLoad(Node* receiver, Node* home_object, |
| - Handle<Name> name, |
| - const VectorSlotPair& feedback) { |
| +Node* AstGraphBuilder::BuildNamedSuperLoad( |
| + Node* receiver, Node* home_object, Handle<Name> name, |
| + const ResolvedFeedbackSlot& feedback) { |
| Node* name_node = jsgraph()->Constant(name); |
| const Operator* op = javascript()->CallRuntime(Runtime::kLoadFromSuper, 3); |
| Node* value = NewNode(op, receiver, home_object, name_node); |
| @@ -3469,9 +3492,9 @@ Node* AstGraphBuilder::BuildNamedSuperLoad(Node* receiver, Node* home_object, |
| } |
| -Node* AstGraphBuilder::BuildKeyedSuperLoad(Node* receiver, Node* home_object, |
| - Node* key, |
| - const VectorSlotPair& feedback) { |
| +Node* AstGraphBuilder::BuildKeyedSuperLoad( |
| + Node* receiver, Node* home_object, Node* key, |
| + const ResolvedFeedbackSlot& feedback) { |
| const Operator* op = |
| javascript()->CallRuntime(Runtime::kLoadKeyedFromSuper, 3); |
| Node* value = NewNode(op, receiver, home_object, key); |