diff --git a/lib/CodeGen/MachineBlockPlacement.cpp b/lib/CodeGen/MachineBlockPlacement.cpp index c190b2a66c6..c7d9212e7c9 100644 --- a/lib/CodeGen/MachineBlockPlacement.cpp +++ b/lib/CodeGen/MachineBlockPlacement.cpp @@ -466,7 +466,8 @@ MachineBlockPlacement::selectBestSuccessor(MachineBasicBlock *BB, MBFI->getBlockFreq(BB) * RealSuccProb * HotProb.getCompl(); bool BadCFGConflict = false; for (MachineBasicBlock *Pred : Succ->predecessors()) { - if (Pred == Succ || (BlockFilter && !BlockFilter->count(Pred)) || + if (Pred == Succ || BlockToChain[Pred] == &SuccChain || + (BlockFilter && !BlockFilter->count(Pred)) || BlockToChain[Pred] == &Chain) continue; BlockFrequency PredEdgeFreq = diff --git a/test/CodeGen/X86/mbp-false-cfg-break.ll b/test/CodeGen/X86/mbp-false-cfg-break.ll new file mode 100644 index 00000000000..bc8b0de3eef --- /dev/null +++ b/test/CodeGen/X86/mbp-false-cfg-break.ll @@ -0,0 +1,39 @@ +; RUN: llc < %s -march=x86-64 | FileCheck %s + +define void @test(i1 %cnd) !prof !{!"function_entry_count", i64 1024} { +; CHECK-LABEL: @test +; Using the assembly comments to indicate block order.. +; CHECK: # %loop +; CHECK: # %backedge +; CHECK: # %exit +; CHECK: # %rare +; CHECK: # %rare.1 + + br i1 undef, label %rare.1, label %preheader, !prof !{!"branch_weights", i32 0, i32 1000} +rare.1: + call void @foo() + br label %preheader + +preheader: + br label %loop + +loop: + %iv = phi i32 [0, %preheader], [%iv.next, %backedge] + call void @foo() + br i1 %cnd, label %backedge, label %rare, !prof !{!"branch_weights", i32 1000000, i32 1} +rare: + call void @foo() + br label %backedge +backedge: + call void @foo() + %iv.next = add i32 %iv, 1 + %cmp = icmp eq i32 %iv.next, 200 + br i1 %cmp, label %loop, label %exit, !prof !{!"branch_weights", i32 1000, i32 1} + +exit: + ret void + +} + + +declare void @foo()