diff options
author | Owen Anderson <resistor@mac.com> | 2009-02-01 07:06:00 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2009-02-01 07:06:00 +0000 |
commit | 5caedc0f0905bfc5472282cf56f92ebf14fb1c66 (patch) | |
tree | 283e8fba7b726c079713896c2fe2ca7a014d3d30 /lib/CodeGen/PreAllocSplitting.cpp | |
parent | 2d5424d76add9714d95239f183f7f88263f44360 (diff) |
Fix an issue in PHI construction that was exposed by GCC 4.2 producing a different set iteration order for the reg_iterator.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63490 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/PreAllocSplitting.cpp')
-rw-r--r-- | lib/CodeGen/PreAllocSplitting.cpp | 67 |
1 files changed, 27 insertions, 40 deletions
diff --git a/lib/CodeGen/PreAllocSplitting.cpp b/lib/CodeGen/PreAllocSplitting.cpp index 1180dee7b7..dc4a42ae37 100644 --- a/lib/CodeGen/PreAllocSplitting.cpp +++ b/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<MachineBasicBlock*, VNInfo*> 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<MachineBasicBlock*, VNInfo*> 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<MachineBasicBlock*, VNInfo*>::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<MachineInstr*, 2>& BlockDefs = Defs[MBB]; |