diff options
Diffstat (limited to 'deps/v8/src/compiler/raw-machine-assembler.cc')
-rw-r--r-- | deps/v8/src/compiler/raw-machine-assembler.cc | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/deps/v8/src/compiler/raw-machine-assembler.cc b/deps/v8/src/compiler/raw-machine-assembler.cc index 0d4b8cb200..728d79af5b 100644 --- a/deps/v8/src/compiler/raw-machine-assembler.cc +++ b/deps/v8/src/compiler/raw-machine-assembler.cc @@ -39,6 +39,17 @@ RawMachineAssembler::RawMachineAssembler(Isolate* isolate, Graph* graph, Schedule* RawMachineAssembler::Export() { // Compute the correct codegen order. DCHECK(schedule_->rpo_order()->empty()); + OFStream os(stdout); + if (FLAG_trace_turbo_scheduler) { + PrintF("--- RAW SCHEDULE -------------------------------------------\n"); + os << *schedule_; + } + schedule_->EnsureSplitEdgeForm(); + schedule_->PropagateDeferredMark(); + if (FLAG_trace_turbo_scheduler) { + PrintF("--- EDGE SPLIT AND PROPAGATED DEFERRED SCHEDULE ------------\n"); + os << *schedule_; + } Scheduler::ComputeSpecialRPO(zone(), schedule_); // Invalidate RawMachineAssembler. Schedule* schedule = schedule_; @@ -79,15 +90,17 @@ void RawMachineAssembler::Switch(Node* index, RawMachineLabel* default_label, BasicBlock** succ_blocks = zone()->NewArray<BasicBlock*>(succ_count); for (size_t index = 0; index < case_count; ++index) { int32_t case_value = case_values[index]; - BasicBlock* case_block = Use(case_labels[index]); + BasicBlock* case_block = schedule()->NewBasicBlock(); Node* case_node = graph()->NewNode(common()->IfValue(case_value), switch_node); schedule()->AddNode(case_block, case_node); + schedule()->AddGoto(case_block, Use(case_labels[index])); succ_blocks[index] = case_block; } - BasicBlock* default_block = Use(default_label); + BasicBlock* default_block = schedule()->NewBasicBlock(); Node* default_node = graph()->NewNode(common()->IfDefault(), switch_node); schedule()->AddNode(default_block, default_node); + schedule()->AddGoto(default_block, Use(default_label)); succ_blocks[case_count] = default_block; schedule()->AddSwitch(CurrentBlock(), switch_node, succ_blocks, succ_count); current_block_ = nullptr; @@ -247,6 +260,27 @@ Node* RawMachineAssembler::TailCallN(CallDescriptor* desc, Node* function, return tail_call; } +Node* RawMachineAssembler::TailCallRuntime0(Runtime::FunctionId function, + Node* context) { + const int kArity = 0; + CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor( + zone(), function, kArity, Operator::kNoProperties, + CallDescriptor::kSupportsTailCalls); + int return_count = static_cast<int>(desc->ReturnCount()); + + Node* centry = HeapConstant(CEntryStub(isolate(), return_count).GetCode()); + Node* ref = AddNode( + common()->ExternalConstant(ExternalReference(function, isolate()))); + Node* arity = Int32Constant(kArity); + + Node* nodes[] = {centry, ref, arity, context}; + Node* tail_call = MakeNode(common()->TailCall(desc), arraysize(nodes), nodes); + + NodeProperties::MergeControlToEnd(graph(), common(), tail_call); + schedule()->AddTailCall(CurrentBlock(), tail_call); + current_block_ = nullptr; + return tail_call; +} Node* RawMachineAssembler::TailCallRuntime1(Runtime::FunctionId function, Node* arg1, Node* context) { @@ -407,6 +441,7 @@ void RawMachineAssembler::Bind(RawMachineLabel* label) { DCHECK(!label->bound_); label->bound_ = true; current_block_ = EnsureBlock(label); + current_block_->set_deferred(label->deferred_); } @@ -459,11 +494,6 @@ Node* RawMachineAssembler::MakeNode(const Operator* op, int input_count, return graph()->NewNodeUnchecked(op, input_count, inputs); } - -RawMachineLabel::RawMachineLabel() - : block_(nullptr), used_(false), bound_(false) {} - - RawMachineLabel::~RawMachineLabel() { DCHECK(bound_ || !used_); } } // namespace compiler |