diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-03-03 06:32:37 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-03-03 06:32:37 +0000 |
commit | a7288df62db835ba4958d6e7c7fca237682840db (patch) | |
tree | 60ae0d21d01f4c19ea42d4c8a2b8a219048c04cc /lib/CodeGen/VirtRegMap.cpp | |
parent | e1aa0662162a891b5eb7c4e847e5332adf5e2b86 (diff) |
Only propagate IsKill if the last use is a kill.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34878 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/VirtRegMap.cpp')
-rw-r--r-- | lib/CodeGen/VirtRegMap.cpp | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp index 66633facf9..9a1e58f58a 100644 --- a/lib/CodeGen/VirtRegMap.cpp +++ b/lib/CodeGen/VirtRegMap.cpp @@ -703,15 +703,19 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) { // Extend the live range of the MI that last kill the register if // necessary. + bool WasKill = false; if (SSMI) { MachineOperand *MOK = SSMI->findRegisterUseOperand(PhysReg, true); - if (MOK) + if (MOK) { + WasKill = MOK->isKill(); MOK->unsetIsKill(); + } } if (ti == -1) { // Unless it's the use of a two-address code, transfer the kill // of the reused register to this use. - MI.getOperand(i).setIsKill(); + if (WasKill) + MI.getOperand(i).setIsKill(); Spills.addLastUse(PhysReg, &MI); } @@ -782,15 +786,21 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) { // Extend the live range of the MI that last kill the register if // necessary. + bool WasKill = false; if (SSMI) { MachineOperand *MOK = SSMI->findRegisterUseOperand(PhysReg, true); - if (MOK) + if (MOK) { + WasKill = MOK->isKill(); MOK->unsetIsKill(); + } } MachineInstr *CopyMI = prior(MII); - MachineOperand *MOU = CopyMI->findRegisterUseOperand(PhysReg); - MOU->setIsKill(); - Spills.addLastUse(PhysReg, &MI); + if (WasKill) { + // Transfer kill to the next use. + MachineOperand *MOU = CopyMI->findRegisterUseOperand(PhysReg); + MOU->setIsKill(); + } + Spills.addLastUse(PhysReg, CopyMI); // This invalidates DesignatedReg. Spills.ClobberPhysReg(DesignatedReg); @@ -877,16 +887,20 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) { // Either way, the live range of the last kill of InReg has been // extended. Remove its kill. + bool WasKill = false; if (SSMI) { MachineOperand *MOK = SSMI->findRegisterUseOperand(InReg, true); - if (MOK) + if (MOK) { + WasKill = MOK->isKill(); MOK->unsetIsKill(); + } } if (NextMII != MBB.end()) { // If NextMII uses InReg (must be the copy?), mark it killed. MachineOperand *MOU = NextMII->findRegisterUseOperand(InReg); if (MOU) { - MOU->setIsKill(); + if (WasKill) + MOU->setIsKill(); Spills.addLastUse(InReg, &(*NextMII)); } } |