Index: src/compiler/redundancy-elimination.h |
diff --git a/src/compiler/redundancy-elimination.h b/src/compiler/redundancy-elimination.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a4886e4b919ec296186106a502828a4076fbb185 |
--- /dev/null |
+++ b/src/compiler/redundancy-elimination.h |
@@ -0,0 +1,76 @@ |
+// Copyright 2016 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef V8_COMPILER_REDUNDANCY_ELIMINATION_H_ |
+#define V8_COMPILER_REDUNDANCY_ELIMINATION_H_ |
+ |
+#include "src/compiler/graph-reducer.h" |
+ |
+namespace v8 { |
+namespace internal { |
+namespace compiler { |
+ |
+class RedundancyElimination final : public AdvancedReducer { |
+ public: |
+ RedundancyElimination(Editor* editor, Zone* zone); |
+ ~RedundancyElimination() final; |
+ |
+ Reduction Reduce(Node* node) final; |
+ |
+ private: |
+ struct Check { |
+ Check(Node* node, Check* next) : node(node), next(next) {} |
+ Node* node; |
+ Check* next; |
+ }; |
+ |
+ class EffectPathChecks final { |
+ public: |
+ static EffectPathChecks* Copy(Zone* zone, EffectPathChecks const* checks); |
+ static EffectPathChecks const* Empty(Zone* zone); |
+ void Merge(EffectPathChecks const* that); |
+ |
+ EffectPathChecks const* AddCheck(Zone* zone, Node* node) const; |
+ Node* LookupCheck(Node* node) const; |
+ |
+ private: |
+ EffectPathChecks(Check* head, size_t size) : head_(head), size_(size) {} |
+ |
+ // We keep track of the list length so that we can find the longest |
+ // common tail easily. |
+ Check* head_; |
+ size_t size_; |
+ }; |
+ |
+ class PathChecksForEffectNodes final { |
+ public: |
+ explicit PathChecksForEffectNodes(Zone* zone) : info_for_node_(zone) {} |
+ EffectPathChecks const* Get(Node* node) const; |
+ void Set(Node* node, EffectPathChecks const* checks); |
+ |
+ private: |
+ ZoneVector<EffectPathChecks const*> info_for_node_; |
+ }; |
+ |
+ Reduction ReduceCheckNode(Node* node); |
+ Reduction ReduceEffectPhi(Node* node); |
+ Reduction ReduceStart(Node* node); |
+ Reduction ReduceOtherNode(Node* node); |
+ |
+ Reduction TakeChecksFromFirstEffect(Node* node); |
+ Reduction UpdateChecks(Node* node, EffectPathChecks const* checks); |
+ |
+ Zone* zone() const { return zone_; } |
+ |
+ PathChecksForEffectNodes node_checks_; |
+ Zone* const zone_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RedundancyElimination); |
+}; |
+ |
+} // namespace compiler |
+} // namespace internal |
+} // namespace v8 |
+ |
+#endif // V8_COMPILER_REDUNDANCY_ELIMINATION_H_ |