aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2008-03-26 03:03:23 +0000
committerOwen Anderson <resistor@mac.com>2008-03-26 03:03:23 +0000
commitd382f8a32de02e04db5f88e881fe11db4040be40 (patch)
tree902430cfdab63fa54c601bbb4484907b0880a996 /lib
parent8a64d5ed37c90cc38b9ce7914b4e76c87f85370b (diff)
downloadexternal_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.cpp22
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();
}