diff options
author | Derek Schuff <dschuff@google.com> | 2016-09-26 21:18:03 +0000 |
---|---|---|
committer | Derek Schuff <dschuff@google.com> | 2016-09-26 21:18:03 +0000 |
commit | 92d300eb8f1ec51ae3e5b0b4230e781a06d1e4bf (patch) | |
tree | 1503ba6c5c80a2d82a3caf0507ec56bfd89f8f33 /llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp | |
parent | 90986e6c7c8d81985ad2cfa6d085d7d35ee71242 (diff) | |
download | bcm5719-llvm-92d300eb8f1ec51ae3e5b0b4230e781a06d1e4bf.tar.gz bcm5719-llvm-92d300eb8f1ec51ae3e5b0b4230e781a06d1e4bf.zip |
[WebAssembly] Use the frame pointer instead of the stack pointer
When we have dynamic allocas we have a frame pointer, and
when we're lowering frame indexes we should make sure we use it.
Patch by Jacob Gravelle
Differential Revision: https://reviews.llvm.org/D24889
llvm-svn: 282442
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp index 5e5b288f2e7..bb8fe9ae996 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp @@ -64,6 +64,11 @@ void WebAssemblyRegisterInfo::eliminateFrameIndex( const MachineFrameInfo &MFI = MF.getFrameInfo(); int64_t FrameOffset = MFI.getStackSize() + MFI.getObjectOffset(FrameIndex); + assert(MFI.getObjectSize(FrameIndex) != 0 && + "We assume that variable-sized objects have already been lowered, " + "and don't use FrameIndex operands."); + unsigned FrameRegister = getFrameRegister(MF); + // If this is the address operand of a load or store, make it relative to SP // and fold the frame offset directly in. if (MI.mayLoadOrStore() && FIOperandNum == WebAssembly::MemOpAddressOperandNo) { @@ -73,7 +78,7 @@ void WebAssemblyRegisterInfo::eliminateFrameIndex( if (static_cast<uint64_t>(Offset) <= std::numeric_limits<uint32_t>::max()) { MI.getOperand(FIOperandNum - 1).setImm(Offset); MI.getOperand(FIOperandNum) - .ChangeToRegister(WebAssembly::SP32, /*IsDef=*/false); + .ChangeToRegister(FrameRegister, /*IsDef=*/false); return; } } @@ -94,7 +99,7 @@ void WebAssemblyRegisterInfo::eliminateFrameIndex( MachineOperand &ImmMO = Def->getOperand(1); ImmMO.setImm(ImmMO.getImm() + uint32_t(FrameOffset)); MI.getOperand(FIOperandNum) - .ChangeToRegister(WebAssembly::SP32, /*IsDef=*/false); + .ChangeToRegister(FrameRegister, /*IsDef=*/false); return; } } @@ -104,7 +109,7 @@ void WebAssemblyRegisterInfo::eliminateFrameIndex( // Otherwise create an i32.add SP, offset and make it the operand. const auto *TII = MF.getSubtarget<WebAssemblySubtarget>().getInstrInfo(); - unsigned FIRegOperand = WebAssembly::SP32; + unsigned FIRegOperand = FrameRegister; if (FrameOffset) { // Create i32.add SP, offset and make it the operand. const TargetRegisterClass *PtrRC = @@ -116,7 +121,7 @@ void WebAssemblyRegisterInfo::eliminateFrameIndex( FIRegOperand = MRI.createVirtualRegister(PtrRC); BuildMI(MBB, *II, II->getDebugLoc(), TII->get(WebAssembly::ADD_I32), FIRegOperand) - .addReg(WebAssembly::SP32) + .addReg(FrameRegister) .addReg(OffsetOp); } MI.getOperand(FIOperandNum).ChangeToRegister(FIRegOperand, /*IsDef=*/false); |