diff options
| author | Chandler Carruth <chandlerc@gmail.com> | 2011-11-23 10:35:36 +0000 |
|---|---|---|
| committer | Chandler Carruth <chandlerc@gmail.com> | 2011-11-23 10:35:36 +0000 |
| commit | 99fe42fbd9c31abd0a9238b4b253d89230d0978b (patch) | |
| tree | 36cee8ef1443ca01b577b7c3ca554e84eba03f1c | |
| parent | 779ba6d7b72bb52d6f46d273bed0ae45af075b12 (diff) | |
| download | bcm5719-llvm-99fe42fbd9c31abd0a9238b4b253d89230d0978b.tar.gz bcm5719-llvm-99fe42fbd9c31abd0a9238b4b253d89230d0978b.zip | |
Relax an invariant that block placement was trying to assert a bit
further. This invariant just wasn't going to work in the face of
unanalyzable branches; we need to be resillient to the phenomenon of
chains poking into a loop and poking out of a loop. In fact, we already
were, we just needed to not assert on it.
This was found during a bootstrap with block placement turned on.
llvm-svn: 145100
| -rw-r--r-- | llvm/lib/CodeGen/MachineBlockPlacement.cpp | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/block-placement.ll | 25 |
2 files changed, 26 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/MachineBlockPlacement.cpp b/llvm/lib/CodeGen/MachineBlockPlacement.cpp index 0d15e8a726f..45d5af29303 100644 --- a/llvm/lib/CodeGen/MachineBlockPlacement.cpp +++ b/llvm/lib/CodeGen/MachineBlockPlacement.cpp @@ -504,7 +504,6 @@ void MachineBlockPlacement::buildChain( const BlockFilterSet *BlockFilter) { assert(BB); assert(BlockToChain[BB] == &Chain); - assert(*Chain.begin() == BB); MachineFunction &F = *BB->getParent(); MachineFunction::iterator PrevUnplacedBlockIt = F.begin(); @@ -614,8 +613,7 @@ void MachineBlockPlacement::buildLoopChains(MachineFunction &F, if (!LoopBlockSet.erase(*BCI)) { // 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. + // from a loop block to a non-loop block or vice versa. 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" diff --git a/llvm/test/CodeGen/X86/block-placement.ll b/llvm/test/CodeGen/X86/block-placement.ll index c03b03ed02d..782e1542513 100644 --- a/llvm/test/CodeGen/X86/block-placement.ll +++ b/llvm/test/CodeGen/X86/block-placement.ll @@ -568,3 +568,28 @@ loop3: %next.phi = phi i32* [ %next.load, %loop2b ], [ %next.var, %loop2a ] br label %loop1 } + +define void @unanalyzable_branch_to_loop_header() { +; Ensure that we can handle unanalyzable branches into loop headers. We +; pre-form chains for unanalyzable branches, and will find the tail end of that +; at the start of the loop. This function uses floating point comparison +; fallthrough because that happens to always produce unanalyzable branches on +; x86. +; +; CHECK: unanalyzable_branch_to_loop_header +; CHECK: %entry +; CHECK: %loop +; CHECK: %exit + +entry: + %cmp = fcmp une double 0.000000e+00, undef + br i1 %cmp, label %loop, label %exit + +loop: + %cond = icmp eq i8 undef, 42 + br i1 %cond, label %exit, label %loop + +exit: + ret void +} + |

