diff options
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp | 1 | ||||
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp | 21 |
3 files changed, 17 insertions, 10 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp index 5ea532e13c9..32d390de40a 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp @@ -160,6 +160,7 @@ void WebAssemblyFrameLowering::emitEpilogue(MachineFunction &MF, BuildMI(MBB, InsertPt, DL, TII->get(WebAssembly::CONST_I32), OffsetReg) .addImm(StackSize); auto *SPSymbol = MF.createExternalSymbolName("__stack_pointer"); + // TODO: Fold this add into the const offset field of the store. BuildMI(MBB, InsertPt, DL, TII->get(WebAssembly::ADD_I32), WebAssembly::SP32) .addReg(WebAssembly::SP32) .addReg(OffsetReg); diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp index 1a8afee8818..5e879e2e04c 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp @@ -120,7 +120,10 @@ bool WebAssemblyPeephole::runOnMachineFunction(MachineFunction &MF) { MachineOperand &MO = MI.getOperand(0); unsigned OldReg = MO.getReg(); unsigned NewReg = Op2.getReg(); - if (MRI.getRegClass(NewReg) != MRI.getRegClass(OldReg)) + + // TODO: Handle SP/physregs in MaybeRewriteToDiscard + if (TargetRegisterInfo::isVirtualRegister(NewReg) && + (MRI.getRegClass(NewReg) != MRI.getRegClass(OldReg))) report_fatal_error("Peephole: call to builtin function with " "wrong signature, from/to mismatch"); Changed |= MaybeRewriteToDiscard(OldReg, NewReg, MO, MFI, MRI); diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp index 95f7326a7d5..46f271c20af 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp @@ -81,15 +81,18 @@ void WebAssemblyRegisterInfo::eliminateFrameIndex( auto &MRI = MF.getRegInfo(); const auto *TII = MF.getSubtarget<WebAssemblySubtarget>().getInstrInfo(); - unsigned OffsetReg = MRI.createVirtualRegister(&WebAssembly::I32RegClass); - BuildMI(MBB, MI, MI.getDebugLoc(), TII->get(WebAssembly::CONST_I32), - OffsetReg) - .addImm(FrameOffset); - BuildMI(MBB, MI, MI.getDebugLoc(), TII->get(WebAssembly::ADD_I32), - OffsetReg) - .addReg(WebAssembly::SP32) - .addReg(OffsetReg); - MI.getOperand(FIOperandNum).ChangeToRegister(OffsetReg, /*IsDef=*/false); + unsigned FIRegOperand = WebAssembly::SP32; + if (FrameOffset) { + FIRegOperand = MRI.createVirtualRegister(&WebAssembly::I32RegClass); + BuildMI(MBB, MI, MI.getDebugLoc(), TII->get(WebAssembly::CONST_I32), + FIRegOperand) + .addImm(FrameOffset); + BuildMI(MBB, MI, MI.getDebugLoc(), TII->get(WebAssembly::ADD_I32), + FIRegOperand) + .addReg(WebAssembly::SP32) + .addReg(FIRegOperand); + } + MI.getOperand(FIOperandNum).ChangeToRegister(FIRegOperand, /*IsDef=*/false); } } |