240 lines · plain
1; RUN: opt -S -passes='function(lower-expect),strip-dead-prototypes' -likely-branch-weight=2147483647 -unlikely-branch-weight=1 < %s | FileCheck %s2 3; The C case4; if (__builtin_expect_with_probability(((a0 == 1) || (a1 == 1) || (a2 == 1)), 1, 0))5; For the above case, all 3 branches should be annotated6; which should be equivalent to if (__builtin_expect(((a0 == 1) || (a1 == 1) || (a2 == 1)), 0))7 8; The C case9; if (__builtin_expect_with_probability(((a0 == 1) || (a1 == 1) || (a2 == 1)), 1, 1))10; For the above case, we do not have enough information, so only the last branch could be annotated11; which should be equivalent to if (__builtin_expect(((a0 == 1) || (a1 == 1) || (a2 == 1)), 1))12 13declare void @foo()14 15declare i64 @llvm.expect.i64(i64, i64) nounwind readnone16declare i64 @llvm.expect.with.probability.i64(i64, i64, double) nounwind readnone17 18; CHECK-LABEL: @test1_expect_1(19; CHECK: block0:20; CHECK-NOT: prof21; CHECK: block1:22; CHECK-NOT: prof23; CHECK: block3:24; CHECK: br i1 %tobool, label %block4, label %block5, !prof !025define void @test1_expect_1(i8 %a0, i8 %a1, i8 %a2) {26block0:27 %c0 = icmp eq i8 %a0, 128 br i1 %c0, label %block3, label %block129 30block1:31 %c1 = icmp eq i8 %a1, 132 br i1 %c1, label %block3, label %block233 34block2:35 %c2 = icmp eq i8 %a2, 136 br label %block337 38block3:39 %cond0 = phi i1 [ true, %block0 ], [ true, %block1 ], [ %c2, %block2 ]40 %cond1 = zext i1 %cond0 to i3241 %cond2 = sext i32 %cond1 to i6442 %expval = call i64 @llvm.expect.i64(i64 %cond2, i64 1)43 %tobool = icmp ne i64 %expval, 044 br i1 %tobool, label %block4, label %block545 46block4:47 call void @foo()48 br label %block549 50block5:51 ret void52}53 54; should have exactly the same behavior as test155; CHECK-LABEL: @test2_expect_with_prob_1_1(56; CHECK: block0:57; CHECK-NOT: prof58; CHECK: block1:59; CHECK-NOT: prof60; CHECK: block3:61; CHECK: br i1 %tobool, label %block4, label %block5, !prof !062define void @test2_expect_with_prob_1_1(i8 %a0, i8 %a1, i8 %a2) {63block0:64 %c0 = icmp eq i8 %a0, 165 br i1 %c0, label %block3, label %block166 67block1:68 %c1 = icmp eq i8 %a1, 169 br i1 %c1, label %block3, label %block270 71block2:72 %c2 = icmp eq i8 %a2, 173 br label %block374 75block3:76 %cond0 = phi i1 [ true, %block0 ], [ true, %block1 ], [ %c2, %block2 ]77 %cond1 = zext i1 %cond0 to i3278 %cond2 = sext i32 %cond1 to i6479 %expval = call i64 @llvm.expect.with.probability.i64(i64 %cond2, i64 1, double 1.0)80 %tobool = icmp ne i64 %expval, 081 br i1 %tobool, label %block4, label %block582 83block4:84 call void @foo()85 br label %block586 87block5:88 ret void89}90 91; should have exactly the same behavior as test192; CHECK-LABEL: @test3_expect_with_prob_0_0(93; CHECK: block0:94; CHECK-NOT: prof95; CHECK: block1:96; CHECK-NOT: prof97; CHECK: block3:98; CHECK: br i1 %tobool, label %block4, label %block5, !prof !099define void @test3_expect_with_prob_0_0(i8 %a0, i8 %a1, i8 %a2) {100block0:101 %c0 = icmp eq i8 %a0, 1102 br i1 %c0, label %block3, label %block1103 104block1:105 %c1 = icmp eq i8 %a1, 1106 br i1 %c1, label %block3, label %block2107 108block2:109 %c2 = icmp eq i8 %a2, 1110 br label %block3111 112block3:113 %cond0 = phi i1 [ true, %block0 ], [ true, %block1 ], [ %c2, %block2 ]114 %cond1 = zext i1 %cond0 to i32115 %cond2 = sext i32 %cond1 to i64116 %expval = call i64 @llvm.expect.with.probability.i64(i64 %cond2, i64 0, double 0.0)117 %tobool = icmp ne i64 %expval, 0118 br i1 %tobool, label %block4, label %block5119 120block4:121 call void @foo()122 br label %block5123 124block5:125 ret void126}127 128; CHECK-LABEL: @test4_expect_0(129; CHECK: block0:130; CHECK: br i1 %c0, label %block3, label %block1, !prof !1131; CHECK: block1:132; CHECK: br i1 %c1, label %block3, label %block2, !prof !1133; CHECK: block3:134; CHECK: br i1 %tobool, label %block4, label %block5, !prof !1135define void @test4_expect_0(i8 %a0, i8 %a1, i8 %a2) {136block0:137 %c0 = icmp eq i8 %a0, 1138 br i1 %c0, label %block3, label %block1139 140block1:141 %c1 = icmp eq i8 %a1, 1142 br i1 %c1, label %block3, label %block2143 144block2:145 %c2 = icmp eq i8 %a2, 1146 br label %block3147 148block3:149 %cond0 = phi i1 [ true, %block0 ], [ true, %block1 ], [ %c2, %block2 ]150 %cond1 = zext i1 %cond0 to i32151 %cond2 = sext i32 %cond1 to i64152 %expval = call i64 @llvm.expect.i64(i64 %cond2, i64 0)153 %tobool = icmp ne i64 %expval, 0154 br i1 %tobool, label %block4, label %block5155 156block4:157 call void @foo()158 br label %block5159 160block5:161 ret void162}163 164; should have exactly the same behavior as test4165; CHECK-LABEL: @test5_expect_with_prob_1_0(166; CHECK: block0:167; CHECK: br i1 %c0, label %block3, label %block1, !prof !1168; CHECK: block1:169; CHECK: br i1 %c1, label %block3, label %block2, !prof !1170; CHECK: block3:171; CHECK: br i1 %tobool, label %block4, label %block5, !prof !1172define void @test5_expect_with_prob_1_0(i8 %a0, i8 %a1, i8 %a2) {173block0:174 %c0 = icmp eq i8 %a0, 1175 br i1 %c0, label %block3, label %block1176 177block1:178 %c1 = icmp eq i8 %a1, 1179 br i1 %c1, label %block3, label %block2180 181block2:182 %c2 = icmp eq i8 %a2, 1183 br label %block3184 185block3:186 %cond0 = phi i1 [ true, %block0 ], [ true, %block1 ], [ %c2, %block2 ]187 %cond1 = zext i1 %cond0 to i32188 %cond2 = sext i32 %cond1 to i64189 %expval = call i64 @llvm.expect.with.probability.i64(i64 %cond2, i64 1, double 0.0)190 %tobool = icmp ne i64 %expval, 0191 br i1 %tobool, label %block4, label %block5192 193block4:194 call void @foo()195 br label %block5196 197block5:198 ret void199}200 201; should have exactly the same behavior as test4202; CHECK-LABEL: @test6_expect_with_prob_0_1(203; CHECK: block0:204; CHECK: br i1 %c0, label %block3, label %block1, !prof !1205; CHECK: block1:206; CHECK: br i1 %c1, label %block3, label %block2, !prof !1207; CHECK: block3:208; CHECK: br i1 %tobool, label %block4, label %block5, !prof !1209define void @test6_expect_with_prob_0_1(i8 %a0, i8 %a1, i8 %a2) {210block0:211 %c0 = icmp eq i8 %a0, 1212 br i1 %c0, label %block3, label %block1213 214block1:215 %c1 = icmp eq i8 %a1, 1216 br i1 %c1, label %block3, label %block2217 218block2:219 %c2 = icmp eq i8 %a2, 1220 br label %block3221 222block3:223 %cond0 = phi i1 [ true, %block0 ], [ true, %block1 ], [ %c2, %block2 ]224 %cond1 = zext i1 %cond0 to i32225 %cond2 = sext i32 %cond1 to i64226 %expval = call i64 @llvm.expect.with.probability.i64(i64 %cond2, i64 0, double 1.0)227 %tobool = icmp ne i64 %expval, 0228 br i1 %tobool, label %block4, label %block5229 230block4:231 call void @foo()232 br label %block5233 234block5:235 ret void236}237 238; CHECK: !0 = !{!"branch_weights", !"expected", i32 2147483647, i32 1}239; CHECK: !1 = !{!"branch_weights", !"expected", i32 1, i32 2147483647}240