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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 explicit BasicBlockData(Zone* zone) | 56 explicit BasicBlockData(Zone* zone) |
57 : rpo_number_(-1), | 57 : rpo_number_(-1), |
58 loop_header_(NULL), | 58 loop_header_(NULL), |
59 loop_depth_(0), | 59 loop_depth_(0), |
60 loop_end_(-1), | 60 loop_end_(-1), |
61 code_start_(-1), | 61 code_start_(-1), |
62 code_end_(-1), | 62 code_end_(-1), |
63 deferred_(false), | 63 deferred_(false), |
64 control_(kNone), | 64 control_(kNone), |
65 control_input_(NULL), | 65 control_input_(NULL), |
66 nodes_(NodeVector::allocator_type(zone)) {} | 66 nodes_(zone) {} |
67 | 67 |
68 inline bool IsLoopHeader() const { return loop_end_ >= 0; } | 68 inline bool IsLoopHeader() const { return loop_end_ >= 0; } |
69 inline bool LoopContains(BasicBlockData* block) const { | 69 inline bool LoopContains(BasicBlockData* block) const { |
70 // RPO numbers must be initialized. | 70 // RPO numbers must be initialized. |
71 DCHECK(rpo_number_ >= 0); | 71 DCHECK(rpo_number_ >= 0); |
72 DCHECK(block->rpo_number_ >= 0); | 72 DCHECK(block->rpo_number_ >= 0); |
73 if (loop_end_ < 0) return false; // This is not a loop. | 73 if (loop_end_ < 0) return false; // This is not a loop. |
74 return block->rpo_number_ >= rpo_number_ && block->rpo_number_ < loop_end_; | 74 return block->rpo_number_ >= rpo_number_ && block->rpo_number_ < loop_end_; |
75 } | 75 } |
76 int first_instruction_index() { | 76 int first_instruction_index() { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 reverse_iterator rbegin() { return nodes_.rbegin(); } | 138 reverse_iterator rbegin() { return nodes_.rbegin(); } |
139 reverse_iterator rend() { return nodes_.rend(); } | 139 reverse_iterator rend() { return nodes_.rend(); } |
140 | 140 |
141 private: | 141 private: |
142 DISALLOW_COPY_AND_ASSIGN(BasicBlock); | 142 DISALLOW_COPY_AND_ASSIGN(BasicBlock); |
143 }; | 143 }; |
144 | 144 |
145 typedef GenericGraphVisit::NullNodeVisitor<BasicBlockData, BasicBlock> | 145 typedef GenericGraphVisit::NullNodeVisitor<BasicBlockData, BasicBlock> |
146 NullBasicBlockVisitor; | 146 NullBasicBlockVisitor; |
147 | 147 |
148 typedef zone_allocator<BasicBlock*> BasicBlockPtrZoneAllocator; | 148 typedef ZoneVector<BasicBlock*> BasicBlockVector; |
149 typedef std::vector<BasicBlock*, BasicBlockPtrZoneAllocator> BasicBlockVector; | |
150 typedef BasicBlockVector::iterator BasicBlockVectorIter; | 149 typedef BasicBlockVector::iterator BasicBlockVectorIter; |
151 typedef BasicBlockVector::reverse_iterator BasicBlockVectorRIter; | 150 typedef BasicBlockVector::reverse_iterator BasicBlockVectorRIter; |
152 | 151 |
153 // A schedule represents the result of assigning nodes to basic blocks | 152 // A schedule represents the result of assigning nodes to basic blocks |
154 // and ordering them within basic blocks. Prior to computing a schedule, | 153 // and ordering them within basic blocks. Prior to computing a schedule, |
155 // a graph has no notion of control flow ordering other than that induced | 154 // a graph has no notion of control flow ordering other than that induced |
156 // by the graph's dependencies. A schedule is required to generate code. | 155 // by the graph's dependencies. A schedule is required to generate code. |
157 class Schedule : public GenericGraph<BasicBlock> { | 156 class Schedule : public GenericGraph<BasicBlock> { |
158 public: | 157 public: |
159 explicit Schedule(Zone* zone) | 158 explicit Schedule(Zone* zone) |
160 : GenericGraph<BasicBlock>(zone), | 159 : GenericGraph<BasicBlock>(zone), |
161 zone_(zone), | 160 zone_(zone), |
162 all_blocks_(BasicBlockVector::allocator_type(zone)), | 161 all_blocks_(zone), |
163 nodeid_to_block_(BasicBlockVector::allocator_type(zone)), | 162 nodeid_to_block_(zone), |
164 rpo_order_(BasicBlockVector::allocator_type(zone)), | 163 rpo_order_(zone), |
165 immediate_dominator_(BasicBlockVector::allocator_type(zone)) { | 164 immediate_dominator_(zone) { |
166 SetStart(NewBasicBlock()); // entry. | 165 SetStart(NewBasicBlock()); // entry. |
167 SetEnd(NewBasicBlock()); // exit. | 166 SetEnd(NewBasicBlock()); // exit. |
168 } | 167 } |
169 | 168 |
170 // Return the block which contains {node}, if any. | 169 // Return the block which contains {node}, if any. |
171 BasicBlock* block(Node* node) const { | 170 BasicBlock* block(Node* node) const { |
172 if (node->id() < static_cast<NodeId>(nodeid_to_block_.size())) { | 171 if (node->id() < static_cast<NodeId>(nodeid_to_block_.size())) { |
173 return nodeid_to_block_[node->id()]; | 172 return nodeid_to_block_[node->id()]; |
174 } | 173 } |
175 return NULL; | 174 return NULL; |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 // dominator, indexed by block | 319 // dominator, indexed by block |
321 // id. | 320 // id. |
322 }; | 321 }; |
323 | 322 |
324 OStream& operator<<(OStream& os, const Schedule& s); | 323 OStream& operator<<(OStream& os, const Schedule& s); |
325 } | 324 } |
326 } | 325 } |
327 } // namespace v8::internal::compiler | 326 } // namespace v8::internal::compiler |
328 | 327 |
329 #endif // V8_COMPILER_SCHEDULE_H_ | 328 #endif // V8_COMPILER_SCHEDULE_H_ |
OLD | NEW |