Reviewers: titzer,
Message:
Hi Ben,
Could you have a look? thx for it,
--Michael
Description:
Remove unnecessary TypeFeedbackIds, saves memory and simplifies TurboFan.
Consequence of going whole-hog for vector-based Load/KeyedLoad ICs.
BUG=
Please review this at https://codereview.chromium.org/1152063003/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+31, -44 lines):
M src/ast.h
M src/compiler/ast-graph-builder.h
M src/compiler/ast-graph-builder.cc
Index: src/ast.h
diff --git a/src/ast.h b/src/ast.h
index
93003303706d4387634b7cbf373f7c00b7c75cc6..44339c7c9fce037e747863c44cd96f17d8501dd7
100644
--- a/src/ast.h
+++ b/src/ast.h
@@ -1663,9 +1663,8 @@ class Property final : public Expression {
Expression* obj() const { return obj_; }
Expression* key() const { return key_; }
- static int num_ids() { return parent_num_ids() + 2; }
+ static int num_ids() { return parent_num_ids() + 1; }
BailoutId LoadId() const { return BailoutId(local_id(0)); }
- TypeFeedbackId PropertyFeedbackId() { return
TypeFeedbackId(local_id(1)); }
bool IsStringAccess() const {
return IsStringAccessField::decode(bit_field_);
@@ -1972,10 +1971,7 @@ class CallRuntime final : public Expression {
return callruntime_feedback_slot_;
}
- static int num_ids() { return parent_num_ids() + 1; }
- TypeFeedbackId CallRuntimeFeedbackId() const {
- return TypeFeedbackId(local_id(0));
- }
+ static int num_ids() { return parent_num_ids(); }
protected:
CallRuntime(Zone* zone, const AstRawString* name,
@@ -1989,8 +1985,6 @@ class CallRuntime final : public Expression {
static int parent_num_ids() { return Expression::num_ids(); }
private:
- int local_id(int n) const { return base_id() + parent_num_ids() + n; }
-
const AstRawString* raw_name_;
const Runtime::Function* function_;
ZoneList<Expression*>* arguments_;
@@ -2697,8 +2691,7 @@ class SuperReference final : public Expression {
VariableProxy* this_var() const { return this_var_; }
- static int num_ids() { return parent_num_ids() + 1; }
- TypeFeedbackId HomeObjectFeedbackId() { return
TypeFeedbackId(local_id(0)); }
+ static int num_ids() { return parent_num_ids(); }
// Type feedback information.
virtual FeedbackVectorRequirements ComputeFeedbackRequirements(
@@ -2726,8 +2719,6 @@ class SuperReference final : public Expression {
static int parent_num_ids() { return Expression::num_ids(); }
private:
- int local_id(int n) const { return base_id() + parent_num_ids() + n; }
-
VariableProxy* this_var_;
FeedbackVectorICSlot homeobject_feedback_slot_;
};
Index: src/compiler/ast-graph-builder.cc
diff --git a/src/compiler/ast-graph-builder.cc
b/src/compiler/ast-graph-builder.cc
index
0d01a5a08b9b37fa495684003baec4d061e96bfc..fccc55dd7eea4cc8f7f4b25ad5e6ed5800d13829
100644
--- a/src/compiler/ast-graph-builder.cc
+++ b/src/compiler/ast-graph-builder.cc
@@ -2129,8 +2129,7 @@ void AstGraphBuilder::VisitAssignment(Assignment*
expr) {
VectorSlotPair pair =
CreateVectorSlotPair(property->PropertyFeedbackSlot());
FrameStateBeforeAndAfter states(this, property->obj()->id());
- old_value =
- BuildNamedLoad(object, name, pair,
property->PropertyFeedbackId());
+ old_value = BuildNamedLoad(object, name, pair);
states.AddToNode(old_value, property->LoadId(),
OutputFrameStateCombine::Push());
break;
@@ -2141,8 +2140,7 @@ void AstGraphBuilder::VisitAssignment(Assignment*
expr) {
VectorSlotPair pair =
CreateVectorSlotPair(property->PropertyFeedbackSlot());
FrameStateBeforeAndAfter states(this, property->key()->id());
- old_value =
- BuildKeyedLoad(object, key, pair,
property->PropertyFeedbackId());
+ old_value = BuildKeyedLoad(object, key, pair);
states.AddToNode(old_value, property->LoadId(),
OutputFrameStateCombine::Push());
break;
@@ -2227,7 +2225,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, expr->PropertyFeedbackId());
+ value = BuildNamedLoad(object, name, pair);
states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
} else {
VisitForValue(expr->obj());
@@ -2235,7 +2233,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, expr->PropertyFeedbackId());
+ value = BuildKeyedLoad(object, key, pair);
states.AddToNode(value, expr->id(), ast_context()->GetStateCombine());
}
ast_context()->ProduceValue(value);
@@ -2286,16 +2284,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,
property->PropertyFeedbackId());
+ callee_value = BuildNamedLoad(object, name, pair);
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,
property->PropertyFeedbackId());
+ callee_value = BuildKeyedLoad(object, key, pair);
states.AddToNode(callee_value, property->LoadId(),
OutputFrameStateCombine::Push());
}
@@ -2410,8 +2406,7 @@ void AstGraphBuilder::VisitCallJSRuntime(CallRuntime*
expr) {
VectorSlotPair pair =
CreateVectorSlotPair(expr->CallRuntimeFeedbackSlot());
// TODO(jarin): bailout ids for runtime calls.
FrameStateBeforeAndAfter states(this, BailoutId::None());
- Node* callee_value =
- BuildNamedLoad(receiver_value, name, pair,
expr->CallRuntimeFeedbackId());
+ Node* callee_value = BuildNamedLoad(receiver_value, name, pair);
states.AddToNode(callee_value, BailoutId::None(),
OutputFrameStateCombine::Push());
environment()->Push(callee_value);
@@ -2501,8 +2496,7 @@ void
AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
VectorSlotPair pair =
CreateVectorSlotPair(property->PropertyFeedbackSlot());
- old_value =
- BuildNamedLoad(object, name, pair,
property->PropertyFeedbackId());
+ old_value = BuildNamedLoad(object, name, pair);
states.AddToNode(old_value, property->LoadId(),
OutputFrameStateCombine::Push());
stack_depth = 1;
@@ -2516,8 +2510,7 @@ void
AstGraphBuilder::VisitCountOperation(CountOperation* expr) {
Node* object = environment()->Peek(1);
VectorSlotPair pair =
CreateVectorSlotPair(property->PropertyFeedbackSlot());
- old_value =
- BuildKeyedLoad(object, key, pair,
property->PropertyFeedbackId());
+ old_value = BuildKeyedLoad(object, key, pair);
states.AddToNode(old_value, property->LoadId(),
OutputFrameStateCombine::Push());
stack_depth = 2;
@@ -3012,8 +3005,7 @@ Node*
AstGraphBuilder::BuildVariableLoad(FrameStateBeforeAndAfter& states,
// Global var, const, or let variable.
Node* global = BuildLoadGlobalObject();
Handle<Name> name = variable->name();
- Node* node = BuildNamedLoad(global, name, feedback,
- TypeFeedbackId::None(), contextual_mode);
+ Node* node = BuildNamedLoad(global, name, feedback, contextual_mode);
states.AddToNode(node, bailout_id, combine);
return node;
}
@@ -3218,38 +3210,43 @@ Node* AstGraphBuilder::BuildVariableAssignment(
static inline Node* Record(JSTypeFeedbackTable* js_type_feedback, Node*
node,
- TypeFeedbackId id, FeedbackVectorICSlot slot) {
+ FeedbackVectorICSlot slot) {
if (js_type_feedback) {
- js_type_feedback->Record(node, id);
js_type_feedback->Record(node, slot);
}
return node;
}
+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,
- TypeFeedbackId id) {
+ const VectorSlotPair& feedback) {
const Operator* op = javascript()->LoadProperty(feedback);
- return Record(js_type_feedback_, NewNode(op, object, key), id,
- feedback.slot());
+ return Record(js_type_feedback_, NewNode(op, object, key),
feedback.slot());
}
Node* AstGraphBuilder::BuildNamedLoad(Node* object, Handle<Name> name,
const VectorSlotPair& feedback,
- TypeFeedbackId id, ContextualMode
mode) {
+ ContextualMode mode) {
const Operator* op =
javascript()->LoadNamed(MakeUnique(name), feedback, mode);
- return Record(js_type_feedback_, NewNode(op, object), id,
feedback.slot());
+ return Record(js_type_feedback_, NewNode(op, object), feedback.slot());
}
Node* AstGraphBuilder::BuildKeyedStore(Node* object, Node* key, Node*
value,
TypeFeedbackId id) {
const Operator* op = javascript()->StoreProperty(language_mode());
- return Record(js_type_feedback_, NewNode(op, object, key, value), id,
- FeedbackVectorICSlot::Invalid());
+ return Record(js_type_feedback_, NewNode(op, object, key, value), id);
}
@@ -3257,8 +3254,7 @@ Node* AstGraphBuilder::BuildNamedStore(Node* object,
Handle<Name> name,
Node* value, TypeFeedbackId id) {
const Operator* op =
javascript()->StoreNamed(language_mode(), MakeUnique(name));
- return Record(js_type_feedback_, NewNode(op, object, value), id,
- FeedbackVectorICSlot::Invalid());
+ return Record(js_type_feedback_, NewNode(op, object, value), id);
}
Index: src/compiler/ast-graph-builder.h
diff --git a/src/compiler/ast-graph-builder.h
b/src/compiler/ast-graph-builder.h
index
c7d604cada8a374fc622a3c1aed08eedbd1dea23..40b7732fcbb10c3ae15d7b148a4a71ab05994f9e
100644
--- a/src/compiler/ast-graph-builder.h
+++ b/src/compiler/ast-graph-builder.h
@@ -268,9 +268,9 @@ class AstGraphBuilder : public AstVisitor {
// Builders for property loads and stores.
Node* BuildKeyedLoad(Node* receiver, Node* key,
- const VectorSlotPair& feedback, TypeFeedbackId id);
+ const VectorSlotPair& feedback);
Node* BuildNamedLoad(Node* receiver, Handle<Name> name,
- const VectorSlotPair& feedback, TypeFeedbackId id,
+ const VectorSlotPair& feedback,
ContextualMode mode = NOT_CONTEXTUAL);
Node* BuildKeyedStore(Node* receiver, Node* key, Node* value,
TypeFeedbackId id);
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.