From 66838e9a2707d822ce2eaa1211c5e85118e47860 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Sun, 1 Feb 2009 07:06:00 +0000 Subject: [PATCH] Fix an issue in PHI construction that was exposed by GCC 4.2 producing a different set iteration order for the reg_iterator. llvm-svn: 63490 --- llvm/lib/CodeGen/PreAllocSplitting.cpp | 67 +++++++++++--------------- 1 file changed, 27 insertions(+), 40 deletions(-) diff --git a/llvm/lib/CodeGen/PreAllocSplitting.cpp b/llvm/lib/CodeGen/PreAllocSplitting.cpp index 1180dee7b793..dc4a42ae375e 100644 --- a/llvm/lib/CodeGen/PreAllocSplitting.cpp +++ b/llvm/lib/CodeGen/PreAllocSplitting.cpp @@ -467,39 +467,26 @@ VNInfo* PreAllocSplitting::PerformPHIConstruction( unsigned StartIndex = LIs->getMBBStartIdx(MBB); - if (MBB->pred_size() == 1) { - Phis[MBB] = ret = PerformPHIConstruction((*MBB->pred_begin())->end(), - *(MBB->pred_begin()), LI, Visited, - Defs, Uses, NewVNs, LiveOut, Phis, - false, false); - unsigned EndIndex = 0; - if (intrablock) { - EndIndex = LIs->getInstructionIndex(use); - EndIndex = LiveIntervals::getUseIndex(EndIndex); - } else - EndIndex = LIs->getMBBEndIdx(MBB); - - LI->addRange(LiveRange(StartIndex, EndIndex+1, ret)); - if (intrablock) - LI->addKill(ret, EndIndex); - } else { - Phis[MBB] = ret = LI->getNextValue(~0U, /*FIXME*/ 0, + Phis[MBB] = ret = LI->getNextValue(~0U, /*FIXME*/ 0, LIs->getVNInfoAllocator()); - if (!intrablock) LiveOut[MBB] = ret; + if (!intrablock) LiveOut[MBB] = ret; - // If there are no uses or defs between our starting point and the - // beginning of the block, then recursive perform phi construction - // on our predecessors. - DenseMap IncomingVNs; - for (MachineBasicBlock::pred_iterator PI = MBB->pred_begin(), - PE = MBB->pred_end(); PI != PE; ++PI) { - VNInfo* Incoming = PerformPHIConstruction((*PI)->end(), *PI, LI, - Visited, Defs, Uses, NewVNs, - LiveOut, Phis, false, false); - if (Incoming != 0) - IncomingVNs[*PI] = Incoming; - } + // If there are no uses or defs between our starting point and the + // beginning of the block, then recursive perform phi construction + // on our predecessors. + DenseMap IncomingVNs; + for (MachineBasicBlock::pred_iterator PI = MBB->pred_begin(), + PE = MBB->pred_end(); PI != PE; ++PI) { + VNInfo* Incoming = PerformPHIConstruction((*PI)->end(), *PI, LI, + Visited, Defs, Uses, NewVNs, + LiveOut, Phis, false, false); + if (Incoming != 0) + IncomingVNs[*PI] = Incoming; + } + if (MBB->pred_size() == 1 && !ret->hasPHIKill) { + LI->MergeValueNumberInto(ret, IncomingVNs.begin()->second); + } else { // Otherwise, merge the incoming VNInfos with a phi join. Create a new // VNInfo to represent the joined value. for (DenseMap::iterator I = @@ -509,17 +496,17 @@ VNInfo* PreAllocSplitting::PerformPHIConstruction( if (!LiveInterval::isKill(I->second, KillIndex)) LI->addKill(I->second, KillIndex); } - - unsigned EndIndex = 0; - if (intrablock) { - EndIndex = LIs->getInstructionIndex(use); - EndIndex = LiveIntervals::getUseIndex(EndIndex); - } else - EndIndex = LIs->getMBBEndIdx(MBB); - LI->addRange(LiveRange(StartIndex, EndIndex+1, ret)); - if (intrablock) - LI->addKill(ret, EndIndex); } + + unsigned EndIndex = 0; + if (intrablock) { + EndIndex = LIs->getInstructionIndex(use); + EndIndex = LiveIntervals::getUseIndex(EndIndex); + } else + EndIndex = LIs->getMBBEndIdx(MBB); + LI->addRange(LiveRange(StartIndex, EndIndex+1, ret)); + if (intrablock) + LI->addKill(ret, EndIndex); } else if (ContainsDefs && !ContainsUses) { SmallPtrSet& BlockDefs = Defs[MBB];