From: Owen Anderson Date: Wed, 26 Mar 2008 03:03:23 +0000 (+0000) Subject: Dead PHI instructions need to be handled specially. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=d382f8a32de02e04db5f88e881fe11db4040be40;p=oota-llvm.git Dead PHI instructions need to be handled specially. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48811 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/StrongPHIElimination.cpp b/lib/CodeGen/StrongPHIElimination.cpp index 87801da2bd0..eedf8adcc62 100644 --- a/lib/CodeGen/StrongPHIElimination.cpp +++ b/lib/CodeGen/StrongPHIElimination.cpp @@ -414,6 +414,12 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) { while (P != FirstNonPHI && P->getOpcode() == TargetInstrInfo::PHI) { unsigned DestReg = P->getOperand(0).getReg(); + // Don't both doing PHI elimination for dead PHI's. + if (P->registerDefIsDead(DestReg)) { + ++P; + continue; + } + LiveInterval& PI = LI.getOrCreateInterval(DestReg); unsigned pIdx = LI.getInstructionIndex(FirstNonPHI); VNInfo* PVN = PI.getLiveRangeContaining(pIdx)->valno; @@ -911,6 +917,22 @@ bool StrongPHIElimination::runOnMachineFunction(MachineFunction &Fn) { for (std::vector::iterator I = phis.begin(), E = phis.end(); I != E; ++I) { + // If this is a dead PHI node, then remove it from LiveIntervals. + unsigned DestReg = (*I)->getOperand(0).getReg(); + if ((*I)->registerDefIsDead(DestReg)) { + LiveInterval& PI = LI.getInterval(DestReg); + + if (PI.containsOneValue()) { + LI.removeInterval(DestReg); + } else { + MachineBasicBlock::iterator PIter = *I; + while (PIter->getOpcode() == TargetInstrInfo::PHI) ++PIter; + unsigned idx = LI.getInstructionIndex(PIter); + + PI.removeRange(*PI.getLiveRangeContaining(idx), true); + } + } + LI.RemoveMachineInstrFromMaps(*I); (*I)->eraseFromParent(); }