summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyFrameLowering.cpp1
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp5
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.cpp21
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);
}
}
OpenPOWER on IntegriCloud