Commit be32761a authored by titzer@chromium.org's avatar titzer@chromium.org

Improve load elimination handling of transitioning stores.

BUG=
R=verwaest@chromium.org

Review URL: https://codereview.chromium.org/106973005

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18388 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent b882bddc
...@@ -43,7 +43,6 @@ static const int kMaxTrackedObjects = 5; ...@@ -43,7 +43,6 @@ static const int kMaxTrackedObjects = 5;
class HFieldApproximation : public ZoneObject { class HFieldApproximation : public ZoneObject {
public: // Just a data blob. public: // Just a data blob.
HValue* object_; HValue* object_;
HLoadNamedField* last_load_;
HValue* last_value_; HValue* last_value_;
HFieldApproximation* next_; HFieldApproximation* next_;
...@@ -52,7 +51,6 @@ class HFieldApproximation : public ZoneObject { ...@@ -52,7 +51,6 @@ class HFieldApproximation : public ZoneObject {
if (this == NULL) return NULL; if (this == NULL) return NULL;
HFieldApproximation* copy = new(zone) HFieldApproximation(); HFieldApproximation* copy = new(zone) HFieldApproximation();
copy->object_ = this->object_; copy->object_ = this->object_;
copy->last_load_ = this->last_load_;
copy->last_value_ = this->last_value_; copy->last_value_ = this->last_value_;
copy->next_ = this->next_->Copy(zone); copy->next_ = this->next_->Copy(zone);
return copy; return copy;
...@@ -197,7 +195,6 @@ class HLoadEliminationTable : public ZoneObject { ...@@ -197,7 +195,6 @@ class HLoadEliminationTable : public ZoneObject {
if (approx->last_value_ == NULL) { if (approx->last_value_ == NULL) {
// Load is not redundant. Fill out a new entry. // Load is not redundant. Fill out a new entry.
approx->last_load_ = instr;
approx->last_value_ = instr; approx->last_value_ = instr;
return instr; return instr;
} else { } else {
...@@ -217,12 +214,14 @@ class HLoadEliminationTable : public ZoneObject { ...@@ -217,12 +214,14 @@ class HLoadEliminationTable : public ZoneObject {
HValue* object = instr->object()->ActualValue(); HValue* object = instr->object()->ActualValue();
HValue* value = instr->value(); HValue* value = instr->value();
// Kill non-equivalent may-alias entries.
KillFieldInternal(object, field, value);
if (instr->has_transition()) { if (instr->has_transition()) {
// A transition store alters the map of the object. // A transition introduces a new field and alters the map of the object.
// TODO(titzer): remember the new map (a constant) for 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); KillFieldInternal(object, FieldOf(JSObject::kMapOffset), NULL);
} else {
// Kill non-equivalent may-alias entries.
KillFieldInternal(object, field, value);
} }
HFieldApproximation* approx = FindOrCreate(object, field); HFieldApproximation* approx = FindOrCreate(object, field);
...@@ -231,7 +230,6 @@ class HLoadEliminationTable : public ZoneObject { ...@@ -231,7 +230,6 @@ class HLoadEliminationTable : public ZoneObject {
return NULL; return NULL;
} else { } else {
// The store is not redundant. Update the entry. // The store is not redundant. Update the entry.
approx->last_load_ = NULL;
approx->last_value_ = value; approx->last_value_ = value;
return instr; return instr;
} }
...@@ -314,7 +312,6 @@ class HLoadEliminationTable : public ZoneObject { ...@@ -314,7 +312,6 @@ class HLoadEliminationTable : public ZoneObject {
// Insert the entry at the head of the list. // Insert the entry at the head of the list.
approx->object_ = object; approx->object_ = object;
approx->last_load_ = NULL;
approx->last_value_ = NULL; approx->last_value_ = NULL;
approx->next_ = fields_[field]; approx->next_ = fields_[field];
fields_[field] = approx; fields_[field] = approx;
...@@ -397,7 +394,6 @@ class HLoadEliminationTable : public ZoneObject { ...@@ -397,7 +394,6 @@ class HLoadEliminationTable : public ZoneObject {
PrintF(" field %d: ", i); PrintF(" field %d: ", i);
for (HFieldApproximation* a = fields_[i]; a != NULL; a = a->next_) { for (HFieldApproximation* a = fields_[i]; a != NULL; a = a->next_) {
PrintF("[o%d =", a->object_->id()); 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()); if (a->last_value_ != NULL) PrintF(" v%d", a->last_value_->id());
PrintF("] "); PrintF("] ");
} }
......
...@@ -35,6 +35,9 @@ function B(x, y) { ...@@ -35,6 +35,9 @@ function B(x, y) {
return this; return this;
} }
function C() {
}
function test_load() { function test_load() {
var a = new B(1, 2); var a = new B(1, 2);
return a.x + a.x + a.x + a.x; return a.x + a.x + a.x + a.x;
...@@ -64,6 +67,22 @@ function test_nonaliasing_store1() { ...@@ -64,6 +67,22 @@ function test_nonaliasing_store1() {
return f + g + h + a.x; return f + g + h + a.x;
} }
function test_transitioning_store1() {
var a = new B(2, 3);
var f = a.x, g = a.y;
var b = new B(3, 4);
return a.x + a.y;
}
function test_transitioning_store2() {
var b = new C();
var a = new B(-1, 5);
var f = a.x, g = a.y;
b.x = 9;
b.y = 11;
return a.x + a.y;
}
function killall() { function killall() {
try { } catch(e) { } try { } catch(e) { }
} }
...@@ -102,5 +121,7 @@ function test(x, f) { ...@@ -102,5 +121,7 @@ function test(x, f) {
test(4, test_load); test(4, test_load);
test(22, test_store_load); test(22, test_store_load);
test(8, test_nonaliasing_store1); test(8, test_nonaliasing_store1);
test(5, test_transitioning_store1);
test(4, test_transitioning_store2);
test(22, test_store_load_kill); test(22, test_store_load_kill);
test(7, test_store_store); test(7, test_store_store);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment