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
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 @@
   Edit = &LRE;
   SpillMode = SM;
   OpenIdx = 0;
+  OverlappedComplement.clear();
   RegAssign.clear();
   Values.clear();
 
@@ -391,6 +392,16 @@
   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 @@
 
   // 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 @@
 
       // 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;