Index: src/compiler/load-elimination.h |
diff --git a/src/compiler/load-elimination.h b/src/compiler/load-elimination.h |
index 985e690bc4e24d71bf13255152d8b0885be6e8ac..d05f1c21d8dd82d441f635d35c09480e2495fb4c 100644 |
--- a/src/compiler/load-elimination.h |
+++ b/src/compiler/load-elimination.h |
@@ -6,9 +6,14 @@ |
#define V8_COMPILER_LOAD_ELIMINATION_H_ |
#include "src/compiler/graph-reducer.h" |
+#include "src/zone/zone-handle-set.h" |
namespace v8 { |
namespace internal { |
+ |
+// Forward declarations. |
+class Factory; |
+ |
namespace compiler { |
// Foward declarations. |
@@ -149,6 +154,49 @@ class LoadElimination final : public AdvancedReducer { |
static size_t const kMaxTrackedFields = 32; |
+ // Abstract state to approximate the current map of an object along the |
+ // effect paths through the graph. |
+ class AbstractMaps final : public ZoneObject { |
+ public: |
+ explicit AbstractMaps(Zone* zone) : info_for_node_(zone) {} |
+ AbstractMaps(Node* object, ZoneHandleSet<Map> maps, Zone* zone) |
+ : info_for_node_(zone) { |
+ info_for_node_.insert(std::make_pair(object, maps)); |
+ } |
+ |
+ AbstractMaps const* Extend(Node* object, ZoneHandleSet<Map> maps, |
+ Zone* zone) const { |
+ AbstractMaps* that = new (zone) AbstractMaps(zone); |
+ that->info_for_node_ = this->info_for_node_; |
+ that->info_for_node_.insert(std::make_pair(object, maps)); |
+ return that; |
+ } |
+ ZoneHandleSet<Map> Lookup(Node* object) const; |
+ AbstractMaps const* Kill(Node* object, Zone* zone) const; |
+ bool Equals(AbstractMaps const* that) const { |
+ return this == that || this->info_for_node_ == that->info_for_node_; |
+ } |
+ AbstractMaps const* Merge(AbstractMaps const* that, Zone* zone) const { |
+ if (this->Equals(that)) return this; |
+ AbstractMaps* copy = new (zone) AbstractMaps(zone); |
+ for (auto this_it : this->info_for_node_) { |
+ Node* this_object = this_it.first; |
+ ZoneHandleSet<Map> this_maps = this_it.second; |
+ auto that_it = that->info_for_node_.find(this_object); |
+ if (that_it != that->info_for_node_.end() && |
+ that_it->second == this_maps) { |
+ copy->info_for_node_.insert(this_it); |
+ } |
+ } |
+ return copy; |
+ } |
+ |
+ void Print() const; |
+ |
+ private: |
+ ZoneMap<Node*, ZoneHandleSet<Map>> info_for_node_; |
Jarin
2016/11/16 14:54:41
I am super confused about what these sets mean. I
|
+ }; |
+ |
class AbstractState final : public ZoneObject { |
public: |
AbstractState() { |
@@ -160,6 +208,11 @@ class LoadElimination final : public AdvancedReducer { |
bool Equals(AbstractState const* that) const; |
void Merge(AbstractState const* that, Zone* zone); |
+ AbstractState const* AddMaps(Node* object, ZoneHandleSet<Map> maps, |
+ Zone* zone) const; |
+ AbstractState const* KillMaps(Node* object, Zone* zone) const; |
+ ZoneHandleSet<Map> LookupMaps(Node* object) const; |
+ |
AbstractState const* AddField(Node* object, size_t index, Node* value, |
Zone* zone) const; |
AbstractState const* KillField(Node* object, size_t index, |
@@ -181,6 +234,7 @@ class LoadElimination final : public AdvancedReducer { |
AbstractChecks const* checks_ = nullptr; |
AbstractElements const* elements_ = nullptr; |
AbstractField const* fields_[kMaxTrackedFields]; |
+ AbstractMaps const* maps_ = nullptr; |
}; |
class AbstractStateForEffectNodes final : public ZoneObject { |
@@ -219,6 +273,7 @@ class LoadElimination final : public AdvancedReducer { |
CommonOperatorBuilder* common() const; |
AbstractState const* empty_state() const { return &empty_state_; } |
+ Factory* factory() const; |
Graph* graph() const; |
JSGraph* jsgraph() const { return jsgraph_; } |
Zone* zone() const { return node_states_.zone(); } |