PPC: [turbofan] Enable tail calls for %_CallRuntime.
Port 1fa4285e1c
Original commit message:
This involves:
- Enabling the tail call optimization reducer in all cases.
- Adding an addition flag to CallFunctionParameters to mark call sites
that can be tail-called enabled.
- Only set the tail-call flag for %_CallFunction.
R=danno@chromium.org, dstence@us.ibm.com, michael_dawson@ca.ibm.com
BUG=
Review URL: https://codereview.chromium.org/1224533002
Cr-Commit-Position: refs/heads/master@{#29453}
This commit is contained in:
parent
ebadb68f02
commit
6924787105
@ -585,10 +585,7 @@ void CodeGenerator::AssembleDeconstructActivationRecord() {
|
||||
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
|
||||
int stack_slots = frame()->GetSpillSlotCount();
|
||||
if (descriptor->IsJSFunctionCall() || stack_slots > 0) {
|
||||
int pop_count = descriptor->IsJSFunctionCall()
|
||||
? static_cast<int>(descriptor->JSParameterCount())
|
||||
: 0;
|
||||
__ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize);
|
||||
__ LeaveFrame(StackFrame::MANUAL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -620,6 +617,9 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
||||
Operand(Code::kHeaderSize - kHeapObjectTag));
|
||||
__ Jump(ip);
|
||||
} else {
|
||||
// We cannot use the constant pool to load the target since
|
||||
// we've already restored the caller's frame.
|
||||
ConstantPoolUnavailableScope constant_pool_unavailable(masm());
|
||||
__ Jump(Handle<Code>::cast(i.InputHeapObject(0)),
|
||||
RelocInfo::CODE_TARGET);
|
||||
}
|
||||
@ -1379,7 +1379,9 @@ void CodeGenerator::AssembleReturn() {
|
||||
__ bind(&return_label_);
|
||||
int pop_count = descriptor->IsJSFunctionCall()
|
||||
? static_cast<int>(descriptor->JSParameterCount())
|
||||
: 0;
|
||||
: (info()->IsStub()
|
||||
? info()->code_stub()->GetStackParameterCount()
|
||||
: 0);
|
||||
__ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize);
|
||||
__ Ret();
|
||||
}
|
||||
|
@ -1520,9 +1520,7 @@ void InstructionSelector::VisitTailCall(Node* node) {
|
||||
DCHECK_EQ(0, descriptor->flags() & CallDescriptor::kNeedsNopAfterCall);
|
||||
|
||||
// TODO(turbofan): Relax restriction for stack parameters.
|
||||
if (descriptor->UsesOnlyRegisters() &&
|
||||
descriptor->HasSameReturnLocationsAs(
|
||||
linkage()->GetIncomingDescriptor())) {
|
||||
if (linkage()->GetIncomingDescriptor()->CanTailCall(node)) {
|
||||
CallBuffer buffer(zone(), descriptor, nullptr);
|
||||
|
||||
// Compute InstructionOperands for inputs and outputs.
|
||||
@ -1531,8 +1529,6 @@ void InstructionSelector::VisitTailCall(Node* node) {
|
||||
// heuristics in the register allocator for where to emit constants.
|
||||
InitializeCallBuffer(node, &buffer, true, false);
|
||||
|
||||
DCHECK_EQ(0u, buffer.pushed_nodes.size());
|
||||
|
||||
// Select the appropriate opcode based on the call type.
|
||||
InstructionCode opcode;
|
||||
switch (descriptor->kind()) {
|
||||
|
Loading…
Reference in New Issue
Block a user