[WebAssembly] Implement prolog/epilog insertion and FrameIndex elimination
[oota-llvm.git] / lib / Target / WebAssembly / WebAssemblyRegNumbering.cpp
index 52d93e5fd89557c338d1cefe95fe2331f218aab1..0a945336a2bb8b2870fc3a16eb1a40d81391bb6f 100644 (file)
@@ -19,6 +19,7 @@
 #include "WebAssemblySubtarget.h"
 #include "llvm/ADT/SCCIterator.h"
 #include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/CodeGen/MachineFrameInfo.h"
 #include "llvm/CodeGen/MachineInstrBuilder.h"
 #include "llvm/CodeGen/MachineLoopInfo.h"
 #include "llvm/CodeGen/MachineRegisterInfo.h"
@@ -60,6 +61,7 @@ bool WebAssemblyRegNumbering::runOnMachineFunction(MachineFunction &MF) {
 
   WebAssemblyFunctionInfo &MFI = *MF.getInfo<WebAssemblyFunctionInfo>();
   MachineRegisterInfo &MRI = MF.getRegInfo();
+  const MachineFrameInfo &FrameInfo = *MF.getFrameInfo();
 
   MFI.initWARegs();
 
@@ -98,6 +100,9 @@ bool WebAssemblyRegNumbering::runOnMachineFunction(MachineFunction &MF) {
     if (MFI.getWAReg(VReg) == WebAssemblyFunctionInfo::UnusedReg)
       MFI.setWAReg(VReg, NumArgRegs + CurReg++);
   }
+  // Allocate locals for used physical registers
+  if (FrameInfo.getStackSize() > 0)
+    MFI.addPReg(WebAssembly::SP32, CurReg++);
 
   return true;
 }