diff options
Diffstat (limited to 'deps/v8/src/compiler/scheduler.cc')
-rw-r--r-- | deps/v8/src/compiler/scheduler.cc | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/deps/v8/src/compiler/scheduler.cc b/deps/v8/src/compiler/scheduler.cc index 1185cacab7..862969e752 100644 --- a/deps/v8/src/compiler/scheduler.cc +++ b/deps/v8/src/compiler/scheduler.cc @@ -6,6 +6,7 @@ #include <iomanip> +#include "src/base/adapters.h" #include "src/bit-vector.h" #include "src/compiler/common-operator.h" #include "src/compiler/control-equivalence.h" @@ -312,12 +313,19 @@ class CFGBuilder : public ZoneObject { case IrOpcode::kMerge: BuildBlockForNode(node); break; + case IrOpcode::kTerminate: { + // Put Terminate in the loop to which it refers. + Node* loop = NodeProperties::GetControlInput(node); + BasicBlock* block = BuildBlockForNode(loop); + FixNode(block, node); + break; + } case IrOpcode::kBranch: case IrOpcode::kSwitch: BuildBlocksForSuccessors(node); break; case IrOpcode::kCall: - if (IsExceptionalCall(node)) { + if (NodeProperties::IsExceptionalCall(node)) { BuildBlocksForSuccessors(node); } break; @@ -344,6 +352,10 @@ class CFGBuilder : public ZoneObject { scheduler_->UpdatePlacement(node, Scheduler::kFixed); ConnectDeoptimize(node); break; + case IrOpcode::kTailCall: + scheduler_->UpdatePlacement(node, Scheduler::kFixed); + ConnectTailCall(node); + break; case IrOpcode::kReturn: scheduler_->UpdatePlacement(node, Scheduler::kFixed); ConnectReturn(node); @@ -353,7 +365,7 @@ class CFGBuilder : public ZoneObject { ConnectThrow(node); break; case IrOpcode::kCall: - if (IsExceptionalCall(node)) { + if (NodeProperties::IsExceptionalCall(node)) { scheduler_->UpdatePlacement(node, Scheduler::kFixed); ConnectCall(node); } @@ -486,6 +498,13 @@ class CFGBuilder : public ZoneObject { } } + void ConnectTailCall(Node* call) { + Node* call_control = NodeProperties::GetControlInput(call); + BasicBlock* call_block = FindPredecessorBlock(call_control); + TraceConnect(call, call_block, NULL); + schedule_->AddTailCall(call_block, call); + } + void ConnectReturn(Node* ret) { Node* return_control = NodeProperties::GetControlInput(ret); BasicBlock* return_block = FindPredecessorBlock(return_control); @@ -518,13 +537,6 @@ class CFGBuilder : public ZoneObject { } } - bool IsExceptionalCall(Node* node) { - for (Node* const use : node->uses()) { - if (use->opcode() == IrOpcode::kIfException) return true; - } - return false; - } - bool IsFinalMerge(Node* node) { return (node->opcode() == IrOpcode::kMerge && node == scheduler_->graph_->end()->InputAt(0)); @@ -633,7 +645,7 @@ class SpecialRPONumberer : public ZoneObject { #endif } - const ZoneList<BasicBlock*>& GetOutgoingBlocks(BasicBlock* block) { + const ZoneVector<BasicBlock*>& GetOutgoingBlocks(BasicBlock* block) { if (HasLoopNumber(block)) { LoopInfo const& loop = loops_[GetLoopNumber(block)]; if (loop.outgoing) return *loop.outgoing; @@ -658,7 +670,7 @@ class SpecialRPONumberer : public ZoneObject { struct LoopInfo { BasicBlock* header; - ZoneList<BasicBlock*>* outgoing; + ZoneVector<BasicBlock*>* outgoing; BitVector* members; LoopInfo* prev; BasicBlock* end; @@ -666,9 +678,10 @@ class SpecialRPONumberer : public ZoneObject { void AddOutgoing(Zone* zone, BasicBlock* block) { if (outgoing == NULL) { - outgoing = new (zone) ZoneList<BasicBlock*>(2, zone); + outgoing = new (zone->New(sizeof(ZoneVector<BasicBlock*>))) + ZoneVector<BasicBlock*>(zone); } - outgoing->Add(block, zone); + outgoing->push_back(block); } }; @@ -797,12 +810,11 @@ class SpecialRPONumberer : public ZoneObject { } // Use the next outgoing edge if there are any. - int outgoing_index = - static_cast<int>(frame->index - block->SuccessorCount()); + size_t outgoing_index = frame->index - block->SuccessorCount(); LoopInfo* info = &loops_[GetLoopNumber(block)]; DCHECK(loop != info); if (block != entry && info->outgoing != NULL && - outgoing_index < info->outgoing->length()) { + outgoing_index < info->outgoing->size()) { succ = info->outgoing->at(outgoing_index); frame->index++; } @@ -1061,7 +1073,7 @@ class SpecialRPONumberer : public ZoneObject { ZoneVector<Backedge> backedges_; ZoneVector<SpecialRPOStackFrame> stack_; size_t previous_block_count_; - ZoneList<BasicBlock*> const empty_; + ZoneVector<BasicBlock*> const empty_; }; @@ -1622,8 +1634,8 @@ void Scheduler::SealFinalSchedule() { for (NodeVector& nodes : scheduled_nodes_) { BasicBlock::Id id = BasicBlock::Id::FromInt(block_num++); BasicBlock* block = schedule_->GetBlockById(id); - for (auto i = nodes.rbegin(); i != nodes.rend(); ++i) { - schedule_->AddNode(block, *i); + for (Node* node : base::Reversed(nodes)) { + schedule_->AddNode(block, node); } } } |