| Index: src/compiler/ast-graph-builder.cc
|
| diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
|
| index 7fddc4aafd549a0c00956dd7a891a14703333ee0..183e7148d1a5e9598f59fd8ab4066cb289b959fc 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,9 @@ void AstGraphBuilder::VisitConditional(Conditional* expr) {
|
|
|
|
|
| void AstGraphBuilder::VisitVariableProxy(VariableProxy* expr) {
|
| - VectorSlotPair pair = CreateVectorSlotPair(expr->VariableFeedbackSlot());
|
| + ResolvedFeedbackSlot slot = ResolveFeedbackSlot(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);
|
| }
|
| @@ -2071,21 +2081,21 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) {
|
| switch (assign_type) {
|
| case VARIABLE: {
|
| VariableProxy* proxy = expr->target()->AsVariableProxy();
|
| - VectorSlotPair pair =
|
| - CreateVectorSlotPair(proxy->VariableFeedbackSlot());
|
| + ResolvedFeedbackSlot slot =
|
| + ResolveFeedbackSlot(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 =
|
| + ResolveFeedbackSlot(property->PropertyFeedbackSlot());
|
| FrameStateBeforeAndAfter states(this, property->obj()->id());
|
| - old_value = BuildNamedLoad(object, name, pair);
|
| + old_value = BuildNamedLoad(object, name, slot);
|
| states.AddToNode(old_value, property->LoadId(),
|
| OutputFrameStateCombine::Push());
|
| break;
|
| @@ -2093,10 +2103,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 =
|
| + ResolveFeedbackSlot(property->PropertyFeedbackSlot());
|
| FrameStateBeforeAndAfter states(this, property->key()->id());
|
| - old_value = BuildKeyedLoad(object, key, pair);
|
| + old_value = BuildKeyedLoad(object, key, slot);
|
| states.AddToNode(old_value, property->LoadId(),
|
| OutputFrameStateCombine::Push());
|
| break;
|
| @@ -2105,10 +2115,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 =
|
| + ResolveFeedbackSlot(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;
|
| @@ -2117,10 +2127,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 =
|
| + ResolveFeedbackSlot(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;
|
| @@ -2220,7 +2230,7 @@ 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 = ResolveFeedbackSlot(expr->PropertyFeedbackSlot());
|
| switch (property_kind) {
|
| case VARIABLE:
|
| UNREACHABLE();
|
| @@ -2230,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, name, slot);
|
| states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
|
| break;
|
| }
|
| @@ -2240,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, slot);
|
| states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
|
| break;
|
| }
|
| @@ -2251,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;
|
| }
|
| @@ -2263,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;
|
| }
|
| @@ -2285,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 =
|
| + ResolveFeedbackSlot(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;
|
| }
|
| @@ -2309,8 +2320,8 @@ void AstGraphBuilder::VisitCall(Call* expr) {
|
| }
|
| case Call::PROPERTY_CALL: {
|
| Property* property = callee->AsProperty();
|
| - VectorSlotPair pair =
|
| - CreateVectorSlotPair(property->PropertyFeedbackSlot());
|
| + ResolvedFeedbackSlot slot =
|
| + ResolveFeedbackSlot(property->PropertyFeedbackSlot());
|
| if (!property->IsSuperAccess()) {
|
| VisitForValue(property->obj());
|
| Node* object = environment()->Top();
|
| @@ -2318,14 +2329,14 @@ 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, 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, slot);
|
| states.AddToNode(callee_value, property->LoadId(),
|
| OutputFrameStateCombine::Push());
|
| }
|
| @@ -2346,7 +2357,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());
|
|
|
| @@ -2355,7 +2366,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());
|
| }
|
| @@ -2464,10 +2475,11 @@ 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 =
|
| + ResolveFeedbackSlot(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, name, slot);
|
| states.AddToNode(callee_value, BailoutId::None(),
|
| OutputFrameStateCombine::Push());
|
| environment()->Push(callee_value);
|
| @@ -2542,11 +2554,12 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
|
| switch (assign_type) {
|
| case VARIABLE: {
|
| VariableProxy* proxy = expr->expression()->AsVariableProxy();
|
| - VectorSlotPair pair = CreateVectorSlotPair(proxy->VariableFeedbackSlot());
|
| + ResolvedFeedbackSlot slot =
|
| + ResolveFeedbackSlot(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;
|
| }
|
| @@ -2555,9 +2568,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 =
|
| + ResolveFeedbackSlot(property->PropertyFeedbackSlot());
|
| + old_value = BuildNamedLoad(object, name, slot);
|
| states.AddToNode(old_value, property->LoadId(),
|
| OutputFrameStateCombine::Push());
|
| stack_depth = 1;
|
| @@ -2569,9 +2582,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 =
|
| + ResolveFeedbackSlot(property->PropertyFeedbackSlot());
|
| + old_value = BuildKeyedLoad(object, key, slot);
|
| states.AddToNode(old_value, property->LoadId(),
|
| OutputFrameStateCombine::Push());
|
| stack_depth = 2;
|
| @@ -2584,9 +2597,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 =
|
| + ResolveFeedbackSlot(property->PropertyFeedbackSlot());
|
| + old_value = BuildNamedSuperLoad(receiver, home_object, name, slot);
|
| states.AddToNode(old_value, property->LoadId(),
|
| OutputFrameStateCombine::Push());
|
| stack_depth = 2;
|
| @@ -2600,9 +2613,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 =
|
| + ResolveFeedbackSlot(property->PropertyFeedbackSlot());
|
| + old_value = BuildKeyedSuperLoad(receiver, home_object, key, slot);
|
| states.AddToNode(old_value, property->LoadId(),
|
| OutputFrameStateCombine::Push());
|
| stack_depth = 3;
|
| @@ -2873,10 +2886,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 =
|
| + ResolveFeedbackSlot(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());
|
| @@ -2937,9 +2951,10 @@ LanguageMode AstGraphBuilder::language_mode() const {
|
| }
|
|
|
|
|
| -VectorSlotPair AstGraphBuilder::CreateVectorSlotPair(
|
| +ResolvedFeedbackSlot AstGraphBuilder::ResolveFeedbackSlot(
|
| FeedbackVectorICSlot slot) const {
|
| - return VectorSlotPair(handle(info()->shared_info()->feedback_vector()), slot);
|
| + return ResolvedFeedbackSlot(handle(info()->shared_info()->feedback_vector()),
|
| + slot);
|
| }
|
|
|
|
|
| @@ -3173,7 +3188,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();
|
| @@ -3237,7 +3252,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();
|
| @@ -3261,7 +3276,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;
|
| @@ -3431,18 +3446,20 @@ static inline Node* Record(JSTypeFeedbackTable* js_type_feedback, Node* node,
|
|
|
|
|
| Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key,
|
| - const VectorSlotPair& feedback) {
|
| + 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, GetFeedbackVector()), feedback.slot());
|
| }
|
|
|
|
|
| Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name,
|
| - const VectorSlotPair& feedback,
|
| + 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, GetFeedbackVector()),
|
| + feedback.slot());
|
| }
|
|
|
|
|
| @@ -3461,9 +3478,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);
|
| @@ -3471,9 +3488,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);
|
|
|