diff options
author | Derek Schuff <dschuff@google.com> | 2016-01-23 01:20:43 +0000 |
---|---|---|
committer | Derek Schuff <dschuff@google.com> | 2016-01-23 01:20:43 +0000 |
commit | 65194682e930c286b6541ec00533351232c85cb5 (patch) | |
tree | 0175046568c5ae8af21a65696cbb1261791441f4 /llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp | |
parent | 93987df0fdfcee054b3e8c79ed83f7e6db1438fb (diff) | |
download | llvm-65194682e930c286b6541ec00533351232c85cb5.zip llvm-65194682e930c286b6541ec00533351232c85cb5.tar.gz llvm-65194682e930c286b6541ec00533351232c85cb5.tar.bz2 |
[WebAssembly] Fix RegNumbering for the stack pointer
Previously it failed to add NumArgRegs to the offset and so clobbered an
already-used register. Now just start the numbering after the arg regs
and don't duplicate the add. Test coverage for this coming shortly with
the implementation of byval.
llvm-svn: 258597
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp index a583079..88c50a0 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp @@ -74,6 +74,8 @@ bool WebAssemblyRegNumbering::runOnMachineFunction(MachineFunction &MF) { case WebAssembly::ARGUMENT_I64: case WebAssembly::ARGUMENT_F32: case WebAssembly::ARGUMENT_F64: + DEBUG(dbgs() << "Arg VReg " << MI.getOperand(0).getReg() << " -> WAReg " + << MI.getOperand(1).getImm() << "\n"); MFI.setWAReg(MI.getOperand(0).getReg(), MI.getOperand(1).getImm()); break; default: @@ -84,26 +86,32 @@ bool WebAssemblyRegNumbering::runOnMachineFunction(MachineFunction &MF) { // Then assign regular WebAssembly registers for all remaining used // virtual registers. TODO: Consider sorting the registers by frequency of // use, to maximize usage of small immediate fields. - unsigned NumArgRegs = MFI.getParams().size(); unsigned NumVRegs = MF.getRegInfo().getNumVirtRegs(); unsigned NumStackRegs = 0; - unsigned CurReg = 0; + // Start the numbering for locals after the arg regs + unsigned CurReg = MFI.getParams().size(); for (unsigned VRegIdx = 0; VRegIdx < NumVRegs; ++VRegIdx) { unsigned VReg = TargetRegisterInfo::index2VirtReg(VRegIdx); // Handle stackified registers. if (MFI.isVRegStackified(VReg)) { + DEBUG(dbgs() << "VReg " << VReg << " -> WAReg " + << (INT32_MIN | NumStackRegs) << "\n"); MFI.setWAReg(VReg, INT32_MIN | NumStackRegs++); continue; } // Skip unused registers. if (MRI.use_empty(VReg)) continue; - if (MFI.getWAReg(VReg) == WebAssemblyFunctionInfo::UnusedReg) - MFI.setWAReg(VReg, NumArgRegs + CurReg++); + if (MFI.getWAReg(VReg) == WebAssemblyFunctionInfo::UnusedReg) { + DEBUG(dbgs() << "VReg " << VReg << " -> WAReg " << CurReg << "\n"); + MFI.setWAReg(VReg, CurReg++); + } } // Allocate locals for used physical registers - if (FrameInfo.getStackSize() > 0) + if (FrameInfo.getStackSize() > 0) { + DEBUG(dbgs() << "PReg SP " << CurReg << "\n"); MFI.addPReg(WebAssembly::SP32, CurReg++); + } return true; } |