Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Unified Diff: src/compiler/ast-graph-builder.cc

Issue 1175503002: Turbofan: Make type feedback vector a Node. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Couple more fixes. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698