Reviewers: Jakob,
Message:
Hi Jakob,
This avoids wastage of ic slots as per our discussion. PTAL,
--Michael
Description:
Make use of post-scoping information to compute feedback vector
requirements.
This avoids allocating vector ic slots that we don't use.
[email protected]
Please review this at https://codereview.chromium.org/758543002/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+38, -20 lines):
M src/ast.h
M src/ast.cc
M src/ast-numbering.cc
M src/typing.cc
Index: src/ast-numbering.cc
diff --git a/src/ast-numbering.cc b/src/ast-numbering.cc
index
058921bc4a62eed68582e02eb6da4269c57e45b5..fbe40cac44f1b98a7edb6d0d5f78fda6c190d25c
100644
--- a/src/ast-numbering.cc
+++ b/src/ast-numbering.cc
@@ -66,7 +66,8 @@ class AstNumberingVisitor FINAL : public AstVisitor {
template <typename Node>
void ReserveFeedbackSlots(Node* node) {
- FeedbackVectorRequirements reqs = node->ComputeFeedbackRequirements();
+ FeedbackVectorRequirements reqs =
+ node->ComputeFeedbackRequirements(isolate());
if (reqs.slots() > 0) {
node->SetFirstFeedbackSlot(
FeedbackVectorSlot(properties_.feedback_slots()));
Index: src/ast.cc
diff --git a/src/ast.cc b/src/ast.cc
index
e6995018dbb4e7707ffef9b09ae15fd22a872652..874f984ff6bc61a4bcb470b097e67a44795171fd
100644
--- a/src/ast.cc
+++ b/src/ast.cc
@@ -573,6 +573,12 @@ bool Call::IsUsingCallFeedbackSlot(Isolate* isolate)
const {
}
+FeedbackVectorRequirements Call::ComputeFeedbackRequirements(Isolate*
isolate) {
+ int ic_slots = IsUsingCallFeedbackSlot(isolate) ? 1 : 0;
+ return FeedbackVectorRequirements(0, ic_slots);
+}
+
+
Call::CallType Call::GetCallType(Isolate* isolate) const {
VariableProxy* proxy = expression()->AsVariableProxy();
if (proxy != NULL) {
Index: src/ast.h
diff --git a/src/ast.h b/src/ast.h
index
f4742f155b418cc8dee66b73753cf7f9706ae12c..25cfdf59b3b50b3d907970d1316254e8f1ac4fa7
100644
--- a/src/ast.h
+++ b/src/ast.h
@@ -237,7 +237,8 @@ class AstNode: public ZoneObject {
// node types which don't actually have this. Note that this is
conceptually
// not really nice, but multiple inheritance would introduce yet another
// vtable entry per node, something we don't want for space reasons.
- virtual FeedbackVectorRequirements ComputeFeedbackRequirements() {
+ virtual FeedbackVectorRequirements ComputeFeedbackRequirements(
+ Isolate* isolate) {
return FeedbackVectorRequirements(0, 0);
}
virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) {
UNREACHABLE(); }
@@ -923,7 +924,8 @@ class ForInStatement FINAL : public ForEachStatement {
}
// Type feedback information.
- virtual FeedbackVectorRequirements ComputeFeedbackRequirements()
OVERRIDE {
+ virtual FeedbackVectorRequirements ComputeFeedbackRequirements(
+ Isolate* isolate) OVERRIDE {
return FeedbackVectorRequirements(1, 0);
}
virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) OVERRIDE {
@@ -1696,7 +1698,8 @@ class VariableProxy FINAL : public Expression {
// Bind this proxy to the variable var. Interfaces must match.
void BindTo(Variable* var);
- virtual FeedbackVectorRequirements ComputeFeedbackRequirements()
OVERRIDE {
+ virtual FeedbackVectorRequirements ComputeFeedbackRequirements(
+ Isolate* isolate) OVERRIDE {
return FeedbackVectorRequirements(0, FLAG_vector_ics ? 1 : 0);
}
virtual void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot) OVERRIDE {
@@ -1782,7 +1785,8 @@ class Property FINAL : public Expression {
return obj()->IsSuperReference();
}
- virtual FeedbackVectorRequirements ComputeFeedbackRequirements()
OVERRIDE {
+ virtual FeedbackVectorRequirements ComputeFeedbackRequirements(
+ Isolate* isolate) OVERRIDE {
return FeedbackVectorRequirements(0, FLAG_vector_ics ? 1 : 0);
}
virtual void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot) OVERRIDE {
@@ -1827,9 +1831,8 @@ class Call FINAL : public Expression {
ZoneList<Expression*>* arguments() const { return arguments_; }
// Type feedback information.
- virtual FeedbackVectorRequirements ComputeFeedbackRequirements()
OVERRIDE {
- return FeedbackVectorRequirements(0, 1);
- }
+ virtual FeedbackVectorRequirements ComputeFeedbackRequirements(
+ Isolate* isolate) OVERRIDE;
virtual void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot) OVERRIDE {
call_feedback_slot_ = slot;
}
@@ -1940,7 +1943,8 @@ class CallNew FINAL : public Expression {
ZoneList<Expression*>* arguments() const { return arguments_; }
// Type feedback information.
- virtual FeedbackVectorRequirements ComputeFeedbackRequirements()
OVERRIDE {
+ virtual FeedbackVectorRequirements ComputeFeedbackRequirements(
+ Isolate* isolate) OVERRIDE {
return FeedbackVectorRequirements(FLAG_pretenuring_call_new ? 2 : 1,
0);
}
virtual void SetFirstFeedbackSlot(FeedbackVectorSlot slot) OVERRIDE {
@@ -2005,7 +2009,8 @@ class CallRuntime FINAL : public Expression {
bool is_jsruntime() const { return function_ == NULL; }
// Type feedback information.
- virtual FeedbackVectorRequirements ComputeFeedbackRequirements()
OVERRIDE {
+ virtual FeedbackVectorRequirements ComputeFeedbackRequirements(
+ Isolate* isolate) OVERRIDE {
return FeedbackVectorRequirements(
0, (FLAG_vector_ics && is_jsruntime()) ? 1 : 0);
}
@@ -2384,7 +2389,8 @@ class Yield FINAL : public Expression {
}
// Type feedback information.
- virtual FeedbackVectorRequirements ComputeFeedbackRequirements()
OVERRIDE {
+ virtual FeedbackVectorRequirements ComputeFeedbackRequirements(
+ Isolate* isolate) OVERRIDE {
return FeedbackVectorRequirements(
0, (FLAG_vector_ics && yield_kind() == kDelegating) ? 3 : 0);
}
@@ -2721,7 +2727,8 @@ class SuperReference FINAL : public Expression {
TypeFeedbackId HomeObjectFeedbackId() { return
TypeFeedbackId(local_id(0)); }
// Type feedback information.
- virtual FeedbackVectorRequirements ComputeFeedbackRequirements()
OVERRIDE {
+ virtual FeedbackVectorRequirements ComputeFeedbackRequirements(
+ Isolate* isolate) OVERRIDE {
return FeedbackVectorRequirements(0, FLAG_vector_ics ? 1 : 0);
}
virtual void SetFirstFeedbackICSlot(FeedbackVectorICSlot slot) OVERRIDE {
Index: src/typing.cc
diff --git a/src/typing.cc b/src/typing.cc
index
7f736a4fc6620419c4dddbf6ca4dc4e32313b9a0..e297ff2617f601464328b3f54adef58be974810b
100644
--- a/src/typing.cc
+++ b/src/typing.cc
@@ -510,16 +510,20 @@ void AstTyper::VisitProperty(Property* expr) {
void AstTyper::VisitCall(Call* expr) {
// Collect type feedback.
RECURSE(Visit(expr->expression()));
- FeedbackVectorICSlot slot = expr->CallFeedbackSlot();
- expr->set_is_uninitialized(oracle()->CallIsUninitialized(slot));
- if (!expr->expression()->IsProperty() &&
- expr->IsUsingCallFeedbackSlot(isolate()) &&
- oracle()->CallIsMonomorphic(slot)) {
- expr->set_target(oracle()->GetCallTarget(slot));
- Handle<AllocationSite> site = oracle()->GetCallAllocationSite(slot);
- expr->set_allocation_site(site);
+ bool is_uninitialized = true;
+ if (expr->IsUsingCallFeedbackSlot(isolate())) {
+ FeedbackVectorICSlot slot = expr->CallFeedbackSlot();
+ is_uninitialized = oracle()->CallIsUninitialized(slot);
+ if (!expr->expression()->IsProperty() &&
+ oracle()->CallIsMonomorphic(slot)) {
+ expr->set_target(oracle()->GetCallTarget(slot));
+ Handle<AllocationSite> site = oracle()->GetCallAllocationSite(slot);
+ expr->set_allocation_site(site);
+ }
}
+ expr->set_is_uninitialized(is_uninitialized);
+
ZoneList<Expression*>* args = expr->arguments();
for (int i = 0; i < args->length(); ++i) {
Expression* arg = args->at(i);
--
--
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.