| 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); | 
|  |