aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/PreAllocSplitting.cpp
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2009-02-01 07:06:00 +0000
committerOwen Anderson <resistor@mac.com>2009-02-01 07:06:00 +0000
commit5caedc0f0905bfc5472282cf56f92ebf14fb1c66 (patch)
tree283e8fba7b726c079713896c2fe2ca7a014d3d30 /lib/CodeGen/PreAllocSplitting.cpp
parent2d5424d76add9714d95239f183f7f88263f44360 (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.cpp67
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];