diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-02-03 20:29:43 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-02-03 20:29:43 +0000 |
commit | 2dfbb3e9125aa0a66feab7a7638815b57da85968 (patch) | |
tree | 3f0bfb3fec6ad25ddbc756ef5840c9866be4ce5d /lib/CodeGen | |
parent | 97af98678cc943050cf23951a66c89e922cf21c4 (diff) | |
download | external_llvm-2dfbb3e9125aa0a66feab7a7638815b57da85968.zip external_llvm-2dfbb3e9125aa0a66feab7a7638815b57da85968.tar.gz external_llvm-2dfbb3e9125aa0a66feab7a7638815b57da85968.tar.bz2 |
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
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/RegAllocGreedy.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/CodeGen/RegAllocGreedy.cpp b/lib/CodeGen/RegAllocGreedy.cpp index 730bddb..92f97d0 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) { |