diff options
Diffstat (limited to 'lib/CodeGen/SplitKit.cpp')
-rw-r--r-- | lib/CodeGen/SplitKit.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp index 4bf3a7aab0..89e85bd383 100644 --- a/lib/CodeGen/SplitKit.cpp +++ b/lib/CodeGen/SplitKit.cpp @@ -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; |