• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_COMPILER_REDUNDANCY_ELIMINATION_H_
6 #define V8_COMPILER_REDUNDANCY_ELIMINATION_H_
7 
8 #include "src/compiler/graph-reducer.h"
9 
10 namespace v8 {
11 namespace internal {
12 namespace compiler {
13 
14 class RedundancyElimination final : public AdvancedReducer {
15  public:
16   RedundancyElimination(Editor* editor, Zone* zone);
17   ~RedundancyElimination() final;
18 
reducer_name()19   const char* reducer_name() const override { return "RedundancyElimination"; }
20 
21   Reduction Reduce(Node* node) final;
22 
23  private:
24   struct Check {
CheckCheck25     Check(Node* node, Check* next) : node(node), next(next) {}
26     Node* node;
27     Check* next;
28   };
29 
30   class EffectPathChecks final {
31    public:
32     static EffectPathChecks* Copy(Zone* zone, EffectPathChecks const* checks);
33     static EffectPathChecks const* Empty(Zone* zone);
34     bool Equals(EffectPathChecks const* that) const;
35     void Merge(EffectPathChecks const* that);
36 
37     EffectPathChecks const* AddCheck(Zone* zone, Node* node) const;
38     Node* LookupCheck(Node* node) const;
39     Node* LookupBoundsCheckFor(Node* node) const;
40 
41    private:
EffectPathChecks(Check * head,size_t size)42     EffectPathChecks(Check* head, size_t size) : head_(head), size_(size) {}
43 
44     // We keep track of the list length so that we can find the longest
45     // common tail easily.
46     Check* head_;
47     size_t size_;
48   };
49 
50   class PathChecksForEffectNodes final {
51    public:
PathChecksForEffectNodes(Zone * zone)52     explicit PathChecksForEffectNodes(Zone* zone) : info_for_node_(zone) {}
53     EffectPathChecks const* Get(Node* node) const;
54     void Set(Node* node, EffectPathChecks const* checks);
55 
56    private:
57     ZoneVector<EffectPathChecks const*> info_for_node_;
58   };
59 
60   Reduction ReduceCheckNode(Node* node);
61   Reduction ReduceEffectPhi(Node* node);
62   Reduction ReduceStart(Node* node);
63   Reduction ReduceOtherNode(Node* node);
64 
65   Reduction TakeChecksFromFirstEffect(Node* node);
66   Reduction UpdateChecks(Node* node, EffectPathChecks const* checks);
67 
68   Reduction TryReuseBoundsCheckForFirstInput(Node* node);
69 
zone()70   Zone* zone() const { return zone_; }
71 
72   PathChecksForEffectNodes node_checks_;
73   Zone* const zone_;
74 
75   DISALLOW_COPY_AND_ASSIGN(RedundancyElimination);
76 };
77 
78 }  // namespace compiler
79 }  // namespace internal
80 }  // namespace v8
81 
82 #endif  // V8_COMPILER_REDUNDANCY_ELIMINATION_H_
83