357 lines · plain
1; RUN: opt -passes=lower-expect -S -o - < %s | FileCheck %s2; RUN: opt -S -passes='function(lower-expect)' < %s | FileCheck %s3 4; The C case5; if (__builtin_expect((x > goo() && y > hoo() && z > too()), 1))6; For the above case, all 3 branches should be annotated.7;8; if (__builtin_expect((x > goo() && y > hoo() && z > too()), 0))9; For the above case, we don't have enough information, so10; only the last branch is annotated.11 12define void @foo(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) {13; CHECK-LABEL: void @foo14bb:15 %tmp8 = call i32 @goo()16 %tmp9 = icmp sgt i32 %tmp8, %arg17 br i1 %tmp9, label %bb10, label %bb1818; CHECK: !prof [[WEIGHT:![0-9]+]]19 20bb10: ; preds = %bb21 %tmp12 = call i32 @hoo()22 %tmp13 = icmp sgt i32 %arg1, %tmp1223 br i1 %tmp13, label %bb14, label %bb1824; CHECK: br i1 %tmp13, {{.*}}!prof [[WEIGHT]]25 26bb14: ; preds = %bb1027 %tmp16 = call i32 @too()28 %tmp17 = icmp sgt i32 %arg2, %tmp1629 br label %bb1830 31bb18: ; preds = %bb14, %bb10, %bb32 %tmp19 = phi i1 [ false, %bb10 ], [ false, %bb ], [ %tmp17, %bb14 ]33 %tmp20 = xor i1 %tmp19, true34 %tmp21 = xor i1 %tmp20, true35 %tmp22 = zext i1 %tmp21 to i3236 %tmp23 = sext i32 %tmp22 to i6437 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 1)38 %tmp25 = icmp ne i64 %tmp24, 039 br i1 %tmp25, label %bb26, label %bb2840; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]41 42bb26: ; preds = %bb1843 %tmp27 = call i32 @goo()44 br label %bb3045 46bb28: ; preds = %bb1847 %tmp29 = call i32 @hoo()48 br label %bb3049 50bb30: ; preds = %bb28, %bb2651 ret void52}53 54define void @foo2(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) {55; CHECK-LABEL: void @foo256bb:57 %tmp8 = call i32 @goo()58 %tmp9 = icmp sgt i32 %tmp8, %arg59 br i1 %tmp9, label %bb10, label %bb1860; CHECK: br i1 %tmp961; CHECK-NOT: !prof62 63bb10: ; preds = %bb64 %tmp12 = call i32 @hoo()65 %tmp13 = icmp sgt i32 %arg1, %tmp1266 br i1 %tmp13, label %bb14, label %bb1867; CHECK: br i1 %tmp1368; CHECK-NOT: !prof69 70bb14: ; preds = %bb1071 %tmp16 = call i32 @too()72 %tmp17 = icmp sgt i32 %arg2, %tmp1673 br label %bb1874 75bb18: ; preds = %bb14, %bb10, %bb76 %tmp19 = phi i1 [ false, %bb10 ], [ false, %bb ], [ %tmp17, %bb14 ]77 %tmp20 = xor i1 %tmp19, true78 %tmp21 = xor i1 %tmp20, true79 %tmp22 = zext i1 %tmp21 to i3280 %tmp23 = sext i32 %tmp22 to i6481 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 0)82 %tmp25 = icmp ne i64 %tmp24, 083 br i1 %tmp25, label %bb26, label %bb2884; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT2:![0-9]+]]85 86bb26: ; preds = %bb1887 %tmp27 = call i32 @goo()88 br label %bb3089 90bb28: ; preds = %bb1891 %tmp29 = call i32 @hoo()92 br label %bb3093 94bb30: ; preds = %bb28, %bb2695 ret void96}97 98define void @foo_i32(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) {99; CHECK-LABEL: void @foo_i32100bb:101 %tmp8 = call i32 @goo()102 %tmp9 = icmp sgt i32 %tmp8, %arg103 br i1 %tmp9, label %bb10, label %bb18104; CHECK: !prof [[WEIGHT]]105 106bb10: ; preds = %bb107 %tmp12 = call i32 @hoo()108 %tmp13 = icmp sgt i32 %arg1, %tmp12109 br i1 %tmp13, label %bb14, label %bb18110; CHECK: br i1 %tmp13, {{.*}}!prof [[WEIGHT]]111 112bb14: ; preds = %bb10113 %tmp16 = call i32 @too()114 %tmp17 = icmp sgt i32 %arg2, %tmp16115 br label %bb18116 117bb18: ; preds = %bb14, %bb10, %bb118 %tmp19 = phi i32 [ 5, %bb10 ], [ 5, %bb ], [ %tmp16, %bb14 ]119 %tmp23 = sext i32 %tmp19 to i64120 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 4)121 %tmp25 = icmp ne i64 %tmp24, 0122 br i1 %tmp25, label %bb26, label %bb28123; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]124 125bb26: ; preds = %bb18126 %tmp27 = call i32 @goo()127 br label %bb30128 129bb28: ; preds = %bb18130 %tmp29 = call i32 @hoo()131 br label %bb30132 133bb30: ; preds = %bb28, %bb26134 ret void135}136 137 138define void @foo_i32_not_unlikely(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) {139; CHECK-LABEL: void @foo_i32_not_unlikely140bb:141 %tmp8 = call i32 @goo()142 %tmp9 = icmp sgt i32 %tmp8, %arg143 br i1 %tmp9, label %bb10, label %bb18144; CHECK: br i1 %tmp9145; CHECK-NOT: !prof146 147bb10: ; preds = %bb148 %tmp12 = call i32 @hoo()149 %tmp13 = icmp sgt i32 %arg1, %tmp12150 br i1 %tmp13, label %bb14, label %bb18151; CHECK: br i1 %tmp13152; CHECK-NOT: !prof153 154bb14: ; preds = %bb10155 %tmp16 = call i32 @too()156 %tmp17 = icmp sgt i32 %arg2, %tmp16157 br label %bb18158 159bb18: ; preds = %bb14, %bb10, %bb160 %tmp19 = phi i32 [ 4, %bb10 ], [ 4, %bb ], [ %tmp16, %bb14 ]161 %tmp23 = sext i32 %tmp19 to i64162 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 4)163 %tmp25 = icmp ne i64 %tmp24, 0164 br i1 %tmp25, label %bb26, label %bb28165; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]166 167bb26: ; preds = %bb18168 %tmp27 = call i32 @goo()169 br label %bb30170 171bb28: ; preds = %bb18172 %tmp29 = call i32 @hoo()173 br label %bb30174 175bb30: ; preds = %bb28, %bb26176 ret void177}178 179define void @foo_i32_xor(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) {180; CHECK-LABEL: void @foo_i32_xor181bb:182 %tmp8 = call i32 @goo()183 %tmp9 = icmp sgt i32 %tmp8, %arg184 br i1 %tmp9, label %bb10, label %bb18185; CHECK: br i1 %tmp9,{{.*}}!prof [[WEIGHT]]186 187bb10: ; preds = %bb188 %tmp12 = call i32 @hoo()189 %tmp13 = icmp sgt i32 %arg1, %tmp12190 br i1 %tmp13, label %bb14, label %bb18191; CHECK: br i1 %tmp13,{{.*}}!prof [[WEIGHT]]192 193bb14: ; preds = %bb10194 %tmp16 = call i32 @too()195 %tmp17 = icmp sgt i32 %arg2, %tmp16196 br label %bb18197 198bb18: ; preds = %bb14, %bb10, %bb199 %tmp19 = phi i32 [ 6, %bb10 ], [ 6, %bb ], [ %tmp16, %bb14 ]200 %tmp20 = xor i32 %tmp19, 3201 %tmp23 = sext i32 %tmp20 to i64202 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 4)203 %tmp25 = icmp ne i64 %tmp24, 0204 br i1 %tmp25, label %bb26, label %bb28205; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]206 207bb26: ; preds = %bb18208 %tmp27 = call i32 @goo()209 br label %bb30210 211bb28: ; preds = %bb18212 %tmp29 = call i32 @hoo()213 br label %bb30214bb30: ; preds = %bb28, %bb26215 ret void216}217 218define void @foo_i8_sext(i32 %arg, i32 %arg1, i8 %arg2, i32 %arg3) {219; CHECK-LABEL: void @foo_i8_sext220bb:221 %tmp8 = call i32 @goo()222 %tmp9 = icmp sgt i32 %tmp8, %arg223 br i1 %tmp9, label %bb10, label %bb18224; CHECK: br i1 %tmp9,{{.*}}!prof [[WEIGHT]]225 226bb10: ; preds = %bb227 %tmp12 = call i32 @hoo()228 %tmp13 = icmp sgt i32 %arg1, %tmp12229 br i1 %tmp13, label %bb14, label %bb18230; CHECK: br i1 %tmp13,{{.*}}!prof [[WEIGHT]]231 232bb14: ; preds = %bb10233 %tmp16 = call i8 @too8()234 %tmp17 = icmp sgt i8 %arg2, %tmp16235 br label %bb18236 237bb18: ; preds = %bb14, %bb10, %bb238 %tmp19 = phi i8 [ 255, %bb10 ], [ 255, %bb ], [ %tmp16, %bb14 ]239 %tmp23 = sext i8 %tmp19 to i64240; after sign extension, the operand value becomes -1 which does not match 255241 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 255)242 %tmp25 = icmp ne i64 %tmp24, 0243 br i1 %tmp25, label %bb26, label %bb28244; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]245 246bb26: ; preds = %bb18247 %tmp27 = call i32 @goo()248 br label %bb30249 250bb28: ; preds = %bb18251 %tmp29 = call i32 @hoo()252 br label %bb30253bb30: ; preds = %bb28, %bb26254 ret void255}256 257define void @foo_i8_sext_not_unlikely(i32 %arg, i32 %arg1, i8 %arg2, i32 %arg3) {258; CHECK-LABEL: void @foo_i8_sext_not_unlikely259bb:260 %tmp8 = call i32 @goo()261 %tmp9 = icmp sgt i32 %tmp8, %arg262 br i1 %tmp9, label %bb10, label %bb18263; CHECK: br i1 %tmp9264; CHECK-NOT: !prof265 266bb10: ; preds = %bb267 %tmp12 = call i32 @hoo()268 %tmp13 = icmp sgt i32 %arg1, %tmp12269 br i1 %tmp13, label %bb14, label %bb18270; CHECK: br i1 %tmp13271; CHECK-NOT: !prof272 273bb14: ; preds = %bb10274 %tmp16 = call i8 @too8()275 %tmp17 = icmp sgt i8 %arg2, %tmp16276 br label %bb18277 278bb18: ; preds = %bb14, %bb10, %bb279 %tmp19 = phi i8 [ 255, %bb10 ], [ 255, %bb ], [ %tmp16, %bb14 ]280 %tmp23 = sext i8 %tmp19 to i64281; after sign extension, the operand value becomes -1 which matches -1282 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 -1)283 %tmp25 = icmp ne i64 %tmp24, 0284 br i1 %tmp25, label %bb26, label %bb28285; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]286 287bb26: ; preds = %bb18288 %tmp27 = call i32 @goo()289 br label %bb30290 291bb28: ; preds = %bb18292 %tmp29 = call i32 @hoo()293 br label %bb30294bb30: ; preds = %bb28, %bb26295 ret void296}297 298 299define void @foo_i32_xor_not_unlikely(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) {300; CHECK-LABEL: void @foo_i32_xor_not_unlikely301bb:302 %tmp8 = call i32 @goo()303 %tmp9 = icmp sgt i32 %tmp8, %arg304 br i1 %tmp9, label %bb10, label %bb18305; CHECK: br i1 %tmp9306; CHECK-NOT: !prof307 308bb10: ; preds = %bb309 %tmp12 = call i32 @hoo()310 %tmp13 = icmp sgt i32 %arg1, %tmp12311 br i1 %tmp13, label %bb14, label %bb18312; CHECK: br i1 %tmp13313; CHECK-NOT: !prof314 315bb14: ; preds = %bb10316 %tmp16 = call i32 @too()317 %tmp17 = icmp sgt i32 %arg2, %tmp16318 br label %bb18319 320bb18: ; preds = %bb14, %bb10, %bb321 %tmp19 = phi i32 [ 6, %bb10 ], [ 6, %bb ], [ %tmp16, %bb14 ]322 %tmp20 = xor i32 %tmp19, 2323 %tmp23 = sext i32 %tmp20 to i64324 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 4)325 %tmp25 = icmp ne i64 %tmp24, 0326 br i1 %tmp25, label %bb26, label %bb28327; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]]328 329bb26: ; preds = %bb18330 %tmp27 = call i32 @goo()331 br label %bb30332 333bb28: ; preds = %bb18334 %tmp29 = call i32 @hoo()335 br label %bb30336 337bb30: ; preds = %bb28, %bb26338 ret void339}340 341declare i32 @goo()342 343declare i32 @hoo()344 345declare i32 @too()346 347declare i8 @too8()348 349; Function Attrs: nounwind readnone350declare i64 @llvm.expect.i64(i64, i64)351 352!llvm.ident = !{!0}353 354!0 = !{!"clang version 5.0.0 (trunk 302965)"}355; CHECK: [[WEIGHT]] = !{!"branch_weights", !"expected", i32 2000, i32 1}356; CHECK: [[WEIGHT2]] = !{!"branch_weights", !"expected", i32 1, i32 2000}357