154 lines · plain
1; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s2 3declare void @bar() cold4 5; Both 'l1' and 'r1' has one edge leading to 'cold' and another one to6; 'unreachable' blocks. Check that 'cold' paths are preferred. Also ensure both7; paths from 'entry' block are equal.8define void @test1(i32 %0, i1 %arg) {9;CHECK: edge %entry -> %l1 probability is 0x40000000 / 0x80000000 = 50.00%10;CHECK: edge %entry -> %r1 probability is 0x40000000 / 0x80000000 = 50.00%11;CHECK: edge %l1 -> %cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]12;CHECK: edge %l1 -> %unreached probability is 0x00000000 / 0x80000000 = 0.00%13;CHECK: edge %r1 -> %unreached probability is 0x00000000 / 0x80000000 = 0.00%14;CHECK: edge %r1 -> %cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]15 16entry:17 br i1 %arg, label %l1, label %r118 19l1:20 br i1 %arg, label %cold, label %unreached21 22r1:23 br i1 %arg, label %unreached, label %cold24 25unreached:26 unreachable27 28cold:29 call void @bar()30 ret void31}32 33; Both edges of 'l1' leads to 'cold' blocks while one edge of 'r1' leads to34; 'unreachable' block. Check that 'l1' has 50/50 while 'r1' has 0/10035; distributuion. Also ensure both paths from 'entry' block are equal.36define void @test2(i32 %0, i1 %arg) {37;CHECK: edge %entry -> %l1 probability is 0x40000000 / 0x80000000 = 50.00%38;CHECK: edge %entry -> %r1 probability is 0x40000000 / 0x80000000 = 50.00%39;CHECK: edge %l1 -> %cold probability is 0x40000000 / 0x80000000 = 50.00%40;CHECK: edge %l1 -> %cold2 probability is 0x40000000 / 0x80000000 = 50.00%41;CHECK: edge %r1 -> %unreached probability is 0x00000000 / 0x80000000 = 0.00%42;CHECK: edge %r1 -> %cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]43 44entry:45 br i1 %arg, label %l1, label %r146 47l1:48 br i1 %arg, label %cold, label %cold249 50r1:51 br i1 %arg, label %unreached, label %cold52 53unreached:54 unreachable55 56cold:57 call void @bar()58 ret void59 60cold2:61 call void @bar()62 ret void63}64 65; Both edges of 'r1' leads to 'unreachable' blocks while one edge of 'l1' leads to66; 'cold' block. Ensure that path leading to 'cold' block is preferred.67define void @test3(i32 %0, i1 %arg) {68;CHECK: edge %entry -> %l1 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]69;CHECK: edge %entry -> %r1 probability is 0x00000000 / 0x80000000 = 0.00%70;CHECK: edge %l1 -> %cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]71;CHECK: edge %l1 -> %unreached probability is 0x00000000 / 0x80000000 = 0.00%72;CHECK: edge %r1 -> %unreached probability is 0x40000000 / 0x80000000 = 50.00%73;CHECK: edge %r1 -> %unreached2 probability is 0x40000000 / 0x80000000 = 50.00%74 75entry:76 br i1 %arg, label %l1, label %r177 78l1:79 br i1 %arg, label %cold, label %unreached80 81r1:82 br i1 %arg, label %unreached, label %unreached283 84unreached:85 unreachable86 87unreached2:88 unreachable89 90cold:91 call void @bar()92 ret void93}94 95; Left edge of 'entry' leads to 'cold' block while right edge is 'normal' continuation.96; Check that we able to propagate 'cold' weight to 'entry' block. Also ensure97; both edges from 'l1' are equally likely.98define void @test4(i32 %0, i1 %arg) {99;CHECK: edge %entry -> %l1 probability is 0x078780e3 / 0x80000000 = 5.88%100;CHECK: edge %entry -> %r1 probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]101;CHECK: edge %l1 -> %l2 probability is 0x40000000 / 0x80000000 = 50.00%102;CHECK: edge %l1 -> %r2 probability is 0x40000000 / 0x80000000 = 50.00%103;CHECK: edge %l2 -> %to.cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]104;CHECK: edge %r2 -> %to.cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]105;CHECK: edge %to.cold -> %cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]106 107entry:108 br i1 %arg, label %l1, label %r1109 110l1:111 br i1 %arg, label %l2, label %r2112 113l2:114 br label %to.cold115 116r2:117 br label %to.cold118 119to.cold:120 br label %cold121 122r1:123 ret void124 125cold:126 call void @bar()127 ret void128}129 130; Check that most likely path from 'entry' to 'l2' through 'r1' is preferred.131define void @test5(i32 %0, i1 %arg) {132;CHECK: edge %entry -> %cold probability is 0x078780e3 / 0x80000000 = 5.88%133;CHECK: edge %entry -> %r1 probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]134;CHECK: edge %cold -> %l2 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]135;CHECK: edge %r1 -> %l2 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]136;CHECK: edge %r1 -> %unreached probability is 0x00000000 / 0x80000000 = 0.00%137 138entry:139 br i1 %arg, label %cold, label %r1140 141cold:142 call void @bar()143 br label %l2144 145r1:146 br i1 %arg, label %l2, label %unreached147 148l2:149 ret void150 151unreached:152 unreachable153}154