From a7288df62db835ba4958d6e7c7fca237682840db Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Sat, 3 Mar 2007 06:32:37 +0000 Subject: 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 --- lib/CodeGen/VirtRegMap.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) (limited to 'lib/CodeGen/VirtRegMap.cpp') 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)); } } -- cgit v1.2.3