From 6423c6c0e8e85d843750f9563180ef7bcfca56c6 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Sun, 2 Nov 2008 08:08:18 +0000 Subject: [PATCH] Don't do pre-splitting if doing so would create a value join that did not 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 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/CodeGen/PreAllocSplitting.cpp b/lib/CodeGen/PreAllocSplitting.cpp index 8f223b36007..4044b7365b7 100644 --- a/lib/CodeGen/PreAllocSplitting.cpp +++ b/lib/CodeGen/PreAllocSplitting.cpp @@ -89,6 +89,8 @@ namespace { AU.addPreservedID(StrongPHIEliminationID); else AU.addPreservedID(PHIEliminationID); + AU.addRequired(); + AU.addPreserved(); 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(); + if (!ValNo->hasPHIKill && MLI.getLoopFor(BarrierMBB)) + return false; // FIXME: For now, if definition is rematerializable, do not split. MachineInstr *DefMI = (ValNo->def != ~0U)