aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/SplitKit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/SplitKit.cpp')
-rw-r--r--lib/CodeGen/SplitKit.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp
index 4bf3a7a..89e85bd 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;