summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2011-02-03 20:29:43 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2011-02-03 20:29:43 +0000
commit2dfbb3e9125aa0a66feab7a7638815b57da85968 (patch)
tree3f0bfb3fec6ad25ddbc756ef5840c9866be4ce5d
parent97af98678cc943050cf23951a66c89e922cf21c4 (diff)
downloadllvm-2dfbb3e9125aa0a66feab7a7638815b57da85968.tar.gz
llvm-2dfbb3e9125aa0a66feab7a7638815b57da85968.tar.bz2
llvm-2dfbb3e9125aa0a66feab7a7638815b57da85968.tar.xz
Ensure that the computed interference intervals actually overlap their basic blocks.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124815 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/RegAllocGreedy.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/CodeGen/RegAllocGreedy.cpp b/lib/CodeGen/RegAllocGreedy.cpp
index 730bddb8b0..92f97d046f 100644
--- a/lib/CodeGen/RegAllocGreedy.cpp
+++ b/lib/CodeGen/RegAllocGreedy.cpp
@@ -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) {