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 | 5d2d1776e0f250cc517e8a194de37d693b4b10d2 (patch) | |
| tree | 206c92bc23e00a3503313276d1c2ebdbd05f9b94 /llvm/lib/CodeGen | |
| parent | 05acd73a731f380e60dd8605e3a0b1255a4e0278 (diff) | |
| download | bcm5719-llvm-5d2d1776e0f250cc517e8a194de37d693b4b10d2.tar.gz bcm5719-llvm-5d2d1776e0f250cc517e8a194de37d693b4b10d2.zip | |
Dead PHI instructions need to be handled specially.
llvm-svn: 48811
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/StrongPHIElimination.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/StrongPHIElimination.cpp b/llvm/lib/CodeGen/StrongPHIElimination.cpp index 87801da2bd0..eedf8adcc62 100644 --- a/llvm/lib/CodeGen/StrongPHIElimination.cpp +++ b/llvm/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(); } |

