Don't assume that only Uses can be kills. Defs are marked as kills initially
authorDan Gohman <gohman@apple.com>
Fri, 20 Jul 2007 23:17:34 +0000 (23:17 +0000)
committerDan Gohman <gohman@apple.com>
Fri, 20 Jul 2007 23:17:34 +0000 (23:17 +0000)
when there are no uses. This fixes a dangling-pointer bug, where pointers to
deleted instructions were not removed from kills lists. More info here:
http://lists.cs.uiuc.edu/pipermail/llvmdev/2007-July/009749.html

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40131 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/LiveVariables.h
lib/CodeGen/LiveVariables.cpp
lib/CodeGen/SimpleRegisterCoalescing.cpp

index ec01556a7e7492d047548ad1683338995867ee20..36b6860cf6a3761555703ad2bb9fac66a44c76cd 100644 (file)
@@ -229,7 +229,7 @@ public:
     bool Removed = false;
     for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
       MachineOperand &MO = MI->getOperand(i);
-      if (MO.isReg() && MO.isUse() && MO.getReg() == reg) {
+      if (MO.isReg() && MO.isKill() && MO.getReg() == reg) {
         MO.unsetIsKill();
         Removed = true;
         break;
index 504b607b8576a487a11db3924656566127990ad4..d1ebaf102fc298c345cf56dae7aa4c6d3550bc03 100644 (file)
@@ -582,15 +582,13 @@ void LiveVariables::instructionChanged(MachineInstr *OldMI,
         if (VI.DefInst == OldMI)
           VI.DefInst = NewMI;
       }
-      if (MO.isUse()) {
-        if (MO.isKill()) {
-          MO.unsetIsKill();
-          addVirtualRegisterKilled(Reg, NewMI);
-        }
-        // If this is a kill of the value, update the VI kills list.
-        if (VI.removeKill(OldMI))
-          VI.Kills.push_back(NewMI);   // Yes, there was a kill of it
+      if (MO.isKill()) {
+        MO.unsetIsKill();
+        addVirtualRegisterKilled(Reg, NewMI);
       }
+      // If this is a kill of the value, update the VI kills list.
+      if (VI.removeKill(OldMI))
+        VI.Kills.push_back(NewMI);   // Yes, there was a kill of it
     }
   }
 }
index b714bac86a1019ff2b70e03fe564616826dc9124..4619fd7f4f015824a104a8d73a16fad3fb7e17f9 100644 (file)
@@ -955,7 +955,7 @@ MachineOperand *SimpleRegisterCoalescing::findDefOperand(MachineInstr *MI, unsig
 void SimpleRegisterCoalescing::unsetRegisterKill(MachineInstr *MI, unsigned Reg) {
   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
     MachineOperand &MO = MI->getOperand(i);
-    if (MO.isReg() && MO.isUse() && MO.isKill() && MO.getReg() &&
+    if (MO.isReg() && MO.isKill() && MO.getReg() &&
         mri_->regsOverlap(rep(MO.getReg()), Reg))
       MO.unsetIsKill();
   }
@@ -979,7 +979,7 @@ void SimpleRegisterCoalescing::unsetRegisterKills(unsigned Start, unsigned End,
 
     for (unsigned i = 0, NumOps = MI->getNumOperands(); i != NumOps; ++i) {
       MachineOperand &MO = MI->getOperand(i);
-      if (MO.isReg() && MO.isUse() && MO.isKill() && MO.getReg() &&
+      if (MO.isReg() && MO.isKill() && MO.getReg() &&
           mri_->regsOverlap(rep(MO.getReg()), Reg)) {
         MO.unsetIsKill();
       }