[WebAssembly] Don't emit epilogue code in the middle of stackified code.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268679 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman 2016-05-05 20:41:15 +00:00
parent 797e9bd818
commit 9281534899
3 changed files with 22 additions and 1 deletions

View File

@ -72,6 +72,7 @@ bool WebAssemblyFrameLowering::needsSP(const MachineFunction &MF,
/// false, the stack red zone can be used and only a local SP is needed.
bool WebAssemblyFrameLowering::needsSPWriteback(
const MachineFunction &MF, const MachineFrameInfo &MFI) const {
assert(needsSP(MF, MFI));
return MFI.getStackSize() > RedZoneSize || MFI.hasCalls() ||
MF.getFunction()->hasFnAttribute(Attribute::NoRedZone);
}
@ -190,6 +191,13 @@ void WebAssemblyFrameLowering::emitEpilogue(MachineFunction &MF,
if (InsertPt != MBB.end()) {
DL = InsertPt->getDebugLoc();
// If code has been stackified with the return, disconnect it so that we
// don't break the tree when we insert code just before the return.
if (InsertPt->isReturn() && InsertPt->getNumExplicitOperands() != 0) {
WebAssemblyFunctionInfo &MFI = *MF.getInfo<WebAssemblyFunctionInfo>();
MFI.unstackifyVReg(InsertPt->getOperand(0).getReg());
}
}
// Restore the stack pointer. If we had fixed-size locals, add the offset

View File

@ -108,7 +108,8 @@ bool WebAssemblyRegNumbering::runOnMachineFunction(MachineFunction &MF) {
}
}
// Allocate locals for used physical registers
bool HasFP = MF.getSubtarget().getFrameLowering()->hasFP(MF);
bool HasFP =
MF.getSubtarget<WebAssemblySubtarget>().getFrameLowering()->hasFP(MF);
if (FrameInfo.getStackSize() > 0 || FrameInfo.adjustsStack() || HasFP) {
DEBUG(dbgs() << "PReg SP " << CurReg << "\n");
MFI.addPReg(WebAssembly::SP32, CurReg++);

View File

@ -357,6 +357,18 @@ define void @ignore_dbg_value() {
unreachable
}
; Don't stackify an expression that might use the stack into a return, since we
; might insert a prologue before the return.
; CHECK-LABEL: no_stackify_past_epilogue:
; CHECK: return ${{[0-9]+}}{{$}}
declare i32 @use_memory(i32*)
define i32 @no_stackify_past_epilogue() {
%x = alloca i32
%call = call i32 @use_memory(i32* %x)
ret i32 %call
}
!llvm.module.flags = !{!0}
!llvm.dbg.cu = !{!1}