Take another stab at getting isLiveIn() and isLiveOut() right.
authorOwen Anderson <resistor@mac.com>
Thu, 8 Nov 2007 01:32:45 +0000 (01:32 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 8 Nov 2007 01:32:45 +0000 (01:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43869 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/StrongPHIElimination.cpp

index 200ae8f84e65178963c710af5cfe23fbd2197cf1..5f84b586cb8a0aea9ec2da00837703309692862e 100644 (file)
@@ -225,10 +225,9 @@ bool isLiveIn(LiveVariables::VarInfo& V, MachineBasicBlock* MBB) {
   if (V.AliveBlocks.test(MBB->getNumber()))
     return true;
   
-  for (std::vector<MachineInstr*>::iterator I = V.Kills.begin(),
-       E = V.Kills.end(); I != E; ++I)
-    if ((*I)->getParent() == MBB)
-      return true;
+  if (V.DefInst->getParent() != MBB &&
+      V.UsedBlocks.test(MBB->getNumber()))
+    return true;
   
   return false;
 }
@@ -236,11 +235,15 @@ bool isLiveIn(LiveVariables::VarInfo& V, MachineBasicBlock* MBB) {
 /// isLiveOut - help method that determines, from a VarInfo, if a register is
 /// live out of a block.
 bool isLiveOut(LiveVariables::VarInfo& V, MachineBasicBlock* MBB) {
-  if (V.AliveBlocks.test(MBB->getNumber()))
-    return true;
-  
-  if (V.DefInst->getParent() == MBB)
+  if (MBB == V.DefInst->getParent() ||
+      V.UsedBlocks.test(MBB->getNumber())) {
+    for (std::vector<MachineInstr*>::iterator I = V.Kills.begin(), 
+         E = V.Kills.end(); I != E; ++I)
+      if ((*I)->getParent() == MBB)
+        return false;
+    
     return true;
+  }
   
   return false;
 }