diff options
author | Dan Gohman <dan433584@gmail.com> | 2016-02-16 15:17:21 +0000 |
---|---|---|
committer | Dan Gohman <dan433584@gmail.com> | 2016-02-16 15:17:21 +0000 |
commit | 8aa237c3caaaedbf638df545142ca1a2ad473e04 (patch) | |
tree | a913489f4bbc0d20fb420b7ef6ce85ffe08011d9 /llvm/lib/Target | |
parent | 944f655e05e0bb889f63a9949fd4bb3c0d040ae6 (diff) | |
download | bcm5719-llvm-8aa237c3caaaedbf638df545142ca1a2ad473e04.tar.gz bcm5719-llvm-8aa237c3caaaedbf638df545142ca1a2ad473e04.zip |
[WebAssembly] Create new registers instead of reusing old ones in RegStackify.
This avoids some complications updating LiveIntervals to be aware of the new
register lifetimes, because we can just compute new intervals from scratch
rather than describe how the old ones have been changed.
llvm-svn: 260971
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp index 15da0d175f3..e23066c1a92 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp @@ -237,13 +237,13 @@ RematerializeCheapDef(unsigned Reg, MachineOperand &Op, MachineInstr *Def, /// /// to this: /// -/// Reg = INST ... // Def (to become the new Insert) -/// TeeReg, NewReg = TEE_LOCAL_... Reg +/// DefReg = INST ... // Def (to become the new Insert) +/// TeeReg, NewReg = TEE_LOCAL_... DefReg /// INST ..., TeeReg, ... // Insert /// INST ..., NewReg, ... /// INST ..., NewReg, ... /// -/// with Reg and TeeReg stackified. This eliminates a get_local from the +/// with DefReg and TeeReg stackified. This eliminates a get_local from the /// resulting code. static MachineInstr *MoveAndTeeForMultiUse( unsigned Reg, MachineOperand &Op, MachineInstr *Def, MachineBasicBlock &MBB, @@ -254,18 +254,20 @@ static MachineInstr *MoveAndTeeForMultiUse( const auto *RegClass = MRI.getRegClass(Reg); unsigned NewReg = MRI.createVirtualRegister(RegClass); unsigned TeeReg = MRI.createVirtualRegister(RegClass); + unsigned DefReg = MRI.createVirtualRegister(RegClass); MRI.replaceRegWith(Reg, NewReg); MachineInstr *Tee = BuildMI(MBB, Insert, Insert->getDebugLoc(), TII->get(GetTeeLocalOpcode(RegClass)), TeeReg) .addReg(NewReg, RegState::Define) - .addReg(Reg); + .addReg(DefReg); Op.setReg(TeeReg); - Def->getOperand(0).setReg(Reg); + Def->getOperand(0).setReg(DefReg); LIS.InsertMachineInstrInMaps(Tee); - LIS.shrinkToUses(&LIS.getInterval(Reg)); + LIS.removeInterval(Reg); LIS.createAndComputeVirtRegInterval(NewReg); LIS.createAndComputeVirtRegInterval(TeeReg); - MFI.stackifyVReg(Reg); + LIS.createAndComputeVirtRegInterval(DefReg); + MFI.stackifyVReg(DefReg); MFI.stackifyVReg(TeeReg); ImposeStackOrdering(Def); ImposeStackOrdering(Tee); |