aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/scheduler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/scheduler.cc')
-rw-r--r--deps/v8/src/compiler/scheduler.cc50
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);
}
}
}