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 | |
| 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')
| -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();    }  | 

