aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2011-07-04 00:05:28 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2011-07-04 00:05:28 +0000
commit736a0118b5384daa52b82dfb398ad980afdb7bb4 (patch)
tree9c025f08e3bb53b9f328f50293b9a50394d6b355
parentb272332e6120413b13dcaef7a5415783a99df073 (diff)
downloadexternal_llvm-736a0118b5384daa52b82dfb398ad980afdb7bb4.zip
external_llvm-736a0118b5384daa52b82dfb398ad980afdb7bb4.tar.gz
external_llvm-736a0118b5384daa52b82dfb398ad980afdb7bb4.tar.bz2
Fix PR10244.
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
-rw-r--r--lib/CodeGen/RegAllocGreedy.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/lib/CodeGen/RegAllocGreedy.cpp b/lib/CodeGen/RegAllocGreedy.cpp
index 4402694..acf7f95 100644
--- a/lib/CodeGen/RegAllocGreedy.cpp
+++ b/lib/CodeGen/RegAllocGreedy.cpp
@@ -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);
}
}