| Index: src/ast.cc
|
| diff --git a/src/ast.cc b/src/ast.cc
|
| index 3880f769e0f2f922c47031455e376b9f2f0b42a8..8c5b9161e5f473dfdc681e0aa68ff180bb4d7746 100644
|
| --- a/src/ast.cc
|
| +++ b/src/ast.cc
|
| @@ -98,17 +98,9 @@ void VariableProxy::BindTo(Variable* var) {
|
| }
|
|
|
|
|
| -void VariableProxy::SetFirstFeedbackICSlot(FeedbackVectorICSlot slot,
|
| - ICSlotCache* cache) {
|
| - variable_feedback_slot_ = slot;
|
| - if (var()->IsUnallocated()) {
|
| - cache->Put(var(), slot);
|
| - }
|
| -}
|
| -
|
| -
|
| -FeedbackVectorRequirements VariableProxy::ComputeFeedbackRequirements(
|
| - Isolate* isolate, const ICSlotCache* cache) {
|
| +void VariableProxy::AssignFeedbackVectorSlots(Isolate* isolate,
|
| + FeedbackVectorSpec* spec,
|
| + ICSlotCache* cache) {
|
| if (UsesVariableFeedbackSlot()) {
|
| // VariableProxies that point to the same Variable within a function can
|
| // make their loads from the same IC slot.
|
| @@ -117,46 +109,39 @@ FeedbackVectorRequirements VariableProxy::ComputeFeedbackRequirements(
|
| if (entry != NULL) {
|
| variable_feedback_slot_ = FeedbackVectorICSlot(
|
| static_cast<int>(reinterpret_cast<intptr_t>(entry->value)));
|
| - return FeedbackVectorRequirements(0, 0);
|
| + return;
|
| }
|
| }
|
| - return FeedbackVectorRequirements(0, 1);
|
| + variable_feedback_slot_ = spec->AddLoadICSlot();
|
| + if (var()->IsUnallocated()) {
|
| + cache->Put(var(), variable_feedback_slot_);
|
| + }
|
| }
|
| - return FeedbackVectorRequirements(0, 0);
|
| }
|
|
|
|
|
| -static int GetStoreICSlots(Expression* expr) {
|
| - int ic_slots = 0;
|
| +static void AssignVectorSlots(Expression* expr, FeedbackVectorSpec* spec,
|
| + FeedbackVectorICSlot* out_slot) {
|
| if (FLAG_vector_stores) {
|
| Property* property = expr->AsProperty();
|
| LhsKind assign_type = Property::GetAssignType(property);
|
| if ((assign_type == VARIABLE &&
|
| expr->AsVariableProxy()->var()->IsUnallocated()) ||
|
| assign_type == NAMED_PROPERTY || assign_type == KEYED_PROPERTY) {
|
| - ic_slots++;
|
| + // TODO(ishell): consider using ICSlotCache for variables here.
|
| + FeedbackVectorSlotKind kind = assign_type == KEYED_PROPERTY
|
| + ? FeedbackVectorSlotKind::KEYED_STORE_IC
|
| + : FeedbackVectorSlotKind::STORE_IC;
|
| + *out_slot = spec->AddSlot(kind);
|
| }
|
| }
|
| - return ic_slots;
|
| -}
|
| -
|
| -
|
| -static FeedbackVectorSlotKind GetStoreICKind(Expression* expr) {
|
| - LhsKind assign_type = Property::GetAssignType(expr->AsProperty());
|
| - return assign_type == KEYED_PROPERTY ? FeedbackVectorSlotKind::KEYED_STORE_IC
|
| - : FeedbackVectorSlotKind::STORE_IC;
|
| -}
|
| -
|
| -
|
| -FeedbackVectorRequirements ForEachStatement::ComputeFeedbackRequirements(
|
| - Isolate* isolate, const ICSlotCache* cache) {
|
| - int ic_slots = GetStoreICSlots(each());
|
| - return FeedbackVectorRequirements(0, ic_slots);
|
| }
|
|
|
|
|
| -FeedbackVectorSlotKind ForEachStatement::FeedbackICSlotKind(int index) {
|
| - return GetStoreICKind(each());
|
| +void ForEachStatement::AssignFeedbackVectorSlots(Isolate* isolate,
|
| + FeedbackVectorSpec* spec,
|
| + ICSlotCache* cache) {
|
| + AssignVectorSlots(each(), spec, &each_slot_);
|
| }
|
|
|
|
|
| @@ -172,27 +157,17 @@ Assignment::Assignment(Zone* zone, Token::Value op, Expression* target,
|
| slot_(FeedbackVectorICSlot::Invalid()) {}
|
|
|
|
|
| -FeedbackVectorRequirements Assignment::ComputeFeedbackRequirements(
|
| - Isolate* isolate, const ICSlotCache* cache) {
|
| - int ic_slots = GetStoreICSlots(target());
|
| - return FeedbackVectorRequirements(0, ic_slots);
|
| -}
|
| -
|
| -
|
| -FeedbackVectorSlotKind Assignment::FeedbackICSlotKind(int index) {
|
| - return GetStoreICKind(target());
|
| -}
|
| -
|
| -
|
| -FeedbackVectorRequirements CountOperation::ComputeFeedbackRequirements(
|
| - Isolate* isolate, const ICSlotCache* cache) {
|
| - int ic_slots = GetStoreICSlots(expression());
|
| - return FeedbackVectorRequirements(0, ic_slots);
|
| +void Assignment::AssignFeedbackVectorSlots(Isolate* isolate,
|
| + FeedbackVectorSpec* spec,
|
| + ICSlotCache* cache) {
|
| + AssignVectorSlots(target(), spec, &slot_);
|
| }
|
|
|
|
|
| -FeedbackVectorSlotKind CountOperation::FeedbackICSlotKind(int index) {
|
| - return GetStoreICKind(expression());
|
| +void CountOperation::AssignFeedbackVectorSlots(Isolate* isolate,
|
| + FeedbackVectorSpec* spec,
|
| + ICSlotCache* cache) {
|
| + AssignVectorSlots(expression(), spec, &slot_);
|
| }
|
|
|
|
|
| @@ -283,9 +258,10 @@ ObjectLiteralProperty::ObjectLiteralProperty(AstValueFactory* ast_value_factory,
|
| }
|
|
|
|
|
| -FeedbackVectorRequirements ClassLiteral::ComputeFeedbackRequirements(
|
| - Isolate* isolate, const ICSlotCache* cache) {
|
| - if (!FLAG_vector_stores) return FeedbackVectorRequirements(0, 0);
|
| +void ClassLiteral::AssignFeedbackVectorSlots(Isolate* isolate,
|
| + FeedbackVectorSpec* spec,
|
| + ICSlotCache* cache) {
|
| + if (!FLAG_vector_stores) return;
|
|
|
| // This logic that computes the number of slots needed for vector store
|
| // ICs must mirror FullCodeGenerator::VisitClassLiteral.
|
| @@ -306,7 +282,9 @@ FeedbackVectorRequirements ClassLiteral::ComputeFeedbackRequirements(
|
| }
|
| }
|
|
|
| - return FeedbackVectorRequirements(0, ic_slots);
|
| + if (ic_slots > 0) {
|
| + slot_ = spec->AddStoreICSlots(ic_slots);
|
| + }
|
| }
|
|
|
|
|
| @@ -347,9 +325,10 @@ void ObjectLiteral::LayoutFeedbackSlots() {
|
| }
|
|
|
|
|
| -FeedbackVectorRequirements ObjectLiteral::ComputeFeedbackRequirements(
|
| - Isolate* isolate, const ICSlotCache* cache) {
|
| - if (!FLAG_vector_stores) return FeedbackVectorRequirements(0, 0);
|
| +void ObjectLiteral::AssignFeedbackVectorSlots(Isolate* isolate,
|
| + FeedbackVectorSpec* spec,
|
| + ICSlotCache* cache) {
|
| + if (!FLAG_vector_stores) return;
|
|
|
| // This logic that computes the number of slots needed for vector store
|
| // ics must mirror FullCodeGenerator::VisitObjectLiteral.
|
| @@ -419,7 +398,9 @@ FeedbackVectorRequirements ObjectLiteral::ComputeFeedbackRequirements(
|
| ic_slots += property->ic_slot_count();
|
| }
|
|
|
| - return FeedbackVectorRequirements(0, ic_slots);
|
| + if (ic_slots > 0) {
|
| + slot_ = spec->AddStoreICSlots(ic_slots);
|
| + }
|
| }
|
|
|
|
|
| @@ -782,11 +763,14 @@ bool Call::IsUsingCallFeedbackSlot(Isolate* isolate) const {
|
| }
|
|
|
|
|
| -FeedbackVectorRequirements Call::ComputeFeedbackRequirements(
|
| - Isolate* isolate, const ICSlotCache* cache) {
|
| - int ic_slots = IsUsingCallFeedbackICSlot(isolate) ? 1 : 0;
|
| - int slots = IsUsingCallFeedbackSlot(isolate) ? 1 : 0;
|
| - return FeedbackVectorRequirements(slots, ic_slots);
|
| +void Call::AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
|
| + ICSlotCache* cache) {
|
| + if (IsUsingCallFeedbackICSlot(isolate)) {
|
| + ic_slot_ = spec->AddCallICSlot();
|
| + }
|
| + if (IsUsingCallFeedbackSlot(isolate)) {
|
| + slot_ = spec->AddStubSlot();
|
| + }
|
| }
|
|
|
|
|
|
|