mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-23 02:32:11 +00:00
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
This commit is contained in:
parent
2d5424d76a
commit
5caedc0f09
@ -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];
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user