diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2011-11-14 10:55:53 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2011-11-14 10:55:53 +0000 |
commit | bc83fcd9bd95f8eff83cd5ad77b0aa5312d8a6a5 (patch) | |
tree | 8a1cb350497368ebd1bdbafb2ae117340e906559 /lib/CodeGen/MachineBlockPlacement.cpp | |
parent | fa97658b1c71f747cfe0f3e1f1bcbd86d7fa9f75 (diff) |
Remove an over-eager assert that was firing on one of the ARM regression
tests when I forcibly enabled block placement.
It is apparantly possible for an unanalyzable block to fallthrough to
a non-loop block. I don't actually beleive this is correct, I believe
that 'canFallThrough' is returning true needlessly for the code
construct, and I've left a bit of a FIXME on the verification code to
try to track down why this is coming up.
Anyways, removing the assert doesn't degrade the correctness of the algorithm.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144532 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/MachineBlockPlacement.cpp')
-rw-r--r-- | lib/CodeGen/MachineBlockPlacement.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/lib/CodeGen/MachineBlockPlacement.cpp b/lib/CodeGen/MachineBlockPlacement.cpp index 6c8390fee6..412d0b1fab 100644 --- a/lib/CodeGen/MachineBlockPlacement.cpp +++ b/lib/CodeGen/MachineBlockPlacement.cpp @@ -492,9 +492,9 @@ void MachineBlockPlacement::buildChain( if (TII->AnalyzeBranch(*BB, TBB, FBB, Cond) && BB->canFallThrough()) { MachineFunction::iterator I(BB), NextI(llvm::next(I)); // Ensure that the layout successor is a viable block, as we know that - // fallthrough is a possibility. + // fallthrough is a possibility. Note that this may not be a valid block + // in the loop, but we allow that to cope with degenerate situations. assert(NextI != BB->getParent()->end()); - assert(!BlockFilter || BlockFilter->count(NextI)); BestSucc = NextI; } @@ -594,7 +594,10 @@ void MachineBlockPlacement::buildLoopChains(MachineFunction &F, for (BlockChain::iterator BCI = LoopChain.begin(), BCE = LoopChain.end(); BCI != BCE; ++BCI) if (!LoopBlockSet.erase(*BCI)) { - BadLoop = true; + // We don't mark the loop as bad here because there are real situations + // where this can occur. For example, with an unanalyzable fallthrough + // from a loop block to a non-loop block. + // FIXME: Such constructs shouldn't exist. Track them down and fix them. dbgs() << "Loop chain contains a block not contained by the loop!\n" << " Loop header: " << getBlockName(*L.block_begin()) << "\n" << " Chain header: " << getBlockName(*LoopChain.begin()) << "\n" |