Index: src/compiler/instruction-selector.cc |
diff --git a/src/compiler/instruction-selector.cc b/src/compiler/instruction-selector.cc |
index ff162e9c77b531c783945a555c2045a049367a19..b53b31e7bed9ee2ae6c52f470fa5724cc832ffb1 100644 |
--- a/src/compiler/instruction-selector.cc |
+++ b/src/compiler/instruction-selector.cc |
@@ -9,7 +9,6 @@ |
#include "src/base/adapters.h" |
#include "src/compiler/instruction-selector-impl.h" |
#include "src/compiler/node-matchers.h" |
-#include "src/compiler/node-properties.h" |
#include "src/compiler/pipeline.h" |
#include "src/compiler/schedule.h" |
#include "src/compiler/state-values-utils.h" |
@@ -278,7 +277,7 @@ void InstructionSelector::InitializeCallBuffer(Node* call, CallBuffer* buffer, |
bool call_code_immediate, |
bool call_address_immediate) { |
OperandGenerator g(this); |
- DCHECK_EQ(call->op()->ValueOutputCount(), |
+ DCHECK_LE(call->op()->ValueOutputCount(), |
static_cast<int>(buffer->descriptor->ReturnCount())); |
DCHECK_EQ( |
call->op()->ValueInputCount(), |
@@ -464,7 +463,11 @@ void InstructionSelector::VisitControl(BasicBlock* block) { |
DCHECK_EQ(IrOpcode::kCall, input->opcode()); |
BasicBlock* success = block->SuccessorAt(0); |
BasicBlock* exception = block->SuccessorAt(1); |
- return VisitCall(input, exception, NORMAL_CALL), VisitGoto(success); |
+ return VisitCall(input, exception), VisitGoto(success); |
+ } |
+ case BasicBlock::kTailCall: { |
+ DCHECK_EQ(IrOpcode::kTailCall, input->opcode()); |
+ return VisitTailCall(input); |
} |
case BasicBlock::kBranch: { |
DCHECK_EQ(IrOpcode::kBranch, input->opcode()); |
@@ -507,7 +510,7 @@ void InstructionSelector::VisitControl(BasicBlock* block) { |
} |
case BasicBlock::kReturn: { |
DCHECK_EQ(IrOpcode::kReturn, input->opcode()); |
- return VisitReturn(input); |
+ return VisitReturn(input->InputAt(0)); |
} |
case BasicBlock::kDeoptimize: { |
// If the result itself is a return, return its input. |
@@ -584,7 +587,7 @@ void InstructionSelector::VisitNode(Node* node) { |
return VisitConstant(node); |
} |
case IrOpcode::kCall: |
- return VisitCall(node, nullptr, NORMAL_CALL); |
+ return VisitCall(node); |
case IrOpcode::kFrameState: |
case IrOpcode::kStateValues: |
return; |
@@ -989,46 +992,7 @@ void InstructionSelector::VisitGoto(BasicBlock* target) { |
} |
-namespace { |
- |
-// Returns the call node if the given return node is part of a tail call, |
-// nullptr otherwise. |
-Node* TryMatchTailCall(Node* ret) { |
- // The value which is returned must be the result of a potential tail call, |
- // there must be no try/catch/finally around the call, and there must be no |
- // effects between the call and the return. |
- Node* call = NodeProperties::GetValueInput(ret, 0); |
- if (call->opcode() != IrOpcode::kCall || |
- !OpParameter<const CallDescriptor*>(call)->SupportsTailCalls() || |
- NodeProperties::IsExceptionalCall(call) || |
- NodeProperties::GetEffectInput(ret, 0) != call) { |
- return nullptr; |
- } |
- // Furthermore, control has to flow via an IfSuccess from the call (for calls |
- // which can throw), or the return and the call have to use the same control |
- // input (for calls which can't throw). |
- Node* control = NodeProperties::GetControlInput(ret, 0); |
- bool found = (control->opcode() == IrOpcode::kIfSuccess) |
- ? (NodeProperties::GetControlInput(control, 0) == call) |
- : (control == NodeProperties::GetControlInput(call, 0)); |
- return found ? call : nullptr; |
-} |
- |
-} // namespace |
- |
- |
-void InstructionSelector::VisitReturn(Node* node) { |
- if (FLAG_turbo_tail_calls) { |
- Node* call = TryMatchTailCall(node); |
- if (call != nullptr) { |
- const CallDescriptor* desc = OpParameter<const CallDescriptor*>(call); |
- if (desc->UsesOnlyRegisters() && |
- desc->HasSameReturnLocationsAs(linkage()->GetIncomingDescriptor())) { |
- return VisitCall(call, nullptr, TAIL_CALL); |
- } |
- } |
- } |
- Node* value = NodeProperties::GetValueInput(node, 0); |
+void InstructionSelector::VisitReturn(Node* value) { |
DCHECK_NOT_NULL(value); |
OperandGenerator g(this); |
Emit(kArchRet, g.NoOutput(), |
@@ -1159,12 +1123,14 @@ MACHINE_OP_LIST(DECLARE_UNIMPLEMENTED_SELECTOR) |
#undef DECLARE_UNIMPLEMENTED_SELECTOR |
-void InstructionSelector::VisitCall(Node* node, BasicBlock* handler, |
- CallMode call_mode) { |
+void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { |
UNIMPLEMENTED(); |
} |
+void InstructionSelector::VisitTailCall(Node* node) { UNIMPLEMENTED(); } |
+ |
+ |
void InstructionSelector::VisitBranch(Node* branch, BasicBlock* tbranch, |
BasicBlock* fbranch) { |
UNIMPLEMENTED(); |