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 #include "src/compiler/schedule.h" | 5 #include "src/compiler/schedule.h" |
6 | 6 |
7 #include "src/compiler/node.h" | 7 #include "src/compiler/node.h" |
8 #include "src/compiler/node-properties.h" | 8 #include "src/compiler/node-properties.h" |
9 #include "src/ostreams.h" | 9 #include "src/ostreams.h" |
10 | 10 |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 | 95 |
96 | 96 |
97 std::ostream& operator<<(std::ostream& os, const BasicBlock::Control& c) { | 97 std::ostream& operator<<(std::ostream& os, const BasicBlock::Control& c) { |
98 switch (c) { | 98 switch (c) { |
99 case BasicBlock::kNone: | 99 case BasicBlock::kNone: |
100 return os << "none"; | 100 return os << "none"; |
101 case BasicBlock::kGoto: | 101 case BasicBlock::kGoto: |
102 return os << "goto"; | 102 return os << "goto"; |
103 case BasicBlock::kBranch: | 103 case BasicBlock::kBranch: |
104 return os << "branch"; | 104 return os << "branch"; |
| 105 case BasicBlock::kSwitch: |
| 106 return os << "switch"; |
105 case BasicBlock::kReturn: | 107 case BasicBlock::kReturn: |
106 return os << "return"; | 108 return os << "return"; |
107 case BasicBlock::kThrow: | 109 case BasicBlock::kThrow: |
108 return os << "throw"; | 110 return os << "throw"; |
109 } | 111 } |
110 UNREACHABLE(); | 112 UNREACHABLE(); |
111 return os; | 113 return os; |
112 } | 114 } |
113 | 115 |
114 | 116 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 BasicBlock* fblock) { | 204 BasicBlock* fblock) { |
203 DCHECK(block->control() == BasicBlock::kNone); | 205 DCHECK(block->control() == BasicBlock::kNone); |
204 DCHECK(branch->opcode() == IrOpcode::kBranch); | 206 DCHECK(branch->opcode() == IrOpcode::kBranch); |
205 block->set_control(BasicBlock::kBranch); | 207 block->set_control(BasicBlock::kBranch); |
206 AddSuccessor(block, tblock); | 208 AddSuccessor(block, tblock); |
207 AddSuccessor(block, fblock); | 209 AddSuccessor(block, fblock); |
208 SetControlInput(block, branch); | 210 SetControlInput(block, branch); |
209 } | 211 } |
210 | 212 |
211 | 213 |
| 214 void Schedule::AddSwitch(BasicBlock* block, Node* sw, BasicBlock** succ_blocks, |
| 215 size_t succ_count) { |
| 216 DCHECK_EQ(BasicBlock::kNone, block->control()); |
| 217 DCHECK_EQ(IrOpcode::kSwitch, sw->opcode()); |
| 218 block->set_control(BasicBlock::kSwitch); |
| 219 for (size_t index = 0; index < succ_count; ++index) { |
| 220 AddSuccessor(block, succ_blocks[index]); |
| 221 } |
| 222 SetControlInput(block, sw); |
| 223 } |
| 224 |
| 225 |
212 void Schedule::AddReturn(BasicBlock* block, Node* input) { | 226 void Schedule::AddReturn(BasicBlock* block, Node* input) { |
213 DCHECK(block->control() == BasicBlock::kNone); | 227 DCHECK(block->control() == BasicBlock::kNone); |
214 block->set_control(BasicBlock::kReturn); | 228 block->set_control(BasicBlock::kReturn); |
215 SetControlInput(block, input); | 229 SetControlInput(block, input); |
216 if (block != end()) AddSuccessor(block, end()); | 230 if (block != end()) AddSuccessor(block, end()); |
217 } | 231 } |
218 | 232 |
219 | 233 |
220 void Schedule::AddThrow(BasicBlock* block, Node* input) { | 234 void Schedule::AddThrow(BasicBlock* block, Node* input) { |
221 DCHECK(block->control() == BasicBlock::kNone); | 235 DCHECK(block->control() == BasicBlock::kNone); |
222 block->set_control(BasicBlock::kThrow); | 236 block->set_control(BasicBlock::kThrow); |
223 SetControlInput(block, input); | 237 SetControlInput(block, input); |
224 if (block != end()) AddSuccessor(block, end()); | 238 if (block != end()) AddSuccessor(block, end()); |
225 } | 239 } |
226 | 240 |
227 | 241 |
228 void Schedule::InsertBranch(BasicBlock* block, BasicBlock* end, Node* branch, | 242 void Schedule::InsertBranch(BasicBlock* block, BasicBlock* end, Node* branch, |
229 BasicBlock* tblock, BasicBlock* fblock) { | 243 BasicBlock* tblock, BasicBlock* fblock) { |
230 DCHECK(block->control() != BasicBlock::kNone); | 244 DCHECK(block->control() != BasicBlock::kNone); |
231 DCHECK(end->control() == BasicBlock::kNone); | 245 DCHECK(end->control() == BasicBlock::kNone); |
232 end->set_control(block->control()); | 246 end->set_control(block->control()); |
233 block->set_control(BasicBlock::kBranch); | 247 block->set_control(BasicBlock::kBranch); |
234 MoveSuccessors(block, end); | 248 MoveSuccessors(block, end); |
235 AddSuccessor(block, tblock); | 249 AddSuccessor(block, tblock); |
236 AddSuccessor(block, fblock); | 250 AddSuccessor(block, fblock); |
237 if (block->control_input() != NULL) { | 251 if (block->control_input() != nullptr) { |
238 SetControlInput(end, block->control_input()); | 252 SetControlInput(end, block->control_input()); |
239 } | 253 } |
240 SetControlInput(block, branch); | 254 SetControlInput(block, branch); |
241 } | 255 } |
242 | 256 |
243 | 257 |
| 258 void Schedule::InsertSwitch(BasicBlock* block, BasicBlock* end, Node* sw, |
| 259 BasicBlock** succ_blocks, size_t succ_count) { |
| 260 DCHECK_NE(BasicBlock::kNone, block->control()); |
| 261 DCHECK_EQ(BasicBlock::kNone, end->control()); |
| 262 end->set_control(block->control()); |
| 263 block->set_control(BasicBlock::kSwitch); |
| 264 MoveSuccessors(block, end); |
| 265 for (size_t index = 0; index < succ_count; ++index) { |
| 266 AddSuccessor(block, succ_blocks[index]); |
| 267 } |
| 268 if (block->control_input() != nullptr) { |
| 269 SetControlInput(end, block->control_input()); |
| 270 } |
| 271 SetControlInput(block, sw); |
| 272 } |
| 273 |
| 274 |
244 void Schedule::AddSuccessor(BasicBlock* block, BasicBlock* succ) { | 275 void Schedule::AddSuccessor(BasicBlock* block, BasicBlock* succ) { |
245 block->AddSuccessor(succ); | 276 block->AddSuccessor(succ); |
246 succ->AddPredecessor(block); | 277 succ->AddPredecessor(block); |
247 } | 278 } |
248 | 279 |
249 | 280 |
250 void Schedule::MoveSuccessors(BasicBlock* from, BasicBlock* to) { | 281 void Schedule::MoveSuccessors(BasicBlock* from, BasicBlock* to) { |
251 for (BasicBlock* const successor : from->successors()) { | 282 for (BasicBlock* const successor : from->successors()) { |
252 to->AddSuccessor(successor); | 283 to->AddSuccessor(successor); |
253 for (BasicBlock*& predecessor : successor->predecessors()) { | 284 for (BasicBlock*& predecessor : successor->predecessors()) { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 } | 346 } |
316 os << "\n"; | 347 os << "\n"; |
317 } | 348 } |
318 } | 349 } |
319 return os; | 350 return os; |
320 } | 351 } |
321 | 352 |
322 } // namespace compiler | 353 } // namespace compiler |
323 } // namespace internal | 354 } // namespace internal |
324 } // namespace v8 | 355 } // namespace v8 |
OLD | NEW |