Avoid moving iterators when the previous block was just visited.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 7 Apr 2011 17:27:50 +0000 (17:27 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 7 Apr 2011 17:27:50 +0000 (17:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129081 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/InterferenceCache.cpp

index 512b4b3ccc19c59b5534dad9e86bc30114c3d671..0aff128c16d0416521fa51964d5d1ca1591d68e1 100644 (file)
@@ -99,13 +99,15 @@ void InterferenceCache::Entry::update(unsigned MBBNum) {
   tie(Start, Stop) = Indexes->getMBBRange(MBBNum);
 
   // Use advanceTo only when possible.
-  if (!PrevPos.isValid() || Start < PrevPos)
-    for (unsigned i = 0, e = Iters.size(); i != e; ++i)
-      Iters[i].find(Start);
-  else
-    for (unsigned i = 0, e = Iters.size(); i != e; ++i)
-      Iters[i].advanceTo(Start);
-  PrevPos = Start;
+  if (PrevPos != Start) {
+    if (!PrevPos.isValid() || Start < PrevPos)
+      for (unsigned i = 0, e = Iters.size(); i != e; ++i)
+        Iters[i].find(Start);
+    else
+      for (unsigned i = 0, e = Iters.size(); i != e; ++i)
+        Iters[i].advanceTo(Start);
+    PrevPos = Start;
+  }
 
   // Check for first interference.
   for (unsigned i = 0, e = Iters.size(); i != e; ++i) {
@@ -129,11 +131,14 @@ void InterferenceCache::Entry::update(unsigned MBBNum) {
     if (!I.valid() || I.start() >= Stop)
       continue;
     I.advanceTo(Stop);
-    if (!I.valid() || I.start() >= Stop)
+    bool Backup = !I.valid() || I.start() >= Stop;
+    if (Backup)
       --I;
     SlotIndex StopI = I.stop();
     if (!BI->Last.isValid() || StopI > BI->Last)
       BI->Last = StopI;
+    if (Backup)
+      ++I;
   }
   PrevPos = Stop;
 }