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 <vector> | 8 #include <vector> |
9 | 9 |
10 #include "src/v8.h" | 10 #include "src/v8.h" |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 // by the graph's dependencies. A schedule is required to generate code. | 156 // by the graph's dependencies. A schedule is required to generate code. |
157 class Schedule : public GenericGraph<BasicBlock> { | 157 class Schedule : public GenericGraph<BasicBlock> { |
158 public: | 158 public: |
159 explicit Schedule(Zone* zone) | 159 explicit Schedule(Zone* zone) |
160 : GenericGraph<BasicBlock>(zone), | 160 : GenericGraph<BasicBlock>(zone), |
161 zone_(zone), | 161 zone_(zone), |
162 all_blocks_(BasicBlockVector::allocator_type(zone)), | 162 all_blocks_(BasicBlockVector::allocator_type(zone)), |
163 nodeid_to_block_(BasicBlockVector::allocator_type(zone)), | 163 nodeid_to_block_(BasicBlockVector::allocator_type(zone)), |
164 rpo_order_(BasicBlockVector::allocator_type(zone)), | 164 rpo_order_(BasicBlockVector::allocator_type(zone)), |
165 immediate_dominator_(BasicBlockVector::allocator_type(zone)) { | 165 immediate_dominator_(BasicBlockVector::allocator_type(zone)) { |
166 NewBasicBlock(); // entry. | 166 SetStart(NewBasicBlock()); // entry. |
167 NewBasicBlock(); // exit. | 167 SetEnd(NewBasicBlock()); // exit. |
168 SetStart(entry()); | |
169 SetEnd(exit()); | |
170 } | 168 } |
171 | 169 |
172 // TODO(titzer): rewrite users of these methods to use start() and end(). | |
173 BasicBlock* entry() const { return all_blocks_[0]; } // Return entry block. | |
174 BasicBlock* exit() const { return all_blocks_[1]; } // Return exit block. | |
175 | |
176 // Return the block which contains {node}, if any. | 170 // Return the block which contains {node}, if any. |
177 BasicBlock* block(Node* node) const { | 171 BasicBlock* block(Node* node) const { |
178 if (node->id() < static_cast<NodeId>(nodeid_to_block_.size())) { | 172 if (node->id() < static_cast<NodeId>(nodeid_to_block_.size())) { |
179 return nodeid_to_block_[node->id()]; | 173 return nodeid_to_block_[node->id()]; |
180 } | 174 } |
181 return NULL; | 175 return NULL; |
182 } | 176 } |
183 | 177 |
184 BasicBlock* dominator(BasicBlock* block) { | 178 BasicBlock* dominator(BasicBlock* block) { |
185 return immediate_dominator_[block->id()]; | 179 return immediate_dominator_[block->id()]; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 AddSuccessor(block, fblock); | 260 AddSuccessor(block, fblock); |
267 SetControlInput(block, branch); | 261 SetControlInput(block, branch); |
268 } | 262 } |
269 | 263 |
270 // BasicBlock building: add a return at the end of {block}. | 264 // BasicBlock building: add a return at the end of {block}. |
271 void AddReturn(BasicBlock* block, Node* input) { | 265 void AddReturn(BasicBlock* block, Node* input) { |
272 // TODO(titzer): require a Return node here. | 266 // TODO(titzer): require a Return node here. |
273 DCHECK(block->control_ == BasicBlock::kNone); | 267 DCHECK(block->control_ == BasicBlock::kNone); |
274 block->control_ = BasicBlock::kReturn; | 268 block->control_ = BasicBlock::kReturn; |
275 SetControlInput(block, input); | 269 SetControlInput(block, input); |
276 if (block != exit()) AddSuccessor(block, exit()); | 270 if (block != end()) AddSuccessor(block, end()); |
277 } | 271 } |
278 | 272 |
279 // BasicBlock building: add a throw at the end of {block}. | 273 // BasicBlock building: add a throw at the end of {block}. |
280 void AddThrow(BasicBlock* block, Node* input) { | 274 void AddThrow(BasicBlock* block, Node* input) { |
281 DCHECK(block->control_ == BasicBlock::kNone); | 275 DCHECK(block->control_ == BasicBlock::kNone); |
282 block->control_ = BasicBlock::kThrow; | 276 block->control_ = BasicBlock::kThrow; |
283 SetControlInput(block, input); | 277 SetControlInput(block, input); |
284 if (block != exit()) AddSuccessor(block, exit()); | 278 if (block != end()) AddSuccessor(block, end()); |
285 } | 279 } |
286 | 280 |
287 // BasicBlock building: add a deopt at the end of {block}. | 281 // BasicBlock building: add a deopt at the end of {block}. |
288 void AddDeoptimize(BasicBlock* block, Node* state) { | 282 void AddDeoptimize(BasicBlock* block, Node* state) { |
289 DCHECK(block->control_ == BasicBlock::kNone); | 283 DCHECK(block->control_ == BasicBlock::kNone); |
290 block->control_ = BasicBlock::kDeoptimize; | 284 block->control_ = BasicBlock::kDeoptimize; |
291 SetControlInput(block, state); | 285 SetControlInput(block, state); |
292 block->deferred_ = true; // By default, consider deopts the slow path. | 286 block->deferred_ = true; // By default, consider deopts the slow path. |
293 if (block != exit()) AddSuccessor(block, exit()); | 287 if (block != end()) AddSuccessor(block, end()); |
294 } | 288 } |
295 | 289 |
296 friend class Scheduler; | 290 friend class Scheduler; |
297 friend class CodeGenerator; | 291 friend class CodeGenerator; |
298 | 292 |
299 void AddSuccessor(BasicBlock* block, BasicBlock* succ) { | 293 void AddSuccessor(BasicBlock* block, BasicBlock* succ) { |
300 succ->AppendInput(zone_, block); | 294 succ->AppendInput(zone_, block); |
301 } | 295 } |
302 | 296 |
303 BasicBlockVector* rpo_order() { return &rpo_order_; } | 297 BasicBlockVector* rpo_order() { return &rpo_order_; } |
(...skipping 22 matching lines...) Expand all Loading... |
326 // dominator, indexed by block | 320 // dominator, indexed by block |
327 // id. | 321 // id. |
328 }; | 322 }; |
329 | 323 |
330 OStream& operator<<(OStream& os, const Schedule& s); | 324 OStream& operator<<(OStream& os, const Schedule& s); |
331 } | 325 } |
332 } | 326 } |
333 } // namespace v8::internal::compiler | 327 } // namespace v8::internal::compiler |
334 | 328 |
335 #endif // V8_COMPILER_SCHEDULE_H_ | 329 #endif // V8_COMPILER_SCHEDULE_H_ |
OLD | NEW |