Ensure that the computed interference intervals actually overlap their basic blocks.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 3 Feb 2011 20:29:43 +0000 (20:29 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Thu, 3 Feb 2011 20:29:43 +0000 (20:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124815 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocGreedy.cpp

index 730bddb8b00f3a83dc212a02661f699ff310594f..92f97d046f5d88356a8b0b6b8cd4f8bb5b2937f5 100644 (file)
@@ -626,6 +626,8 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg,
         IntI.advanceTo(Start);
         if (!IntI.valid())
           break;
+        if (IntI.start() >= Stop)
+          continue;
         if (!IP.first.isValid() || IntI.start() < IP.first)
           IP.first = IntI.start();
       }
@@ -635,6 +637,8 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg,
         IntI.advanceTo(Stop);
         if (!IntI.valid() || IntI.start() >= Stop)
           --IntI;
+        if (IntI.stop() <= Start)
+          continue;
         if (!IP.second.isValid() || IntI.stop() > IP.second)
           IP.second = IntI.stop();
       }
@@ -663,10 +667,15 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg,
     tie(Start, Stop) = Indexes->getMBBRange(BI.MBB);
 
     DEBUG(dbgs() << "BB#" << BI.MBB->getNumber() << " -> EB#"
-                 << Bundles->getBundle(BI.MBB->getNumber(), 1));
+                 << Bundles->getBundle(BI.MBB->getNumber(), 1)
+                 << " intf [" << IP.first << ';' << IP.second << ')');
+
+    // The interference interval should either be invalid or overlap MBB.
+    assert((!IP.first.isValid() || IP.first < Stop) && "Bad interference");
+    assert((!IP.second.isValid() || IP.second > Start) && "Bad interference");
 
     // Check interference leaving the block.
-    if (!IP.second.isValid() || IP.second < Start) {
+    if (!IP.second.isValid()) {
       // Block is interference-free.
       DEBUG(dbgs() << ", no interference");
       if (!BI.Uses) {
@@ -739,7 +748,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg, unsigned PhysReg,
                  << " -> BB#" << BI.MBB->getNumber());
 
     // Check interference entering the block.
-    if (!IP.first.isValid() || IP.first > Stop) {
+    if (!IP.first.isValid()) {
       // Block is interference-free.
       DEBUG(dbgs() << ", no interference");
       if (!BI.Uses) {