summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/Generic/MachineBranchProb.ll
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2015-04-30 00:57:37 +0000
committerHans Wennborg <hans@hanshq.net>2015-04-30 00:57:37 +0000
commit4b828d35fdf85c384170f930dcbf3013d22f1eb2 (patch)
tree8556e07ec5eebe0e85dd241f3d3fe4c43e35f8a0 /llvm/test/CodeGen/Generic/MachineBranchProb.ll
parent2c9608b3b3729d6c7682614f507036a2fcec6b7a (diff)
downloadbcm5719-llvm-4b828d35fdf85c384170f930dcbf3013d22f1eb2.tar.gz
bcm5719-llvm-4b828d35fdf85c384170f930dcbf3013d22f1eb2.zip
Switch lowering: use profile info to build weight-balanced binary search trees
This will cause hot nodes to appear closer to the root. The literature says building the tree like this makes it a near-optimal (in terms of search time given key frequencies) binary search tree. In LLVM's case, we can do up to 3 comparisons in each leaf node, so it might be better to opt for lower tree height in some cases; that's something to look into in the future. Differential Revision: http://reviews.llvm.org/D9318 llvm-svn: 236192
Diffstat (limited to 'llvm/test/CodeGen/Generic/MachineBranchProb.ll')
-rw-r--r--llvm/test/CodeGen/Generic/MachineBranchProb.ll40
1 files changed, 39 insertions, 1 deletions
diff --git a/llvm/test/CodeGen/Generic/MachineBranchProb.ll b/llvm/test/CodeGen/Generic/MachineBranchProb.ll
index 83277c98989..f030775d535 100644
--- a/llvm/test/CodeGen/Generic/MachineBranchProb.ll
+++ b/llvm/test/CodeGen/Generic/MachineBranchProb.ll
@@ -5,7 +5,7 @@
; Make sure we have the correct weight attached to each successor.
define i32 @test2(i32 %x) nounwind uwtable readnone ssp {
-; CHECK: Machine code for function test2:
+; CHECK-LABEL: Machine code for function test2:
entry:
%conv = sext i32 %x to i64
switch i64 %conv, label %return [
@@ -33,3 +33,41 @@ return:
}
!0 = !{!"branch_weights", i32 7, i32 6, i32 4, i32 4, i32 64}
+
+
+declare void @g(i32)
+define void @left_leaning_weight_balanced_tree(i32 %x) {
+entry:
+ switch i32 %x, label %return [
+ i32 0, label %bb0
+ i32 10, label %bb1
+ i32 20, label %bb2
+ i32 30, label %bb3
+ i32 40, label %bb4
+ i32 50, label %bb5
+ ], !prof !1
+bb0: tail call void @g(i32 0) br label %return
+bb1: tail call void @g(i32 1) br label %return
+bb2: tail call void @g(i32 2) br label %return
+bb3: tail call void @g(i32 3) br label %return
+bb4: tail call void @g(i32 4) br label %return
+bb5: tail call void @g(i32 5) br label %return
+return: ret void
+
+; Check that we set branch weights on the pivot cmp instruction correctly.
+; Cases {0,10,20,30} go on the left with weight 13; cases {40,50} go on the
+; right with weight 20.
+;
+; CHECK-LABEL: Machine code for function left_leaning_weight_balanced_tree:
+; CHECK: BB#0: derived from LLVM BB %entry
+; CHECK-NOT: Successors
+; CHECK: Successors according to CFG: BB#8(13) BB#9(20)
+}
+
+!1 = !{!"branch_weights",
+ ; Default:
+ i32 1,
+ ; Case 0, 10, 20:
+ i32 10, i32 1, i32 1,
+ ; Case 30, 40, 50:
+ i32 1, i32 10, i32 10}
OpenPOWER on IntegriCloud