mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-20 00:20:11 +00:00
Add SplitEditor::markOverlappedComplement().
This function is used to flag values where the complement interval may overlap other intervals. Call it from overlapIntv, and use the flag to fully recompute those live ranges in transferValues(). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139612 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -317,6 +317,7 @@ void SplitEditor::reset(LiveRangeEdit &LRE, ComplementSpillMode SM) {
|
||||
Edit = &LRE;
|
||||
SpillMode = SM;
|
||||
OpenIdx = 0;
|
||||
OverlappedComplement.clear();
|
||||
RegAssign.clear();
|
||||
Values.clear();
|
||||
|
||||
@@ -391,6 +392,16 @@ void SplitEditor::markComplexMapped(unsigned RegIdx, const VNInfo *ParentVNI) {
|
||||
VNI = 0;
|
||||
}
|
||||
|
||||
void SplitEditor::markOverlappedComplement(const VNInfo *ParentVNI) {
|
||||
if (OverlappedComplement.insert(ParentVNI))
|
||||
markComplexMapped(0, ParentVNI);
|
||||
}
|
||||
|
||||
bool SplitEditor::needsRecompute(unsigned RegIdx, const VNInfo *ParentVNI) {
|
||||
return (RegIdx == 0 && OverlappedComplement.count(ParentVNI)) ||
|
||||
Edit->didRematerialize(ParentVNI);
|
||||
}
|
||||
|
||||
VNInfo *SplitEditor::defFromParent(unsigned RegIdx,
|
||||
VNInfo *ParentVNI,
|
||||
SlotIndex UseIdx,
|
||||
@@ -575,7 +586,7 @@ void SplitEditor::overlapIntv(SlotIndex Start, SlotIndex End) {
|
||||
|
||||
// The complement interval will be extended as needed by LRCalc.extend().
|
||||
if (ParentVNI)
|
||||
markComplexMapped(0, ParentVNI);
|
||||
markOverlappedComplement(ParentVNI);
|
||||
DEBUG(dbgs() << " overlapIntv [" << Start << ';' << End << "):");
|
||||
RegAssign.insert(Start, End, OpenIdx);
|
||||
DEBUG(dump());
|
||||
@@ -623,7 +634,7 @@ bool SplitEditor::transferValues() {
|
||||
|
||||
// Skip rematerialized values, we need to use LRCalc.extend() and
|
||||
// extendPHIKillRanges() to completely recompute the live ranges.
|
||||
if (Edit->didRematerialize(ParentVNI)) {
|
||||
if (needsRecompute(RegIdx, ParentVNI)) {
|
||||
DEBUG(dbgs() << "(remat)");
|
||||
Skipped = true;
|
||||
Start = End;
|
||||
|
||||
Reference in New Issue
Block a user