forked from OSchip/llvm-project
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
This commit is contained in:
parent
779ba6d7b7
commit
99fe42fbd9
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue