Don't do pre-splitting if doing so would create a value join that did not
authorOwen Anderson <resistor@mac.com>
Sun, 2 Nov 2008 08:08:18 +0000 (08:08 +0000)
committerOwen Anderson <resistor@mac.com>
Sun, 2 Nov 2008 08:08:18 +0000 (08:08 +0000)
exist before.  Updating the live intervals in that care is tricky in the general
case.

Evan, if you see a tighter guard condition for this, let me know.

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

lib/CodeGen/PreAllocSplitting.cpp

index 8f223b36007f5a2a97a5e0b6547d3a348b47bcc7..4044b7365b73f2f3c6782534b3ecafe1077d3531 100644 (file)
@@ -89,6 +89,8 @@ namespace {
         AU.addPreservedID(StrongPHIEliminationID);
       else
         AU.addPreservedID(PHIEliminationID);
+      AU.addRequired<MachineLoopInfo>();
+      AU.addPreserved<MachineLoopInfo>();
       MachineFunctionPass::getAnalysisUsage(AU);
     }
     
@@ -633,6 +635,14 @@ bool PreAllocSplitting::SplitRegLiveInterval(LiveInterval *LI) {
     assert(0 && "Val# is defined by a dead def?");
     abort();
   }
+  
+  // Pre-splitting a vreg that does not have a PHI kill across a barrier
+  // that is within a loop can potentially create a join that was not
+  // present before, which would make updating the live intervals very
+  // difficult.  Bailout instead.
+  MachineLoopInfo& MLI = getAnalysis<MachineLoopInfo>();
+  if (!ValNo->hasPHIKill && MLI.getLoopFor(BarrierMBB))
+    return false;
 
   // FIXME: For now, if definition is rematerializable, do not split.
   MachineInstr *DefMI = (ValNo->def != ~0U)