diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp | 8 | ||||
| -rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp | 3 | 
2 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp index 549958158eb..2e50c7e6c9f 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp @@ -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 diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp index 76ea0d72f6d..d508d448d71 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp @@ -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++);  | 

