From 3e20475feebca3bfb29375ac7f3e5acbeb2a95c8 Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Wed, 11 Nov 2009 19:31:31 +0000 Subject: Fix liveness calculation when splitting critical edges during PHI elimination. - Edges are split before any phis are eliminated, so the code is SSA. - Create a proper IR BasicBlock for the split edges. - LiveVariables::addNewBlock now has same syntax as MachineDominatorTree::addNewBlock. Algorithm calculates predecessor live-out set rather than successor live-in set. This feature still causes some miscompilations. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86867 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/LiveVariables.cpp | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) (limited to 'lib/CodeGen/LiveVariables.cpp') diff --git a/lib/CodeGen/LiveVariables.cpp b/lib/CodeGen/LiveVariables.cpp index 1580667222..cba0371f25 100644 --- a/lib/CodeGen/LiveVariables.cpp +++ b/lib/CodeGen/LiveVariables.cpp @@ -650,34 +650,35 @@ void LiveVariables::analyzePHINodes(const MachineFunction& Fn) { .push_back(BBI->getOperand(i).getReg()); } -void LiveVariables::addNewBlock(MachineBasicBlock *A, MachineBasicBlock *B) { - unsigned NumA = A->getNumber(); - unsigned NumB = B->getNumber(); +/// addNewBlock - Add a new basic block BB as an empty succcessor to DomBB. All +/// variables that are live out of DomBB will be marked as passing live through +/// BB. +void LiveVariables::addNewBlock(MachineBasicBlock *BB, + MachineBasicBlock *DomBB) { + const unsigned NumNew = BB->getNumber(); + const unsigned NumDom = DomBB->getNumber(); // Update info for all live variables - for (unsigned i = 0, e = VirtRegInfo.size(); i != e; ++i) { - VarInfo &VI = VirtRegInfo[i]; + for (unsigned Reg = TargetRegisterInfo::FirstVirtualRegister, + E = MRI->getLastVirtReg()+1; Reg != E; ++Reg) { + VarInfo &VI = getVarInfo(Reg); - // Anything live through B is also live through A. - if (VI.AliveBlocks.test(NumB)) { - VI.AliveBlocks.set(NumA); + // Anything live through DomBB is also live through BB. + if (VI.AliveBlocks.test(NumDom)) { + VI.AliveBlocks.set(NumNew); continue; } - // If we're not killed in B, we are not live in - if (!VI.findKill(B)) + // Variables not defined in DomBB cannot be live out. + const MachineInstr *Def = MRI->getVRegDef(Reg); + if (!Def || Def->getParent() != DomBB) continue; - unsigned Reg = i+TargetRegisterInfo::FirstVirtualRegister; + // Killed by DomBB? + if (VI.findKill(DomBB)) + continue; - // Find a def outside B - for (MachineRegisterInfo::def_iterator di = MRI->def_begin(Reg), - de=MRI->def_end(); di != de; ++di) { - if (di->getParent() != B) { - // Reg was defined outside B and killed in B - it must be live in. - VI.AliveBlocks.set(NumA); - break; - } - } + // This register is defined in DomBB and live out + VI.AliveBlocks.set(NumNew); } } -- cgit v1.2.3-18-g5258