Index: src/hydrogen-load-elimination.cc |
diff --git a/src/hydrogen-load-elimination.cc b/src/hydrogen-load-elimination.cc |
index 79f0eb7a2cc1a2300bc6eb1e5024e82d30e7e50c..94c99524c8abee586267cc4191ec248f68637558 100644 |
--- a/src/hydrogen-load-elimination.cc |
+++ b/src/hydrogen-load-elimination.cc |
@@ -453,11 +453,7 @@ class HLoadEliminationTable : public ZoneObject { |
class HLoadEliminationEffects : public ZoneObject { |
public: |
explicit HLoadEliminationEffects(Zone* zone) |
- : zone_(zone), |
- maps_stored_(false), |
- fields_stored_(false), |
- elements_stored_(false), |
- stores_(5, zone) { } |
+ : zone_(zone), stores_(5, zone) { } |
inline bool Disabled() { |
return false; // Effects are _not_ disabled. |
@@ -465,37 +461,25 @@ class HLoadEliminationEffects : public ZoneObject { |
// Process a possibly side-effecting instruction. |
void Process(HInstruction* instr, Zone* zone) { |
- switch (instr->opcode()) { |
- case HValue::kStoreNamedField: { |
- stores_.Add(HStoreNamedField::cast(instr), zone_); |
- break; |
- } |
- case HValue::kOsrEntry: { |
- // Kill everything. Loads must not be hoisted past the OSR entry. |
- maps_stored_ = true; |
- fields_stored_ = true; |
- elements_stored_ = true; |
- } |
- default: { |
- fields_stored_ |= instr->CheckChangesFlag(kInobjectFields); |
- maps_stored_ |= instr->CheckChangesFlag(kMaps); |
- maps_stored_ |= instr->CheckChangesFlag(kElementsKind); |
- elements_stored_ |= instr->CheckChangesFlag(kElementsKind); |
- elements_stored_ |= instr->CheckChangesFlag(kElementsPointer); |
- } |
+ if (instr->IsStoreNamedField()) { |
+ stores_.Add(HStoreNamedField::cast(instr), zone_); |
+ } else { |
+ flags_.Add(instr->ChangesFlags()); |
} |
} |
// Apply these effects to the given load elimination table. |
void Apply(HLoadEliminationTable* table) { |
- if (fields_stored_) { |
+ // Loads must not be hoisted past the OSR entry, therefore we kill |
+ // everything if we see an OSR entry. |
+ if (flags_.Contains(kInobjectFields) || flags_.Contains(kOsrEntries)) { |
table->Kill(); |
return; |
} |
- if (maps_stored_) { |
+ if (flags_.Contains(kElementsKind) || flags_.Contains(kMaps)) { |
table->KillOffset(JSObject::kMapOffset); |
} |
- if (elements_stored_) { |
+ if (flags_.Contains(kElementsKind) || flags_.Contains(kElementsPointer)) { |
table->KillOffset(JSObject::kElementsOffset); |
} |
@@ -507,9 +491,7 @@ class HLoadEliminationEffects : public ZoneObject { |
// Union these effects with the other effects. |
void Union(HLoadEliminationEffects* that, Zone* zone) { |
- maps_stored_ |= that->maps_stored_; |
- fields_stored_ |= that->fields_stored_; |
- elements_stored_ |= that->elements_stored_; |
+ flags_.Add(that->flags_); |
for (int i = 0; i < that->stores_.length(); i++) { |
stores_.Add(that->stores_[i], zone); |
} |
@@ -517,9 +499,7 @@ class HLoadEliminationEffects : public ZoneObject { |
private: |
Zone* zone_; |
- bool maps_stored_ : 1; |
- bool fields_stored_ : 1; |
- bool elements_stored_ : 1; |
+ GVNFlagSet flags_; |
ZoneList<HStoreNamedField*> stores_; |
}; |