brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · 275731d Raw
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