From: Evan Cheng Date: Sat, 3 Mar 2007 06:32:37 +0000 (+0000) Subject: Only propagate IsKill if the last use is a kill. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=a7288df62db835ba4958d6e7c7fca237682840db;p=oota-llvm.git 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 --- diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp index 66633facf9e..9a1e58f58ac 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)); } }