1; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s 2 3declare void @bar() cold 4 5; Both 'l1' and 'r1' has one edge leading to 'cold' and another one to 6; 'unreachable' blocks. Check that 'cold' paths are preferred. Also ensure both 7; 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 %r1 18 19l1: 20 br i1 %arg, label %cold, label %unreached 21 22r1: 23 br i1 %arg, label %unreached, label %cold 24 25unreached: 26 unreachable 27 28cold: 29 call void @bar() 30 ret void 31} 32 33; Both edges of 'l1' leads to 'cold' blocks while one edge of 'r1' leads to 34; 'unreachable' block. Check that 'l1' has 50/50 while 'r1' has 0/100 35; 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 %r1 46 47l1: 48 br i1 %arg, label %cold, label %cold2 49 50r1: 51 br i1 %arg, label %unreached, label %cold 52 53unreached: 54 unreachable 55 56cold: 57 call void @bar() 58 ret void 59 60cold2: 61 call void @bar() 62 ret void 63} 64 65; Both edges of 'r1' leads to 'unreachable' blocks while one edge of 'l1' leads to 66; '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 %r1 77 78l1: 79 br i1 %arg, label %cold, label %unreached 80 81r1: 82 br i1 %arg, label %unreached, label %unreached2 83 84unreached: 85 unreachable 86 87unreached2: 88 unreachable 89 90cold: 91 call void @bar() 92 ret void 93} 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 ensure 97; 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 %r1 109 110l1: 111 br i1 %arg, label %l2, label %r2 112 113l2: 114 br label %to.cold 115 116r2: 117 br label %to.cold 118 119to.cold: 120 br label %cold 121 122r1: 123 ret void 124 125cold: 126 call void @bar() 127 ret void 128} 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 %r1 140 141cold: 142 call void @bar() 143 br label %l2 144 145r1: 146 br i1 %arg, label %l2, label %unreached 147 148l2: 149 ret void 150 151unreached: 152 unreachable 153} 154