Chromium Code Reviews| 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 <deque> | 5 #include <deque> |
| 6 #include <queue> | 6 #include <queue> |
| 7 | 7 |
| 8 #include "src/compiler/scheduler.h" | 8 #include "src/compiler/scheduler.h" |
| 9 | 9 |
| 10 #include "src/compiler/graph.h" | 10 #include "src/compiler/graph.h" |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 232 control_.push_back(node); | 232 control_.push_back(node); |
| 233 data->is_connected_control_ = true; | 233 data->is_connected_control_ = true; |
| 234 } | 234 } |
| 235 } | 235 } |
| 236 | 236 |
| 237 | 237 |
| 238 void BuildBlocks(Node* node) { | 238 void BuildBlocks(Node* node) { |
| 239 switch (node->opcode()) { | 239 switch (node->opcode()) { |
| 240 case IrOpcode::kLoop: | 240 case IrOpcode::kLoop: |
| 241 case IrOpcode::kMerge: | 241 case IrOpcode::kMerge: |
| 242 case IrOpcode::kTerminate: | |
| 243 BuildBlockForNode(node); | 242 BuildBlockForNode(node); |
| 244 break; | 243 break; |
| 244 case IrOpcode::kTerminate: { | |
| 245 // Put Terminate in the loop to which it refers. | |
| 246 Node* loop = NodeProperties::GetControlInput(node); | |
| 247 BuildBlockForNode(loop); | |
| 248 BasicBlock* block = schedule_->block(loop); | |
|
Michael Starzinger
2014/10/29 12:14:02
nit: This probably should use the return value of
titzer
2014/10/29 15:17:09
Done. While doing this I noticed a bug and had to
| |
| 249 FixNode(block, node); | |
| 250 break; | |
| 251 } | |
| 245 case IrOpcode::kBranch: | 252 case IrOpcode::kBranch: |
| 246 BuildBlocksForSuccessors(node, IrOpcode::kIfTrue, IrOpcode::kIfFalse); | 253 BuildBlocksForSuccessors(node, IrOpcode::kIfTrue, IrOpcode::kIfFalse); |
| 247 break; | 254 break; |
| 248 default: | 255 default: |
| 249 break; | 256 break; |
| 250 } | 257 } |
| 251 } | 258 } |
| 252 | 259 |
| 253 void ConnectBlocks(Node* node) { | 260 void ConnectBlocks(Node* node) { |
| 254 switch (node->opcode()) { | 261 switch (node->opcode()) { |
| 255 case IrOpcode::kLoop: | 262 case IrOpcode::kLoop: |
| 256 case IrOpcode::kMerge: | 263 case IrOpcode::kMerge: |
| 257 ConnectMerge(node); | 264 ConnectMerge(node); |
| 258 break; | 265 break; |
| 259 case IrOpcode::kBranch: | 266 case IrOpcode::kBranch: |
| 260 scheduler_->schedule_root_nodes_.push_back(node); | 267 scheduler_->schedule_root_nodes_.push_back(node); |
| 261 ConnectBranch(node); | 268 ConnectBranch(node); |
| 262 break; | 269 break; |
| 263 case IrOpcode::kReturn: | 270 case IrOpcode::kReturn: |
| 264 scheduler_->schedule_root_nodes_.push_back(node); | 271 scheduler_->schedule_root_nodes_.push_back(node); |
| 265 ConnectReturn(node); | 272 ConnectReturn(node); |
| 266 break; | 273 break; |
| 267 default: | 274 default: |
| 268 break; | 275 break; |
| 269 } | 276 } |
| 270 } | 277 } |
| 271 | 278 |
| 272 void BuildBlockForNode(Node* node) { | 279 BasicBlock* BuildBlockForNode(Node* node) { |
| 273 if (schedule_->block(node) == NULL) { | 280 BasicBlock* block = schedule_->block(node); |
| 274 BasicBlock* block = schedule_->NewBasicBlock(); | 281 if (block == NULL) { |
| 282 block = schedule_->NewBasicBlock(); | |
| 275 Trace("Create block B%d for #%d:%s\n", block->id().ToInt(), node->id(), | 283 Trace("Create block B%d for #%d:%s\n", block->id().ToInt(), node->id(), |
| 276 node->op()->mnemonic()); | 284 node->op()->mnemonic()); |
| 277 FixNode(block, node); | 285 FixNode(block, node); |
| 278 } | 286 } |
| 287 return block; | |
| 279 } | 288 } |
| 280 | 289 |
| 281 void BuildBlocksForSuccessors(Node* node, IrOpcode::Value a, | 290 void BuildBlocksForSuccessors(Node* node, IrOpcode::Value a, |
| 282 IrOpcode::Value b) { | 291 IrOpcode::Value b) { |
| 283 Node* successors[2]; | 292 Node* successors[2]; |
| 284 CollectSuccessorProjections(node, successors, a, b); | 293 CollectSuccessorProjections(node, successors, a, b); |
| 285 BuildBlockForNode(successors[0]); | 294 BuildBlockForNode(successors[0]); |
| 286 BuildBlockForNode(successors[1]); | 295 BuildBlockForNode(successors[1]); |
| 287 } | 296 } |
| 288 | 297 |
| (...skipping 1014 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1303 start->ReplaceInput(NodeProperties::FirstControlIndex(start), block_start); | 1312 start->ReplaceInput(NodeProperties::FirstControlIndex(start), block_start); |
| 1304 | 1313 |
| 1305 Trace(" Connecting floating control start %d:%s to %d:%s\n", start->id(), | 1314 Trace(" Connecting floating control start %d:%s to %d:%s\n", start->id(), |
| 1306 start->op()->mnemonic(), block_start->id(), | 1315 start->op()->mnemonic(), block_start->id(), |
| 1307 block_start->op()->mnemonic()); | 1316 block_start->op()->mnemonic()); |
| 1308 } | 1317 } |
| 1309 | 1318 |
| 1310 } // namespace compiler | 1319 } // namespace compiler |
| 1311 } // namespace internal | 1320 } // namespace internal |
| 1312 } // namespace v8 | 1321 } // namespace v8 |
| OLD | NEW |