From d382f8a32de02e04db5f88e881fe11db4040be40 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Wed, 26 Mar 2008 03:03:23 +0000 Subject: [PATCH] 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 --- lib/CodeGen/StrongPHIElimination.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) 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(); } -- 2.34.1