brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · 1de1893 Raw
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