[llvm-commits] [llvm] r48811 - /llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
Owen Anderson
resistor at mac.com
Tue Mar 25 20:03:24 PDT 2008
Author: resistor
Date: Tue Mar 25 22:03:23 2008
New Revision: 48811
URL: http://llvm.org/viewvc/llvm-project?rev=48811&view=rev
Log:
Dead PHI instructions need to be handled specially.
Modified:
llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
Modified: llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp?rev=48811&r1=48810&r2=48811&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp (original)
+++ llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Tue Mar 25 22:03:23 2008
@@ -414,6 +414,12 @@
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 @@
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();
}
More information about the llvm-commits
mailing list