From 0914181d97665ff1d34b2ef0d57c41d37f9de124 Mon Sep 17 00:00:00 2001 From: svenpanne Date: Mon, 16 Feb 2015 05:44:51 -0800 Subject: [PATCH] Build stack frames for stubs only when needed. The heuristic is quite naive at the moment (build a frame iff the register allocator needed spill slots), we can improve that later. Review URL: https://codereview.chromium.org/933603002 Cr-Commit-Position: refs/heads/master@{#26664} --- src/compiler/arm/code-generator-arm.cc | 10 ++++++---- src/compiler/arm64/code-generator-arm64.cc | 10 ++++++---- src/compiler/ia32/code-generator-ia32.cc | 8 +++++--- src/compiler/mips/code-generator-mips.cc | 10 ++++++---- src/compiler/mips64/code-generator-mips64.cc | 10 ++++++---- src/compiler/x64/code-generator-x64.cc | 8 +++++--- 6 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/compiler/arm/code-generator-arm.cc b/src/compiler/arm/code-generator-arm.cc index e2ddf462a..52f0765e0 100644 --- a/src/compiler/arm/code-generator-arm.cc +++ b/src/compiler/arm/code-generator-arm.cc @@ -777,6 +777,7 @@ void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { void CodeGenerator::AssemblePrologue() { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); + int stack_slots = frame()->GetSpillSlotCount(); if (descriptor->kind() == CallDescriptor::kCallAddress) { bool saved_pp; if (FLAG_enable_ool_constant_pool) { @@ -805,12 +806,11 @@ void CodeGenerator::AssemblePrologue() { __ Prologue(info->IsCodePreAgingActive()); frame()->SetRegisterSaveAreaSize( StandardFrameConstants::kFixedFrameSizeFromFp); - } else { + } else if (stack_slots > 0) { __ StubPrologue(); frame()->SetRegisterSaveAreaSize( StandardFrameConstants::kFixedFrameSizeFromFp); } - int stack_slots = frame()->GetSpillSlotCount(); if (info()->is_osr()) { // TurboFan OSR-compiled functions cannot be entered directly. @@ -834,10 +834,10 @@ void CodeGenerator::AssemblePrologue() { void CodeGenerator::AssembleReturn() { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); + int stack_slots = frame()->GetSpillSlotCount(); if (descriptor->kind() == CallDescriptor::kCallAddress) { if (frame()->GetRegisterSaveAreaSize() > 0) { // Remove this frame's spill slots first. - int stack_slots = frame()->GetSpillSlotCount(); if (stack_slots > 0) { __ add(sp, sp, Operand(stack_slots * kPointerSize)); } @@ -849,13 +849,15 @@ void CodeGenerator::AssembleReturn() { } __ LeaveFrame(StackFrame::MANUAL); __ Ret(); - } else { + } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) { __ LeaveFrame(StackFrame::MANUAL); int pop_count = descriptor->IsJSFunctionCall() ? static_cast(descriptor->JSParameterCount()) : 0; __ Drop(pop_count); __ Ret(); + } else { + __ Ret(); } } diff --git a/src/compiler/arm64/code-generator-arm64.cc b/src/compiler/arm64/code-generator-arm64.cc index 8281b7b13..f80161678 100644 --- a/src/compiler/arm64/code-generator-arm64.cc +++ b/src/compiler/arm64/code-generator-arm64.cc @@ -887,6 +887,7 @@ static int AlignedStackSlots(int stack_slots) { void CodeGenerator::AssemblePrologue() { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); + int stack_slots = frame()->GetSpillSlotCount(); if (descriptor->kind() == CallDescriptor::kCallAddress) { __ SetStackPointer(csp); __ Push(lr, fp); @@ -900,13 +901,12 @@ void CodeGenerator::AssemblePrologue() { __ Prologue(info->IsCodePreAgingActive()); frame()->SetRegisterSaveAreaSize( StandardFrameConstants::kFixedFrameSizeFromFp); - } else { + } else if (stack_slots > 0) { __ SetStackPointer(jssp); __ StubPrologue(); frame()->SetRegisterSaveAreaSize( StandardFrameConstants::kFixedFrameSizeFromFp); } - int stack_slots = frame()->GetSpillSlotCount(); if (info()->is_osr()) { // TurboFan OSR-compiled functions cannot be entered directly. @@ -934,10 +934,10 @@ void CodeGenerator::AssemblePrologue() { void CodeGenerator::AssembleReturn() { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); + int stack_slots = frame()->GetSpillSlotCount(); if (descriptor->kind() == CallDescriptor::kCallAddress) { if (frame()->GetRegisterSaveAreaSize() > 0) { // Remove this frame's spill slots first. - int stack_slots = frame()->GetSpillSlotCount(); if (stack_slots > 0) { __ Add(csp, csp, AlignedStackSlots(stack_slots) * kPointerSize); } @@ -948,7 +948,7 @@ void CodeGenerator::AssembleReturn() { __ Mov(csp, fp); __ Pop(fp, lr); __ Ret(); - } else { + } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) { __ Mov(jssp, fp); __ Pop(fp, lr); int pop_count = descriptor->IsJSFunctionCall() @@ -956,6 +956,8 @@ void CodeGenerator::AssembleReturn() { : 0; __ Drop(pop_count); __ Ret(); + } else { + __ Ret(); } } diff --git a/src/compiler/ia32/code-generator-ia32.cc b/src/compiler/ia32/code-generator-ia32.cc index f88cd1067..f82ddc3d3 100644 --- a/src/compiler/ia32/code-generator-ia32.cc +++ b/src/compiler/ia32/code-generator-ia32.cc @@ -1010,7 +1010,7 @@ void CodeGenerator::AssemblePrologue() { __ Prologue(info->IsCodePreAgingActive()); frame()->SetRegisterSaveAreaSize( StandardFrameConstants::kFixedFrameSizeFromFp); - } else { + } else if (stack_slots > 0) { __ StubPrologue(); frame()->SetRegisterSaveAreaSize( StandardFrameConstants::kFixedFrameSizeFromFp); @@ -1039,11 +1039,11 @@ void CodeGenerator::AssemblePrologue() { void CodeGenerator::AssembleReturn() { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); + int stack_slots = frame()->GetSpillSlotCount(); if (descriptor->kind() == CallDescriptor::kCallAddress) { const RegList saves = descriptor->CalleeSavedRegisters(); if (frame()->GetRegisterSaveAreaSize() > 0) { // Remove this frame's spill slots first. - int stack_slots = frame()->GetSpillSlotCount(); if (stack_slots > 0) { __ add(esp, Immediate(stack_slots * kPointerSize)); } @@ -1062,13 +1062,15 @@ void CodeGenerator::AssembleReturn() { __ pop(ebp); // Pop caller's frame pointer. __ ret(0); } - } else { + } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) { __ mov(esp, ebp); // Move stack pointer back to frame pointer. __ pop(ebp); // Pop caller's frame pointer. int pop_count = descriptor->IsJSFunctionCall() ? static_cast(descriptor->JSParameterCount()) : 0; __ ret(pop_count * kPointerSize); + } else { + __ ret(0); } } diff --git a/src/compiler/mips/code-generator-mips.cc b/src/compiler/mips/code-generator-mips.cc index 3353aabca..8f03f7bbb 100644 --- a/src/compiler/mips/code-generator-mips.cc +++ b/src/compiler/mips/code-generator-mips.cc @@ -913,6 +913,7 @@ void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { void CodeGenerator::AssemblePrologue() { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); + int stack_slots = frame()->GetSpillSlotCount(); if (descriptor->kind() == CallDescriptor::kCallAddress) { __ Push(ra, fp); __ mov(fp, sp); @@ -932,12 +933,11 @@ void CodeGenerator::AssemblePrologue() { __ Prologue(info->IsCodePreAgingActive()); frame()->SetRegisterSaveAreaSize( StandardFrameConstants::kFixedFrameSizeFromFp); - } else { + } else if (stack_slots > 0) { __ StubPrologue(); frame()->SetRegisterSaveAreaSize( StandardFrameConstants::kFixedFrameSizeFromFp); } - int stack_slots = frame()->GetSpillSlotCount(); if (info()->is_osr()) { // TurboFan OSR-compiled functions cannot be entered directly. @@ -961,10 +961,10 @@ void CodeGenerator::AssemblePrologue() { void CodeGenerator::AssembleReturn() { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); + int stack_slots = frame()->GetSpillSlotCount(); if (descriptor->kind() == CallDescriptor::kCallAddress) { if (frame()->GetRegisterSaveAreaSize() > 0) { // Remove this frame's spill slots first. - int stack_slots = frame()->GetSpillSlotCount(); if (stack_slots > 0) { __ Addu(sp, sp, Operand(stack_slots * kPointerSize)); } @@ -977,13 +977,15 @@ void CodeGenerator::AssembleReturn() { __ mov(sp, fp); __ Pop(ra, fp); __ Ret(); - } else { + } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) { __ mov(sp, fp); __ Pop(ra, fp); int pop_count = descriptor->IsJSFunctionCall() ? static_cast(descriptor->JSParameterCount()) : 0; __ DropAndRet(pop_count); + } else { + __ Ret(); } } diff --git a/src/compiler/mips64/code-generator-mips64.cc b/src/compiler/mips64/code-generator-mips64.cc index 67b9d3f80..830869a8a 100644 --- a/src/compiler/mips64/code-generator-mips64.cc +++ b/src/compiler/mips64/code-generator-mips64.cc @@ -1043,6 +1043,7 @@ void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { void CodeGenerator::AssemblePrologue() { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); + int stack_slots = frame()->GetSpillSlotCount(); if (descriptor->kind() == CallDescriptor::kCallAddress) { __ Push(ra, fp); __ mov(fp, sp); @@ -1062,12 +1063,11 @@ void CodeGenerator::AssemblePrologue() { __ Prologue(info->IsCodePreAgingActive()); frame()->SetRegisterSaveAreaSize( StandardFrameConstants::kFixedFrameSizeFromFp); - } else { + } else if (stack_slots > 0) { __ StubPrologue(); frame()->SetRegisterSaveAreaSize( StandardFrameConstants::kFixedFrameSizeFromFp); } - int stack_slots = frame()->GetSpillSlotCount(); if (info()->is_osr()) { // TurboFan OSR-compiled functions cannot be entered directly. @@ -1091,10 +1091,10 @@ void CodeGenerator::AssemblePrologue() { void CodeGenerator::AssembleReturn() { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); + int stack_slots = frame()->GetSpillSlotCount(); if (descriptor->kind() == CallDescriptor::kCallAddress) { if (frame()->GetRegisterSaveAreaSize() > 0) { // Remove this frame's spill slots first. - int stack_slots = frame()->GetSpillSlotCount(); if (stack_slots > 0) { __ Daddu(sp, sp, Operand(stack_slots * kPointerSize)); } @@ -1107,13 +1107,15 @@ void CodeGenerator::AssembleReturn() { __ mov(sp, fp); __ Pop(ra, fp); __ Ret(); - } else { + } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) { __ mov(sp, fp); __ Pop(ra, fp); int pop_count = descriptor->IsJSFunctionCall() ? static_cast(descriptor->JSParameterCount()) : 0; __ DropAndRet(pop_count); + } else { + __ Ret(); } } diff --git a/src/compiler/x64/code-generator-x64.cc b/src/compiler/x64/code-generator-x64.cc index 927dbef49..e52326eac 100644 --- a/src/compiler/x64/code-generator-x64.cc +++ b/src/compiler/x64/code-generator-x64.cc @@ -1178,7 +1178,7 @@ void CodeGenerator::AssemblePrologue() { __ Prologue(info->IsCodePreAgingActive()); frame()->SetRegisterSaveAreaSize( StandardFrameConstants::kFixedFrameSizeFromFp); - } else { + } else if (stack_slots > 0) { __ StubPrologue(); frame()->SetRegisterSaveAreaSize( StandardFrameConstants::kFixedFrameSizeFromFp); @@ -1206,10 +1206,10 @@ void CodeGenerator::AssemblePrologue() { void CodeGenerator::AssembleReturn() { CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); + int stack_slots = frame()->GetSpillSlotCount(); if (descriptor->kind() == CallDescriptor::kCallAddress) { if (frame()->GetRegisterSaveAreaSize() > 0) { // Remove this frame's spill slots first. - int stack_slots = frame()->GetSpillSlotCount(); if (stack_slots > 0) { __ addq(rsp, Immediate(stack_slots * kPointerSize)); } @@ -1229,13 +1229,15 @@ void CodeGenerator::AssembleReturn() { __ popq(rbp); // Pop caller's frame pointer. __ ret(0); } - } else { + } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) { __ movq(rsp, rbp); // Move stack pointer back to frame pointer. __ popq(rbp); // Pop caller's frame pointer. int pop_count = descriptor->IsJSFunctionCall() ? static_cast(descriptor->JSParameterCount()) : 0; __ ret(pop_count * kPointerSize); + } else { + __ ret(0); } } -- 2.34.1