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());
--- /dev/null
+; 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}