OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_COMPILER_SCHEDULE_H_ | 5 #ifndef V8_COMPILER_SCHEDULE_H_ |
6 #define V8_COMPILER_SCHEDULE_H_ | 6 #define V8_COMPILER_SCHEDULE_H_ |
7 | 7 |
8 #include <iosfwd> | 8 #include <iosfwd> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 int ToInt() const { return static_cast<int>(index_); } | 43 int ToInt() const { return static_cast<int>(index_); } |
44 size_t ToSize() const { return index_; } | 44 size_t ToSize() const { return index_; } |
45 static Id FromSize(size_t index) { return Id(index); } | 45 static Id FromSize(size_t index) { return Id(index); } |
46 static Id FromInt(int index) { return Id(static_cast<size_t>(index)); } | 46 static Id FromInt(int index) { return Id(static_cast<size_t>(index)); } |
47 | 47 |
48 private: | 48 private: |
49 explicit Id(size_t index) : index_(index) {} | 49 explicit Id(size_t index) : index_(index) {} |
50 size_t index_; | 50 size_t index_; |
51 }; | 51 }; |
52 | 52 |
| 53 static const int kInvalidRpoNumber = -1; |
53 class RpoNumber FINAL { | 54 class RpoNumber FINAL { |
54 public: | 55 public: |
55 int ToInt() const { return static_cast<int>(index_); } | 56 int ToInt() const { |
56 size_t ToSize() const { return index_; } | 57 DCHECK(IsValid()); |
57 static RpoNumber FromInt(int index) { | 58 return index_; |
58 return RpoNumber(static_cast<size_t>(index)); | |
59 } | 59 } |
60 static RpoNumber Invalid() { return RpoNumber(static_cast<size_t>(-1)); } | 60 size_t ToSize() const { |
| 61 DCHECK(IsValid()); |
| 62 return static_cast<size_t>(index_); |
| 63 } |
| 64 bool IsValid() const { return index_ != kInvalidRpoNumber; } |
| 65 static RpoNumber FromInt(int index) { return RpoNumber(index); } |
| 66 static RpoNumber Invalid() { return RpoNumber(kInvalidRpoNumber); } |
61 | 67 |
62 bool IsNext(const RpoNumber other) const { | 68 bool IsNext(const RpoNumber other) const { |
| 69 DCHECK(IsValid()); |
63 return other.index_ == this->index_ + 1; | 70 return other.index_ == this->index_ + 1; |
64 } | 71 } |
65 | 72 |
| 73 bool operator==(RpoNumber other) const { |
| 74 return this->index_ == other.index_; |
| 75 } |
| 76 |
66 private: | 77 private: |
67 explicit RpoNumber(size_t index) : index_(index) {} | 78 explicit RpoNumber(int32_t index) : index_(index) {} |
68 size_t index_; | 79 int32_t index_; |
69 }; | 80 }; |
70 | 81 |
71 BasicBlock(Zone* zone, Id id); | 82 BasicBlock(Zone* zone, Id id); |
72 | 83 |
73 Id id() const { return id_; } | 84 Id id() const { return id_; } |
74 | 85 |
75 // Predecessors and successors. | 86 // Predecessors and successors. |
76 typedef ZoneVector<BasicBlock*> Predecessors; | 87 typedef ZoneVector<BasicBlock*> Predecessors; |
77 Predecessors::iterator predecessors_begin() { return predecessors_.begin(); } | 88 Predecessors::iterator predecessors_begin() { return predecessors_.begin(); } |
78 Predecessors::iterator predecessors_end() { return predecessors_.end(); } | 89 Predecessors::iterator predecessors_end() { return predecessors_.end(); } |
| 90 Predecessors::const_iterator predecessors_begin() const { |
| 91 return predecessors_.begin(); |
| 92 } |
| 93 Predecessors::const_iterator predecessors_end() const { |
| 94 return predecessors_.end(); |
| 95 } |
79 size_t PredecessorCount() const { return predecessors_.size(); } | 96 size_t PredecessorCount() const { return predecessors_.size(); } |
80 BasicBlock* PredecessorAt(size_t index) { return predecessors_[index]; } | 97 BasicBlock* PredecessorAt(size_t index) { return predecessors_[index]; } |
81 size_t PredecessorIndexOf(BasicBlock* predecessor); | |
82 void AddPredecessor(BasicBlock* predecessor); | 98 void AddPredecessor(BasicBlock* predecessor); |
83 | 99 |
84 typedef ZoneVector<BasicBlock*> Successors; | 100 typedef ZoneVector<BasicBlock*> Successors; |
85 Successors::iterator successors_begin() { return successors_.begin(); } | 101 Successors::iterator successors_begin() { return successors_.begin(); } |
86 Successors::iterator successors_end() { return successors_.end(); } | 102 Successors::iterator successors_end() { return successors_.end(); } |
| 103 Successors::const_iterator successors_begin() const { |
| 104 return successors_.begin(); |
| 105 } |
| 106 Successors::const_iterator successors_end() const { |
| 107 return successors_.end(); |
| 108 } |
87 size_t SuccessorCount() const { return successors_.size(); } | 109 size_t SuccessorCount() const { return successors_.size(); } |
88 BasicBlock* SuccessorAt(size_t index) { return successors_[index]; } | 110 BasicBlock* SuccessorAt(size_t index) { return successors_[index]; } |
89 void AddSuccessor(BasicBlock* successor); | 111 void AddSuccessor(BasicBlock* successor); |
90 | 112 |
91 // Nodes in the basic block. | 113 // Nodes in the basic block. |
92 Node* NodeAt(size_t index) { return nodes_[index]; } | 114 Node* NodeAt(size_t index) { return nodes_[index]; } |
93 size_t NodeCount() const { return nodes_.size(); } | 115 size_t NodeCount() const { return nodes_.size(); } |
94 | 116 |
95 typedef NodeVector::iterator iterator; | 117 typedef NodeVector::iterator iterator; |
96 iterator begin() { return nodes_.begin(); } | 118 iterator begin() { return nodes_.begin(); } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 int32_t loop_end() const { return loop_end_; } | 152 int32_t loop_end() const { return loop_end_; } |
131 void set_loop_end(int32_t loop_end); | 153 void set_loop_end(int32_t loop_end); |
132 | 154 |
133 RpoNumber GetRpoNumber() const { return RpoNumber::FromInt(rpo_number_); } | 155 RpoNumber GetRpoNumber() const { return RpoNumber::FromInt(rpo_number_); } |
134 int32_t rpo_number() const { return rpo_number_; } | 156 int32_t rpo_number() const { return rpo_number_; } |
135 void set_rpo_number(int32_t rpo_number); | 157 void set_rpo_number(int32_t rpo_number); |
136 | 158 |
137 // Loop membership helpers. | 159 // Loop membership helpers. |
138 inline bool IsLoopHeader() const { return loop_end_ >= 0; } | 160 inline bool IsLoopHeader() const { return loop_end_ >= 0; } |
139 bool LoopContains(BasicBlock* block) const; | 161 bool LoopContains(BasicBlock* block) const; |
140 BasicBlock* ContainingLoop(); | |
141 | 162 |
142 private: | 163 private: |
143 int32_t rpo_number_; // special RPO number of the block. | 164 int32_t rpo_number_; // special RPO number of the block. |
144 BasicBlock* dominator_; // Immediate dominator of the block. | 165 BasicBlock* dominator_; // Immediate dominator of the block. |
145 BasicBlock* loop_header_; // Pointer to dominating loop header basic block, | 166 BasicBlock* loop_header_; // Pointer to dominating loop header basic block, |
146 // NULL if none. For loop headers, this points to | 167 // NULL if none. For loop headers, this points to |
147 // enclosing loop header. | 168 // enclosing loop header. |
148 int32_t loop_depth_; // loop nesting, 0 is top-level | 169 int32_t loop_depth_; // loop nesting, 0 is top-level |
149 int32_t loop_end_; // end of the loop, if this block is a loop header. | 170 int32_t loop_end_; // end of the loop, if this block is a loop header. |
150 | 171 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 BasicBlock* end_; | 257 BasicBlock* end_; |
237 }; | 258 }; |
238 | 259 |
239 std::ostream& operator<<(std::ostream& os, const Schedule& s); | 260 std::ostream& operator<<(std::ostream& os, const Schedule& s); |
240 | 261 |
241 } // namespace compiler | 262 } // namespace compiler |
242 } // namespace internal | 263 } // namespace internal |
243 } // namespace v8 | 264 } // namespace v8 |
244 | 265 |
245 #endif // V8_COMPILER_SCHEDULE_H_ | 266 #endif // V8_COMPILER_SCHEDULE_H_ |
OLD | NEW |