brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.2 KiB · 9b9d9a7 Raw
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