diff --git a/llvm/lib/CodeGen/MachineBlockPlacement.cpp b/llvm/lib/CodeGen/MachineBlockPlacement.cpp --- a/llvm/lib/CodeGen/MachineBlockPlacement.cpp +++ b/llvm/lib/CodeGen/MachineBlockPlacement.cpp @@ -2541,10 +2541,14 @@ MBPI->getEdgeProbability(LoopPred, L.getHeader()); for (MachineBasicBlock *LoopBB : L.getBlocks()) { + if (LoopBlockSet.count(LoopBB)) + continue; auto Freq = MBFI->getBlockFreq(LoopBB).getFrequency(); if (Freq == 0 || LoopFreq.getFrequency() / Freq > LoopToColdBlockRatio) continue; - LoopBlockSet.insert(LoopBB); + BlockChain *Chain = BlockToChain[LoopBB]; + for (MachineBasicBlock *ChainBB : *Chain) + LoopBlockSet.insert(ChainBB); } } else LoopBlockSet.insert(L.block_begin(), L.block_end()); diff --git a/llvm/test/CodeGen/X86/block_set.ll b/llvm/test/CodeGen/X86/block_set.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/block_set.ll @@ -0,0 +1,64 @@ +; RUN: llc -mtriple=i686-linux < %s | FileCheck %s + +define i1 @block_filter() !prof !22{ +; CHECK-LABEL: block_filter +; CHECK: %.entry +; CHECK: %.header1 +; CHECK: %.bb1 +; CHECK: %.header2 +; CHECK: %.latch2 +; CHECK: %.cold +; CHECK: %.pred +; CHECK: %.problem +; CHECK: %.latch1 +; CHECK: %.exit +.entry: + %val0 = call i1 @bar() + br label %.header1 + +.header1: + %val1 = call i1 @foo() + br i1 %val1, label %.bb1, label %.pred, !prof !2 + +.bb1: + %val11 = call i1 @foo() + br i1 %val11, label %.header2, label %.pred, !prof !2 + +.header2: + %val2 = call i1 @foo() + br i1 %val2, label %.latch2, label %.cold, !prof !10 + +.cold: + %val4 = call i1 @bar() + br i1 %val4, label %.latch2, label %.problem + +.latch2: + %val5 = call i1 @foo() + br i1 %val5, label %.header2, label %.latch1, !prof !1 + +.pred: + %valp = call i1 @foo() + br label %.problem + +.problem: + %val3 = call i1 @foo() + br label %.latch1 + +.latch1: + %val6 = call i1 @foo() + br i1 %val6, label %.header1, label %.exit, !prof !1 + +.exit: + %val7 = call i1 @foo() + ret i1 %val7 +} + +declare i1 @foo() +declare i1 @bar() + +!1 = !{!"branch_weights", i32 5, i32 5} +!2 = !{!"branch_weights", i32 60, i32 40} +!3 = !{!"branch_weights", i32 90, i32 10} +!10 = !{!"branch_weights", i32 90, i32 10} + +!22 = !{!"function_entry_count", i64 100}