| Index: src/compiler/load-elimination.h
|
| diff --git a/src/compiler/load-elimination.h b/src/compiler/load-elimination.h
|
| index 50979e4da8cba8fdd1d802506bdc3f90ec90889e..cd486a2cd780820b291b8fbb88b606392155d9a6 100644
|
| --- a/src/compiler/load-elimination.h
|
| +++ b/src/compiler/load-elimination.h
|
| @@ -8,9 +8,14 @@
|
| #include "src/base/compiler-specific.h"
|
| #include "src/compiler/graph-reducer.h"
|
| #include "src/globals.h"
|
| +#include "src/zone/zone-handle-set.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| +
|
| +// Forward declarations.
|
| +class Factory;
|
| +
|
| namespace compiler {
|
|
|
| // Foward declarations.
|
| @@ -152,6 +157,49 @@ class V8_EXPORT_PRIVATE LoadElimination final
|
|
|
| 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;
|
| + }
|
| + bool Lookup(Node* object, ZoneHandleSet<Map>* object_maps) 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_;
|
| + };
|
| +
|
| class AbstractState final : public ZoneObject {
|
| public:
|
| AbstractState() {
|
| @@ -163,6 +211,11 @@ class V8_EXPORT_PRIVATE LoadElimination final
|
| 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;
|
| + bool LookupMaps(Node* object, ZoneHandleSet<Map>* object_maps) const;
|
| +
|
| AbstractState const* AddField(Node* object, size_t index, Node* value,
|
| Zone* zone) const;
|
| AbstractState const* KillField(Node* object, size_t index,
|
| @@ -185,6 +238,7 @@ class V8_EXPORT_PRIVATE LoadElimination final
|
| AbstractChecks const* checks_ = nullptr;
|
| AbstractElements const* elements_ = nullptr;
|
| AbstractField const* fields_[kMaxTrackedFields];
|
| + AbstractMaps const* maps_ = nullptr;
|
| };
|
|
|
| class AbstractStateForEffectNodes final : public ZoneObject {
|
| @@ -223,6 +277,7 @@ class V8_EXPORT_PRIVATE LoadElimination final
|
|
|
| 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(); }
|
|
|