When a variable is killed and redifined in a basic block only one
authorAlkis Evlogimenos <alkis@evlogimenos.com>
Thu, 18 Dec 2003 08:53:43 +0000 (08:53 +0000)
committerAlkis Evlogimenos <alkis@evlogimenos.com>
Thu, 18 Dec 2003 08:53:43 +0000 (08:53 +0000)
killing instruction is tracked. This causes the LiveIntervals to
create bogus intervals. The workaound is to add a range to the
interval from the redefinition to the end of the basic block.

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

lib/CodeGen/LiveIntervalAnalysis.cpp

index 564d9cd384a0d711474609083b589039270fb796..e5171ad5c48e2f1e629553fb653fe36decaffd6a 100644 (file)
@@ -152,11 +152,14 @@ void LiveIntervals::handleVirtualRegisterDef(MachineBasicBlock* mbb,
     for (int i = 0, e = vi.Kills.size(); i != e; ++i) {
         MachineBasicBlock* killerBlock = vi.Kills[i].first;
         MachineInstr* killerInstr = vi.Kills[i].second;
-        killedInDefiningBasicBlock |= mbb == killerBlock;
         unsigned start = (mbb == killerBlock ?
                           instrIndex :
                           getInstructionIndex(killerBlock->front()));
         unsigned end = getInstructionIndex(killerInstr) + 1;
+        if (start < end) {
+            killedInDefiningBasicBlock |= mbb == killerBlock;
+            interval->addRange(start, end);
+        }
     }
 
     if (!killedInDefiningBasicBlock) {