Changes in directory llvm/lib/CodeGen:
VirtRegMap.cpp updated: 1.103 -> 1.104 --- Log message: Only propagate IsKill if the last use is a kill. --- Diffs of the changes: (+22 -8) VirtRegMap.cpp | 30 ++++++++++++++++++++++-------- 1 files changed, 22 insertions(+), 8 deletions(-) Index: llvm/lib/CodeGen/VirtRegMap.cpp diff -u llvm/lib/CodeGen/VirtRegMap.cpp:1.103 llvm/lib/CodeGen/VirtRegMap.cpp:1.104 --- llvm/lib/CodeGen/VirtRegMap.cpp:1.103 Fri Mar 2 02:52:00 2007 +++ llvm/lib/CodeGen/VirtRegMap.cpp Sat Mar 3 00:32:37 2007 @@ -703,15 +703,19 @@ // 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 @@ // 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 @@ // 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)); } } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits