diff options
author | Owen Anderson <resistor@mac.com> | 2008-03-26 03:03:23 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2008-03-26 03:03:23 +0000 |
commit | d382f8a32de02e04db5f88e881fe11db4040be40 (patch) | |
tree | 902430cfdab63fa54c601bbb4484907b0880a996 /lib | |
parent | 8a64d5ed37c90cc38b9ce7914b4e76c87f85370b (diff) | |
download | external_llvm-d382f8a32de02e04db5f88e881fe11db4040be40.zip external_llvm-d382f8a32de02e04db5f88e881fe11db4040be40.tar.gz external_llvm-d382f8a32de02e04db5f88e881fe11db4040be40.tar.bz2 |
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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/StrongPHIElimination.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/CodeGen/StrongPHIElimination.cpp b/lib/CodeGen/StrongPHIElimination.cpp index 87801da..eedf8ad 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<MachineInstr*>::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(); } |