Fix PR10244.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Mon, 4 Jul 2011 00:05:28 +0000 (00:05 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Mon, 4 Jul 2011 00:05:28 +0000 (00:05 +0000)
A split point inserted in a block with a landing pad successor may be
hoisted above the call to ensure that it dominates all successors. The
code that handles the rest of the basic block must take this into
account.

I am not including a test case, it would be very fragile. PR10244 comes
from building clang with exceptions enabled.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134369 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocGreedy.cpp

index 4402694d9a6a32b7d9ebefd44b5efbb9691edebd..acf7f95182f720f045299970d56f77b537c53a2f 100644 (file)
@@ -812,9 +812,9 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg,
     tie(Start, Stop) = Indexes->getMBBRange(BI.MBB);
     Intf.moveToBlock(BI.MBB->getNumber());
     DEBUG(dbgs() << "EB#" << Bundles->getBundle(BI.MBB->getNumber(), 0)
-                 << (RegIn ? " => " : " -- ")
+                 << (BI.LiveIn ? (RegIn ? " => " : " -> ") : "    ")
                  << "BB#" << BI.MBB->getNumber()
-                 << (RegOut ? " => " : " -- ")
+                 << (BI.LiveOut ? (RegOut ? " => " : " -> ") : "    ")
                  << " EB#" << Bundles->getBundle(BI.MBB->getNumber(), 1)
                  << " [" << Start << ';'
                  << SA->getLastSplitPoint(BI.MBB->getNumber()) << '-' << Stop
@@ -1062,7 +1062,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg,
       //     |---o--    Live-in in MainIntv.
       //     ====---    Switch to LocalIntv before interference.
       //
-      SlotIndex Switch = SE->enterIntvBefore(Intf.first());
+      SlotIndex Switch = SE->enterIntvBefore(std::min(Pos, Intf.first()));
       assert(Switch <= Intf.first() && "Expected to avoid interference");
       SE->useIntv(Switch, Pos);
       SE->selectIntv(MainIntv);
@@ -1080,7 +1080,7 @@ void RAGreedy::splitAroundRegion(LiveInterval &VirtReg,
       //     |   o--    Defined in block.
       //         ---    Begin LocalIntv at first use.
       //
-      SlotIndex Switch = SE->enterIntvBefore(BI.FirstUse);
+      SlotIndex Switch = SE->enterIntvBefore(std::min(Pos, BI.FirstUse));
       SE->useIntv(Switch, Pos);
     }
   }