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 bc975b196519824436099ca73154972b193405f5..399b468d3f30a23b0263b07ff4b246cdc61c6566 100644 |
| --- a/src/compiler/ast-graph-builder.cc |
| +++ b/src/compiler/ast-graph-builder.cc |
| @@ -7,6 +7,7 @@ |
| #include "src/compiler.h" |
| #include "src/compiler/ast-loop-assignment-analyzer.h" |
| #include "src/compiler/control-builders.h" |
| +#include "src/compiler/js-type-feedback.h" |
| #include "src/compiler/linkage.h" |
| #include "src/compiler/liveness-analyzer.h" |
| #include "src/compiler/machine-operator.h" |
| @@ -381,7 +382,8 @@ class AstGraphBuilder::ControlScopeForFinally : public ControlScope { |
| AstGraphBuilder::AstGraphBuilder(Zone* local_zone, CompilationInfo* info, |
| - JSGraph* jsgraph, LoopAssignmentAnalysis* loop) |
| + JSGraph* jsgraph, LoopAssignmentAnalysis* loop, |
| + JSTypeFeedbackTable* js_type_feedback) |
| : local_zone_(local_zone), |
| info_(info), |
| jsgraph_(jsgraph), |
| @@ -397,7 +399,8 @@ AstGraphBuilder::AstGraphBuilder(Zone* local_zone, CompilationInfo* info, |
| loop_assignment_analysis_(loop), |
| state_values_cache_(jsgraph), |
| liveness_analyzer_(static_cast<size_t>(info->scope()->num_stack_slots()), |
| - local_zone) { |
| + local_zone), |
| + js_type_feedback_(js_type_feedback) { |
| InitializeAstVisitor(info->isolate(), local_zone); |
| } |
| @@ -1658,7 +1661,8 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
| VisitForValue(property->value()); |
| Node* value = environment()->Pop(); |
| Handle<Name> name = key->AsPropertyName(); |
| - Node* store = BuildNamedStore(literal, name, value); |
| + Node* store = |
| + BuildNamedStore(literal, name, value, TypeFeedbackId::None()); |
| PrepareFrameState(store, key->id()); |
| BuildSetHomeObject(value, literal, property->value()); |
| } else { |
| @@ -1833,7 +1837,8 @@ void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
| subexpr->id(), OutputFrameStateCombine::PokeAt(0)); |
| Node* value = environment()->Pop(); |
| Node* index = jsgraph()->Constant(i); |
| - Node* store = BuildKeyedStore(literal, index, value); |
| + Node* store = |
| + BuildKeyedStore(literal, index, value, TypeFeedbackId::None()); |
| PrepareFrameStateAfterAndBefore(store, expr->GetIdForElement(i), |
| OutputFrameStateCombine::Ignore(), |
| frame_state_before); |
| @@ -1865,7 +1870,8 @@ void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value, |
| Node* object = environment()->Pop(); |
| value = environment()->Pop(); |
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| - Node* store = BuildNamedStore(object, name, value); |
| + Node* store = |
| + BuildNamedStore(object, name, value, TypeFeedbackId::None()); |
| PrepareFrameState(store, bailout_id); |
| break; |
| } |
| @@ -1876,7 +1882,7 @@ void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value, |
| Node* key = environment()->Pop(); |
| Node* object = environment()->Pop(); |
| value = environment()->Pop(); |
| - Node* store = BuildKeyedStore(object, key, value); |
| + Node* store = BuildKeyedStore(object, key, value, TypeFeedbackId::None()); |
| // TODO(jarin) Provide a real frame state before. |
| PrepareFrameStateAfterAndBefore(store, bailout_id, |
| OutputFrameStateCombine::Ignore(), |
| @@ -1928,7 +1934,8 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) { |
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| VectorSlotPair pair = |
| CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| - old_value = BuildNamedLoad(object, name, pair); |
| + old_value = |
| + BuildNamedLoad(object, name, pair, expr->AssignmentFeedbackId()); |
|
Michael Starzinger
2015/03/24 09:06:40
Shouldn't the property loads in the assignment use
titzer
2015/03/24 10:49:31
I cribbed from typing.cc which adds the type feedb
Michael Starzinger
2015/03/24 12:11:18
As discussed offline: In typing.cc the AstTyper::V
titzer
2015/03/24 14:52:06
Done.
|
| PrepareFrameState(old_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| break; |
| @@ -1938,7 +1945,8 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) { |
| Node* object = environment()->Peek(1); |
| VectorSlotPair pair = |
| CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| - old_value = BuildKeyedLoad(object, key, pair); |
| + old_value = |
| + BuildKeyedLoad(object, key, pair, expr->AssignmentFeedbackId()); |
|
Michael Starzinger
2015/03/24 09:06:40
Likewise.
titzer
2015/03/24 10:49:31
Same as above.
Michael Starzinger
2015/03/24 12:11:17
Likewise.
titzer
2015/03/24 14:52:06
Done.
|
| PrepareFrameState(old_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| break; |
| @@ -1983,14 +1991,16 @@ void AstGraphBuilder::VisitAssignment(Assignment* expr) { |
| case NAMED_PROPERTY: { |
| Node* object = environment()->Pop(); |
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| - Node* store = BuildNamedStore(object, name, value); |
| + Node* store = |
| + BuildNamedStore(object, name, value, expr->AssignmentFeedbackId()); |
| PrepareFrameState(store, expr->id(), ast_context()->GetStateCombine()); |
| break; |
| } |
| case KEYED_PROPERTY: { |
| Node* key = environment()->Pop(); |
| Node* object = environment()->Pop(); |
| - Node* store = BuildKeyedStore(object, key, value); |
| + Node* store = |
| + BuildKeyedStore(object, key, value, expr->AssignmentFeedbackId()); |
| PrepareFrameStateAfterAndBefore(store, expr->id(), |
| ast_context()->GetStateCombine(), |
| frame_state_before_store); |
| @@ -2024,13 +2034,13 @@ void AstGraphBuilder::VisitProperty(Property* expr) { |
| VisitForValue(expr->obj()); |
| Node* object = environment()->Pop(); |
| Handle<Name> name = expr->key()->AsLiteral()->AsPropertyName(); |
| - value = BuildNamedLoad(object, name, pair); |
| + value = BuildNamedLoad(object, name, pair, expr->PropertyFeedbackId()); |
| } else { |
| VisitForValue(expr->obj()); |
| VisitForValue(expr->key()); |
| Node* key = environment()->Pop(); |
| Node* object = environment()->Pop(); |
| - value = BuildKeyedLoad(object, key, pair); |
| + value = BuildKeyedLoad(object, key, pair, expr->PropertyFeedbackId()); |
| } |
| PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); |
| ast_context()->ProduceValue(value); |
| @@ -2078,11 +2088,13 @@ void AstGraphBuilder::VisitCall(Call* expr) { |
| CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| if (property->key()->IsPropertyName()) { |
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| - callee_value = BuildNamedLoad(object, name, pair); |
| + callee_value = |
| + BuildNamedLoad(object, name, pair, property->PropertyFeedbackId()); |
| } else { |
| VisitForValue(property->key()); |
| Node* key = environment()->Pop(); |
| - callee_value = BuildKeyedLoad(object, key, pair); |
| + callee_value = |
| + BuildKeyedLoad(object, key, pair, property->PropertyFeedbackId()); |
| } |
| PrepareFrameState(callee_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| @@ -2178,7 +2190,8 @@ void AstGraphBuilder::VisitCallJSRuntime(CallRuntime* expr) { |
| CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS; |
| Node* receiver_value = BuildLoadBuiltinsObject(); |
| VectorSlotPair pair = CreateVectorSlotPair(expr->CallRuntimeFeedbackSlot()); |
| - Node* callee_value = BuildNamedLoad(receiver_value, name, pair); |
| + Node* callee_value = |
| + BuildNamedLoad(receiver_value, name, pair, expr->CallRuntimeFeedbackId()); |
| // TODO(jarin): Find/create a bailout id to deoptimize to (crankshaft |
| // refuses to optimize functions with jsruntime calls). |
| PrepareFrameState(callee_value, BailoutId::None(), |
| @@ -2266,7 +2279,8 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| VectorSlotPair pair = |
| CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| - old_value = BuildNamedLoad(object, name, pair); |
| + old_value = |
| + BuildNamedLoad(object, name, pair, property->PropertyFeedbackId()); |
| PrepareFrameState(old_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| stack_depth = 1; |
| @@ -2279,7 +2293,8 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| Node* object = environment()->Peek(1); |
| VectorSlotPair pair = |
| CreateVectorSlotPair(property->PropertyFeedbackSlot()); |
| - old_value = BuildKeyedLoad(object, key, pair); |
| + old_value = |
| + BuildKeyedLoad(object, key, pair, property->PropertyFeedbackId()); |
| PrepareFrameState(old_value, property->LoadId(), |
| OutputFrameStateCombine::Push()); |
| stack_depth = 2; |
| @@ -2322,7 +2337,8 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| case NAMED_PROPERTY: { |
| Node* object = environment()->Pop(); |
| Handle<Name> name = property->key()->AsLiteral()->AsPropertyName(); |
| - Node* store = BuildNamedStore(object, name, value); |
| + Node* store = |
| + BuildNamedStore(object, name, value, expr->CountStoreFeedbackId()); |
| environment()->Push(value); |
| PrepareFrameState(store, expr->AssignmentId()); |
| environment()->Pop(); |
| @@ -2331,7 +2347,8 @@ void AstGraphBuilder::VisitCountOperation(CountOperation* expr) { |
| case KEYED_PROPERTY: { |
| Node* key = environment()->Pop(); |
| Node* object = environment()->Pop(); |
| - Node* store = BuildKeyedStore(object, key, value); |
| + Node* store = |
| + BuildKeyedStore(object, key, value, expr->CountStoreFeedbackId()); |
| environment()->Push(value); |
| PrepareFrameStateAfterAndBefore(store, expr->AssignmentId(), |
| OutputFrameStateCombine::Ignore(), |
| @@ -2740,7 +2757,8 @@ Node* AstGraphBuilder::BuildVariableLoad(Variable* variable, |
| // Global var, const, or let variable. |
| Node* global = BuildLoadGlobalObject(); |
| Handle<Name> name = variable->name(); |
| - Node* node = BuildNamedLoad(global, name, feedback, contextual_mode); |
| + Node* node = BuildNamedLoad(global, name, feedback, |
| + TypeFeedbackId::None(), contextual_mode); |
| PrepareFrameState(node, bailout_id, OutputFrameStateCombine::Push()); |
| return node; |
| } |
| @@ -2847,7 +2865,8 @@ Node* AstGraphBuilder::BuildVariableAssignment( |
| // Global var, const, or let variable. |
| Node* global = BuildLoadGlobalObject(); |
| Handle<Name> name = variable->name(); |
| - Node* store = BuildNamedStore(global, name, value); |
| + Node* store = |
| + BuildNamedStore(global, name, value, TypeFeedbackId::None()); |
| PrepareFrameState(store, bailout_id, combine); |
| return store; |
| } |
| @@ -2943,33 +2962,42 @@ Node* AstGraphBuilder::BuildVariableAssignment( |
| } |
| +static inline Node* Record(JSTypeFeedbackTable* js_type_feedback, Node* node, |
| + TypeFeedbackId id) { |
| + if (js_type_feedback) js_type_feedback->Record(node, id); |
| + return node; |
| +} |
| + |
| + |
| Node* AstGraphBuilder::BuildKeyedLoad(Node* object, Node* key, |
| - const VectorSlotPair& feedback) { |
| + const VectorSlotPair& feedback, |
| + TypeFeedbackId id) { |
| const Operator* op = javascript()->LoadProperty(feedback); |
| - return NewNode(op, object, key); |
| + return Record(js_type_feedback_, NewNode(op, object, key), id); |
| } |
| Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name, |
| const VectorSlotPair& feedback, |
| - ContextualMode mode) { |
| + TypeFeedbackId id, ContextualMode mode) { |
| const Operator* op = |
| javascript()->LoadNamed(MakeUnique(name), feedback, mode); |
| - return NewNode(op, object); |
| + return Record(js_type_feedback_, NewNode(op, object), id); |
| } |
| -Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node* value) { |
| +Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node* value, |
| + TypeFeedbackId id) { |
| const Operator* op = javascript()->StoreProperty(language_mode()); |
| - return NewNode(op, object, key, value); |
| + return Record(js_type_feedback_, NewNode(op, object, key, value), id); |
| } |
| Node* AstGraphBuilder::BuildNamedStore(Node* object, Handle<Name> name, |
| - Node* value) { |
| + Node* value, TypeFeedbackId id) { |
| const Operator* op = |
| javascript()->StoreNamed(language_mode(), MakeUnique(name)); |
| - return NewNode(op, object, value); |
| + return Record(js_type_feedback_, NewNode(op, object, value), id); |
| } |
| @@ -3058,7 +3086,8 @@ Node* AstGraphBuilder::BuildSetHomeObject(Node* value, Node* home_object, |
| Expression* expr) { |
| if (!FunctionLiteral::NeedsHomeObject(expr)) return value; |
| Handle<Name> name = isolate()->factory()->home_object_symbol(); |
| - Node* store = BuildNamedStore(value, name, home_object); |
| + Node* store = |
| + BuildNamedStore(value, name, home_object, TypeFeedbackId::None()); |
| PrepareFrameState(store, BailoutId::None()); |
| return store; |
| } |