summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp8
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp3
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++);
OpenPOWER on IntegriCloud