Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(114)

Unified Diff: src/compiler/store-store-elimination.h

Issue 2159303002: [turbofan] Improve the store-store elimination. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@p1-base
Patch Set: Silence silly compiler warnings. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/compiler/store-store-elimination.h
diff --git a/src/compiler/store-store-elimination.h b/src/compiler/store-store-elimination.h
index 1c9ae3dbeb8c237f3cabec02d7b2204b8bd5e1ac..3681aaaccff40f4c920ef8447bea64cb6a7e8bb2 100644
--- a/src/compiler/store-store-elimination.h
+++ b/src/compiler/store-store-elimination.h
@@ -8,29 +8,93 @@
#include "src/compiler/common-operator.h"
#include "src/compiler/graph-reducer.h"
#include "src/compiler/js-graph.h"
+#include "src/zone-containers.h"
namespace v8 {
namespace internal {
namespace compiler {
-// Forward declarations.
-class CommonOperatorBuilder;
-class JSGraph;
-
class StoreStoreElimination final {
public:
- StoreStoreElimination(JSGraph* js_graph, Zone* temp_zone);
- ~StoreStoreElimination();
- void Run();
+ static void Run(JSGraph* js_graph, Zone* temp_zone);
+};
Jarin 2016/07/20 11:43:33 All the stuff below should go to the .cc file sinc
bgeron 2016/07/20 16:27:17 Done. I put it in an anonymous namespace.
+
+// 16 bits was chosen fairly arbitrarily; it seems enough now. 8 bits is too
+// few.
+typedef uint16_t StoreOffset;
+
+struct StoreObservation {
Jarin 2016/07/20 11:43:33 The name is a bit confusing because it seems to de
bgeron 2016/07/20 16:27:17 Changed to UnobservableStore.
+ NodeId id_;
+ StoreOffset offset_;
+};
+
+bool operator==(StoreObservation, StoreObservation);
+bool operator<(StoreObservation, StoreObservation);
+std::ostream& operator<<(std::ostream&, StoreObservation);
+
+// Instances of UnobservablesSet are immutable. They represent either a set of
+// StoreObservations, or the "undetermined empty set".
+//
+// The size of an instance should be the size of a pointer, plus additional
+// space in the zone for determined UnobservablesSets. Copying an
+// UnobservablesSet allocates no memory.
+class UnobservablesSet final {
+ public:
+ static UnobservablesSet Undetermined();
+ static UnobservablesSet DeterminedEmpty(Zone* zone);
+ UnobservablesSet(); // undetermined
+ UnobservablesSet(const UnobservablesSet& other) : set_(other.set_) {}
+ ~UnobservablesSet() {}
Jarin 2016/07/20 11:43:33 Why is the destructor here?
bgeron 2016/07/20 16:27:17 Because I thought that the implicitly generated de
+
+ UnobservablesSet Intersect(UnobservablesSet other, Zone* zone) const;
+ UnobservablesSet Add(StoreObservation obs, Zone* zone) const;
+ UnobservablesSet RemoveSameOffset(StoreOffset off, Zone* zone) const;
+
+ const ZoneSet<StoreObservation>* set() const { return set_; }
+
+ bool IsUndetermined() const { return set_ == nullptr; }
+ bool IsEmpty() const { return set_ == nullptr || set_->empty(); }
+ bool Contains(StoreObservation obs) const {
+ return set_ != nullptr && (set_->find(obs) != set_->end());
+ }
+
+ bool operator==(const UnobservablesSet& other) const;
+ bool operator!=(const UnobservablesSet& other) const;
+
+ private:
+ explicit UnobservablesSet(const ZoneSet<StoreObservation>* set) : set_(set) {}
+ const ZoneSet<StoreObservation>* set_;
+};
+
+std::ostream& operator<<(std::ostream& os, UnobservablesSet set);
+
+class StoreStoreFinder final : public AdvancedReducer {
+ public:
+ StoreStoreFinder(Editor* editor, JSGraph* js_graph, Zone* temp_zone);
+ ~StoreStoreFinder();
+
+ const ZoneSet<Node*>& to_remove_const() { return to_remove_; }
+
+ virtual Reduction Reduce(Node* node);
Jarin 2016/07/20 11:43:33 I have difficulty understanding why this is a redu
bgeron 2016/07/20 16:27:17 Changed as discussed.
private:
static bool IsEligibleNode(Node* node);
- void ReduceEligibleNode(Node* node);
+ Reduction ReduceEligibleNode(Node* node);
+ UnobservablesSet RecomputeUseIntersection(Node* node);
+ UnobservablesSet RecomputeSet(Node* node, UnobservablesSet uses);
+ static bool CanObserveNothing(Node* node);
+ static bool CanObserveAnything(Node* node);
+
JSGraph* jsgraph() const { return jsgraph_; }
Zone* temp_zone() const { return temp_zone_; }
+ ZoneVector<UnobservablesSet>& unobservable() { return unobservable_; }
+ ZoneSet<Node*>& to_remove() { return to_remove_; }
JSGraph* const jsgraph_;
Zone* const temp_zone_;
+ // Maps node IDs to UnobservableNodeSets.
+ ZoneVector<UnobservablesSet> unobservable_;
+ ZoneSet<Node*> to_remove_;
};
} // namespace compiler

Powered by Google App Engine
This is Rietveld 408576698