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/bit-vector.h" | 10 #include "src/bit-vector.h" |
(...skipping 1312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1323 ? block | 1323 ? block |
1324 : scheduler_->GetCommonDominator( | 1324 : scheduler_->GetCommonDominator( |
1325 block, use_block); | 1325 block, use_block); |
1326 } | 1326 } |
1327 return block; | 1327 return block; |
1328 } | 1328 } |
1329 | 1329 |
1330 BasicBlock* GetBlockForUse(Edge edge) { | 1330 BasicBlock* GetBlockForUse(Edge edge) { |
1331 Node* use = edge.from(); | 1331 Node* use = edge.from(); |
1332 IrOpcode::Value opcode = use->opcode(); | 1332 IrOpcode::Value opcode = use->opcode(); |
1333 if (opcode == IrOpcode::kPhi || opcode == IrOpcode::kEffectPhi) { | 1333 if (IrOpcode::IsPhiOpcode(opcode)) { |
1334 // If the use is from a coupled (i.e. floating) phi, compute the common | 1334 // If the use is from a coupled (i.e. floating) phi, compute the common |
1335 // dominator of its uses. This will not recurse more than one level. | 1335 // dominator of its uses. This will not recurse more than one level. |
1336 if (scheduler_->GetPlacement(use) == Scheduler::kCoupled) { | 1336 if (scheduler_->GetPlacement(use) == Scheduler::kCoupled) { |
1337 Trace(" inspecting uses of coupled #%d:%s\n", use->id(), | 1337 Trace(" inspecting uses of coupled #%d:%s\n", use->id(), |
1338 use->op()->mnemonic()); | 1338 use->op()->mnemonic()); |
1339 DCHECK_EQ(edge.to(), NodeProperties::GetControlInput(use)); | 1339 DCHECK_EQ(edge.to(), NodeProperties::GetControlInput(use)); |
1340 return GetCommonDominatorOfUses(use); | 1340 return GetCommonDominatorOfUses(use); |
1341 } | 1341 } |
1342 // If the use is from a fixed (i.e. non-floating) phi, use the block | 1342 // If the use is from a fixed (i.e. non-floating) phi, use the block |
1343 // of the corresponding control input to the merge. | 1343 // of the corresponding control input to the merge. |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1433 } | 1433 } |
1434 PropagateImmediateDominators(block->rpo_next()); | 1434 PropagateImmediateDominators(block->rpo_next()); |
1435 | 1435 |
1436 // Iterate on phase 4: Schedule nodes early. | 1436 // Iterate on phase 4: Schedule nodes early. |
1437 // TODO(mstarzinger): The following loop gathering the propagation roots is a | 1437 // TODO(mstarzinger): The following loop gathering the propagation roots is a |
1438 // temporary solution and should be merged into the rest of the scheduler as | 1438 // temporary solution and should be merged into the rest of the scheduler as |
1439 // soon as the approach settled for all floating loops. | 1439 // soon as the approach settled for all floating loops. |
1440 NodeVector propagation_roots(control_flow_builder_->control_); | 1440 NodeVector propagation_roots(control_flow_builder_->control_); |
1441 for (Node* node : control_flow_builder_->control_) { | 1441 for (Node* node : control_flow_builder_->control_) { |
1442 for (Node* use : node->uses()) { | 1442 for (Node* use : node->uses()) { |
1443 if (use->opcode() == IrOpcode::kPhi || | 1443 if (IrOpcode::IsPhiOpcode(use->opcode())) |
1444 use->opcode() == IrOpcode::kEffectPhi) { | |
1445 propagation_roots.push_back(use); | 1444 propagation_roots.push_back(use); |
1446 } | |
1447 } | 1445 } |
1448 } | 1446 } |
1449 if (FLAG_trace_turbo_scheduler) { | 1447 if (FLAG_trace_turbo_scheduler) { |
1450 Trace("propagation roots: "); | 1448 Trace("propagation roots: "); |
1451 for (Node* node : propagation_roots) { | 1449 for (Node* node : propagation_roots) { |
1452 Trace("#%d:%s ", node->id(), node->op()->mnemonic()); | 1450 Trace("#%d:%s ", node->id(), node->op()->mnemonic()); |
1453 } | 1451 } |
1454 Trace("\n"); | 1452 Trace("\n"); |
1455 } | 1453 } |
1456 ScheduleEarlyNodeVisitor schedule_early_visitor(zone_, this); | 1454 ScheduleEarlyNodeVisitor schedule_early_visitor(zone_, this); |
(...skipping 18 matching lines...) Expand all Loading... |
1475 for (NodeVectorIter i = nodes->begin(); i != nodes->end(); ++i) { | 1473 for (NodeVectorIter i = nodes->begin(); i != nodes->end(); ++i) { |
1476 schedule_->SetBlockForNode(to, *i); | 1474 schedule_->SetBlockForNode(to, *i); |
1477 scheduled_nodes_[to->id().ToSize()].push_back(*i); | 1475 scheduled_nodes_[to->id().ToSize()].push_back(*i); |
1478 } | 1476 } |
1479 nodes->clear(); | 1477 nodes->clear(); |
1480 } | 1478 } |
1481 | 1479 |
1482 } // namespace compiler | 1480 } // namespace compiler |
1483 } // namespace internal | 1481 } // namespace internal |
1484 } // namespace v8 | 1482 } // namespace v8 |
OLD | NEW |