Index: src/hydrogen-load-elimination.cc |
diff --git a/src/hydrogen-load-elimination.cc b/src/hydrogen-load-elimination.cc |
index f3b574847f8e3ed6b9e5807fa0cee894b18af41b..f2e993b18dea2305884acd01274f85edab887260 100644 |
--- a/src/hydrogen-load-elimination.cc |
+++ b/src/hydrogen-load-elimination.cc |
@@ -43,7 +43,6 @@ static const int kMaxTrackedObjects = 5; |
class HFieldApproximation : public ZoneObject { |
public: // Just a data blob. |
HValue* object_; |
- HLoadNamedField* last_load_; |
HValue* last_value_; |
HFieldApproximation* next_; |
@@ -52,7 +51,6 @@ class HFieldApproximation : public ZoneObject { |
if (this == NULL) return NULL; |
HFieldApproximation* copy = new(zone) HFieldApproximation(); |
copy->object_ = this->object_; |
- copy->last_load_ = this->last_load_; |
copy->last_value_ = this->last_value_; |
copy->next_ = this->next_->Copy(zone); |
return copy; |
@@ -197,7 +195,6 @@ class HLoadEliminationTable : public ZoneObject { |
if (approx->last_value_ == NULL) { |
// Load is not redundant. Fill out a new entry. |
- approx->last_load_ = instr; |
approx->last_value_ = instr; |
return instr; |
} else { |
@@ -217,12 +214,14 @@ class HLoadEliminationTable : public ZoneObject { |
HValue* object = instr->object()->ActualValue(); |
HValue* value = instr->value(); |
- // Kill non-equivalent may-alias entries. |
- KillFieldInternal(object, field, value); |
if (instr->has_transition()) { |
- // A transition store alters the map of the object. |
- // TODO(titzer): remember the new map (a constant) for the object. |
+ // A transition introduces a new field and alters the map of the object. |
+ // Since the field in the object is new, it cannot alias existing entries. |
+ // TODO(titzer): introduce a constant for the new map and remember it. |
KillFieldInternal(object, FieldOf(JSObject::kMapOffset), NULL); |
+ } else { |
+ // Kill non-equivalent may-alias entries. |
+ KillFieldInternal(object, field, value); |
} |
HFieldApproximation* approx = FindOrCreate(object, field); |
@@ -231,7 +230,6 @@ class HLoadEliminationTable : public ZoneObject { |
return NULL; |
} else { |
// The store is not redundant. Update the entry. |
- approx->last_load_ = NULL; |
approx->last_value_ = value; |
return instr; |
} |
@@ -314,7 +312,6 @@ class HLoadEliminationTable : public ZoneObject { |
// Insert the entry at the head of the list. |
approx->object_ = object; |
- approx->last_load_ = NULL; |
approx->last_value_ = NULL; |
approx->next_ = fields_[field]; |
fields_[field] = approx; |
@@ -397,7 +394,6 @@ class HLoadEliminationTable : public ZoneObject { |
PrintF(" field %d: ", i); |
for (HFieldApproximation* a = fields_[i]; a != NULL; a = a->next_) { |
PrintF("[o%d =", a->object_->id()); |
- if (a->last_load_ != NULL) PrintF(" L%d", a->last_load_->id()); |
if (a->last_value_ != NULL) PrintF(" v%d", a->last_value_->id()); |
PrintF("] "); |
} |