mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-13 08:35:46 +00:00
MergeValueInto is too smart: it might choose to do the merge the opposite direction.
Live interval reconstruction needs to account for this, and scour its maps to prevent dangling references. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63558 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8a782a2a8c
commit
5b93f6fa82
@ -276,7 +276,7 @@ namespace llvm {
|
||||
/// are found to be equivalent. This eliminates V1, replacing all
|
||||
/// LiveRanges with the V1 value number with the V2 value number. This can
|
||||
/// cause merging of V1/V2 values numbers and compaction of the value space.
|
||||
void MergeValueNumberInto(VNInfo *V1, VNInfo *V2);
|
||||
VNInfo* MergeValueNumberInto(VNInfo *V1, VNInfo *V2);
|
||||
|
||||
/// MergeInClobberRanges - For any live ranges that are not defined in the
|
||||
/// current interval, but are defined in the Clobbers interval, mark them
|
||||
|
@ -591,7 +591,7 @@ void LiveInterval::MergeInClobberRanges(const LiveInterval &Clobbers,
|
||||
/// are found to be equivalent. This eliminates V1, replacing all
|
||||
/// LiveRanges with the V1 value number with the V2 value number. This can
|
||||
/// cause merging of V1/V2 values numbers and compaction of the value space.
|
||||
void LiveInterval::MergeValueNumberInto(VNInfo *V1, VNInfo *V2) {
|
||||
VNInfo* LiveInterval::MergeValueNumberInto(VNInfo *V1, VNInfo *V2) {
|
||||
assert(V1 != V2 && "Identical value#'s are always equivalent!");
|
||||
|
||||
// This code actually merges the (numerically) larger value number into the
|
||||
@ -652,6 +652,8 @@ void LiveInterval::MergeValueNumberInto(VNInfo *V1, VNInfo *V2) {
|
||||
} else {
|
||||
V1->def = ~1U;
|
||||
}
|
||||
|
||||
return V2;
|
||||
}
|
||||
|
||||
void LiveInterval::Copy(const LiveInterval &RHS,
|
||||
|
@ -654,8 +654,24 @@ PreAllocSplitting::PerformPHIConstructionFallBack(MachineBasicBlock::iterator Us
|
||||
}
|
||||
|
||||
if (MBB->pred_size() == 1 && !RetVNI->hasPHIKill) {
|
||||
LI->MergeValueNumberInto(RetVNI, IncomingVNs.begin()->second);
|
||||
Phis[MBB] = RetVNI = IncomingVNs.begin()->second;
|
||||
VNInfo* OldVN = RetVNI;
|
||||
VNInfo* NewVN = IncomingVNs.begin()->second;
|
||||
VNInfo* MergedVN = LI->MergeValueNumberInto(OldVN, NewVN);
|
||||
if (MergedVN == OldVN) std::swap(OldVN, NewVN);
|
||||
|
||||
for (DenseMap<MachineBasicBlock*, VNInfo*>::iterator LOI = LiveOut.begin(),
|
||||
LOE = LiveOut.end(); LOI != LOE; ++LOI)
|
||||
if (LOI->second == OldVN)
|
||||
LOI->second = MergedVN;
|
||||
for (DenseMap<MachineInstr*, VNInfo*>::iterator NVI = NewVNs.begin(),
|
||||
NVE = NewVNs.end(); NVI != NVE; ++NVI)
|
||||
if (NVI->second == OldVN)
|
||||
NVI->second = MergedVN;
|
||||
for (DenseMap<MachineBasicBlock*, VNInfo*>::iterator PI = Phis.begin(),
|
||||
PE = Phis.end(); PI != PE; ++PI)
|
||||
if (PI->second == OldVN)
|
||||
PI->second = MergedVN;
|
||||
RetVNI = MergedVN;
|
||||
} else {
|
||||
// Otherwise, merge the incoming VNInfos with a phi join. Create a new
|
||||
// VNInfo to represent the joined value.
|
||||
|
Loading…
x
Reference in New Issue
Block a user