1; RUN: opt -passes=lower-expect -S -o - < %s | FileCheck %s 2; RUN: opt -S -passes='function(lower-expect)' < %s | FileCheck %s 3 4; The C case 5; 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, so 10; only the last branch is annotated. 11 12define void @foo(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) { 13; CHECK-LABEL: void @foo 14bb: 15 %tmp8 = call i32 @goo() 16 %tmp9 = icmp sgt i32 %tmp8, %arg 17 br i1 %tmp9, label %bb10, label %bb18 18; CHECK: !prof [[WEIGHT:![0-9]+]] 19 20bb10: ; preds = %bb 21 %tmp12 = call i32 @hoo() 22 %tmp13 = icmp sgt i32 %arg1, %tmp12 23 br i1 %tmp13, label %bb14, label %bb18 24; CHECK: br i1 %tmp13, {{.*}}!prof [[WEIGHT]] 25 26bb14: ; preds = %bb10 27 %tmp16 = call i32 @too() 28 %tmp17 = icmp sgt i32 %arg2, %tmp16 29 br label %bb18 30 31bb18: ; preds = %bb14, %bb10, %bb 32 %tmp19 = phi i1 [ false, %bb10 ], [ false, %bb ], [ %tmp17, %bb14 ] 33 %tmp20 = xor i1 %tmp19, true 34 %tmp21 = xor i1 %tmp20, true 35 %tmp22 = zext i1 %tmp21 to i32 36 %tmp23 = sext i32 %tmp22 to i64 37 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 1) 38 %tmp25 = icmp ne i64 %tmp24, 0 39 br i1 %tmp25, label %bb26, label %bb28 40; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]] 41 42bb26: ; preds = %bb18 43 %tmp27 = call i32 @goo() 44 br label %bb30 45 46bb28: ; preds = %bb18 47 %tmp29 = call i32 @hoo() 48 br label %bb30 49 50bb30: ; preds = %bb28, %bb26 51 ret void 52} 53 54define void @foo2(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) { 55; CHECK-LABEL: void @foo2 56bb: 57 %tmp8 = call i32 @goo() 58 %tmp9 = icmp sgt i32 %tmp8, %arg 59 br i1 %tmp9, label %bb10, label %bb18 60; CHECK: br i1 %tmp9 61; CHECK-NOT: !prof 62 63bb10: ; preds = %bb 64 %tmp12 = call i32 @hoo() 65 %tmp13 = icmp sgt i32 %arg1, %tmp12 66 br i1 %tmp13, label %bb14, label %bb18 67; CHECK: br i1 %tmp13 68; CHECK-NOT: !prof 69 70bb14: ; preds = %bb10 71 %tmp16 = call i32 @too() 72 %tmp17 = icmp sgt i32 %arg2, %tmp16 73 br label %bb18 74 75bb18: ; preds = %bb14, %bb10, %bb 76 %tmp19 = phi i1 [ false, %bb10 ], [ false, %bb ], [ %tmp17, %bb14 ] 77 %tmp20 = xor i1 %tmp19, true 78 %tmp21 = xor i1 %tmp20, true 79 %tmp22 = zext i1 %tmp21 to i32 80 %tmp23 = sext i32 %tmp22 to i64 81 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 0) 82 %tmp25 = icmp ne i64 %tmp24, 0 83 br i1 %tmp25, label %bb26, label %bb28 84; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT2:![0-9]+]] 85 86bb26: ; preds = %bb18 87 %tmp27 = call i32 @goo() 88 br label %bb30 89 90bb28: ; preds = %bb18 91 %tmp29 = call i32 @hoo() 92 br label %bb30 93 94bb30: ; preds = %bb28, %bb26 95 ret void 96} 97 98define void @foo_i32(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) { 99; CHECK-LABEL: void @foo_i32 100bb: 101 %tmp8 = call i32 @goo() 102 %tmp9 = icmp sgt i32 %tmp8, %arg 103 br i1 %tmp9, label %bb10, label %bb18 104; CHECK: !prof [[WEIGHT]] 105 106bb10: ; preds = %bb 107 %tmp12 = call i32 @hoo() 108 %tmp13 = icmp sgt i32 %arg1, %tmp12 109 br i1 %tmp13, label %bb14, label %bb18 110; CHECK: br i1 %tmp13, {{.*}}!prof [[WEIGHT]] 111 112bb14: ; preds = %bb10 113 %tmp16 = call i32 @too() 114 %tmp17 = icmp sgt i32 %arg2, %tmp16 115 br label %bb18 116 117bb18: ; preds = %bb14, %bb10, %bb 118 %tmp19 = phi i32 [ 5, %bb10 ], [ 5, %bb ], [ %tmp16, %bb14 ] 119 %tmp23 = sext i32 %tmp19 to i64 120 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 4) 121 %tmp25 = icmp ne i64 %tmp24, 0 122 br i1 %tmp25, label %bb26, label %bb28 123; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]] 124 125bb26: ; preds = %bb18 126 %tmp27 = call i32 @goo() 127 br label %bb30 128 129bb28: ; preds = %bb18 130 %tmp29 = call i32 @hoo() 131 br label %bb30 132 133bb30: ; preds = %bb28, %bb26 134 ret void 135} 136 137 138define void @foo_i32_not_unlikely(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) { 139; CHECK-LABEL: void @foo_i32_not_unlikely 140bb: 141 %tmp8 = call i32 @goo() 142 %tmp9 = icmp sgt i32 %tmp8, %arg 143 br i1 %tmp9, label %bb10, label %bb18 144; CHECK: br i1 %tmp9 145; CHECK-NOT: !prof 146 147bb10: ; preds = %bb 148 %tmp12 = call i32 @hoo() 149 %tmp13 = icmp sgt i32 %arg1, %tmp12 150 br i1 %tmp13, label %bb14, label %bb18 151; CHECK: br i1 %tmp13 152; CHECK-NOT: !prof 153 154bb14: ; preds = %bb10 155 %tmp16 = call i32 @too() 156 %tmp17 = icmp sgt i32 %arg2, %tmp16 157 br label %bb18 158 159bb18: ; preds = %bb14, %bb10, %bb 160 %tmp19 = phi i32 [ 4, %bb10 ], [ 4, %bb ], [ %tmp16, %bb14 ] 161 %tmp23 = sext i32 %tmp19 to i64 162 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 4) 163 %tmp25 = icmp ne i64 %tmp24, 0 164 br i1 %tmp25, label %bb26, label %bb28 165; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]] 166 167bb26: ; preds = %bb18 168 %tmp27 = call i32 @goo() 169 br label %bb30 170 171bb28: ; preds = %bb18 172 %tmp29 = call i32 @hoo() 173 br label %bb30 174 175bb30: ; preds = %bb28, %bb26 176 ret void 177} 178 179define void @foo_i32_xor(i32 %arg, i32 %arg1, i32 %arg2, i32 %arg3) { 180; CHECK-LABEL: void @foo_i32_xor 181bb: 182 %tmp8 = call i32 @goo() 183 %tmp9 = icmp sgt i32 %tmp8, %arg 184 br i1 %tmp9, label %bb10, label %bb18 185; CHECK: br i1 %tmp9,{{.*}}!prof [[WEIGHT]] 186 187bb10: ; preds = %bb 188 %tmp12 = call i32 @hoo() 189 %tmp13 = icmp sgt i32 %arg1, %tmp12 190 br i1 %tmp13, label %bb14, label %bb18 191; CHECK: br i1 %tmp13,{{.*}}!prof [[WEIGHT]] 192 193bb14: ; preds = %bb10 194 %tmp16 = call i32 @too() 195 %tmp17 = icmp sgt i32 %arg2, %tmp16 196 br label %bb18 197 198bb18: ; preds = %bb14, %bb10, %bb 199 %tmp19 = phi i32 [ 6, %bb10 ], [ 6, %bb ], [ %tmp16, %bb14 ] 200 %tmp20 = xor i32 %tmp19, 3 201 %tmp23 = sext i32 %tmp20 to i64 202 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 4) 203 %tmp25 = icmp ne i64 %tmp24, 0 204 br i1 %tmp25, label %bb26, label %bb28 205; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]] 206 207bb26: ; preds = %bb18 208 %tmp27 = call i32 @goo() 209 br label %bb30 210 211bb28: ; preds = %bb18 212 %tmp29 = call i32 @hoo() 213 br label %bb30 214bb30: ; preds = %bb28, %bb26 215 ret void 216} 217 218define void @foo_i8_sext(i32 %arg, i32 %arg1, i8 %arg2, i32 %arg3) { 219; CHECK-LABEL: void @foo_i8_sext 220bb: 221 %tmp8 = call i32 @goo() 222 %tmp9 = icmp sgt i32 %tmp8, %arg 223 br i1 %tmp9, label %bb10, label %bb18 224; CHECK: br i1 %tmp9,{{.*}}!prof [[WEIGHT]] 225 226bb10: ; preds = %bb 227 %tmp12 = call i32 @hoo() 228 %tmp13 = icmp sgt i32 %arg1, %tmp12 229 br i1 %tmp13, label %bb14, label %bb18 230; CHECK: br i1 %tmp13,{{.*}}!prof [[WEIGHT]] 231 232bb14: ; preds = %bb10 233 %tmp16 = call i8 @too8() 234 %tmp17 = icmp sgt i8 %arg2, %tmp16 235 br label %bb18 236 237bb18: ; preds = %bb14, %bb10, %bb 238 %tmp19 = phi i8 [ 255, %bb10 ], [ 255, %bb ], [ %tmp16, %bb14 ] 239 %tmp23 = sext i8 %tmp19 to i64 240; after sign extension, the operand value becomes -1 which does not match 255 241 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 255) 242 %tmp25 = icmp ne i64 %tmp24, 0 243 br i1 %tmp25, label %bb26, label %bb28 244; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]] 245 246bb26: ; preds = %bb18 247 %tmp27 = call i32 @goo() 248 br label %bb30 249 250bb28: ; preds = %bb18 251 %tmp29 = call i32 @hoo() 252 br label %bb30 253bb30: ; preds = %bb28, %bb26 254 ret void 255} 256 257define void @foo_i8_sext_not_unlikely(i32 %arg, i32 %arg1, i8 %arg2, i32 %arg3) { 258; CHECK-LABEL: void @foo_i8_sext_not_unlikely 259bb: 260 %tmp8 = call i32 @goo() 261 %tmp9 = icmp sgt i32 %tmp8, %arg 262 br i1 %tmp9, label %bb10, label %bb18 263; CHECK: br i1 %tmp9 264; CHECK-NOT: !prof 265 266bb10: ; preds = %bb 267 %tmp12 = call i32 @hoo() 268 %tmp13 = icmp sgt i32 %arg1, %tmp12 269 br i1 %tmp13, label %bb14, label %bb18 270; CHECK: br i1 %tmp13 271; CHECK-NOT: !prof 272 273bb14: ; preds = %bb10 274 %tmp16 = call i8 @too8() 275 %tmp17 = icmp sgt i8 %arg2, %tmp16 276 br label %bb18 277 278bb18: ; preds = %bb14, %bb10, %bb 279 %tmp19 = phi i8 [ 255, %bb10 ], [ 255, %bb ], [ %tmp16, %bb14 ] 280 %tmp23 = sext i8 %tmp19 to i64 281; after sign extension, the operand value becomes -1 which matches -1 282 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 -1) 283 %tmp25 = icmp ne i64 %tmp24, 0 284 br i1 %tmp25, label %bb26, label %bb28 285; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]] 286 287bb26: ; preds = %bb18 288 %tmp27 = call i32 @goo() 289 br label %bb30 290 291bb28: ; preds = %bb18 292 %tmp29 = call i32 @hoo() 293 br label %bb30 294bb30: ; preds = %bb28, %bb26 295 ret void 296} 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_unlikely 301bb: 302 %tmp8 = call i32 @goo() 303 %tmp9 = icmp sgt i32 %tmp8, %arg 304 br i1 %tmp9, label %bb10, label %bb18 305; CHECK: br i1 %tmp9 306; CHECK-NOT: !prof 307 308bb10: ; preds = %bb 309 %tmp12 = call i32 @hoo() 310 %tmp13 = icmp sgt i32 %arg1, %tmp12 311 br i1 %tmp13, label %bb14, label %bb18 312; CHECK: br i1 %tmp13 313; CHECK-NOT: !prof 314 315bb14: ; preds = %bb10 316 %tmp16 = call i32 @too() 317 %tmp17 = icmp sgt i32 %arg2, %tmp16 318 br label %bb18 319 320bb18: ; preds = %bb14, %bb10, %bb 321 %tmp19 = phi i32 [ 6, %bb10 ], [ 6, %bb ], [ %tmp16, %bb14 ] 322 %tmp20 = xor i32 %tmp19, 2 323 %tmp23 = sext i32 %tmp20 to i64 324 %tmp24 = call i64 @llvm.expect.i64(i64 %tmp23, i64 4) 325 %tmp25 = icmp ne i64 %tmp24, 0 326 br i1 %tmp25, label %bb26, label %bb28 327; CHECK: br i1 %tmp25,{{.*}}!prof [[WEIGHT]] 328 329bb26: ; preds = %bb18 330 %tmp27 = call i32 @goo() 331 br label %bb30 332 333bb28: ; preds = %bb18 334 %tmp29 = call i32 @hoo() 335 br label %bb30 336 337bb30: ; preds = %bb28, %bb26 338 ret void 339} 340 341declare i32 @goo() 342 343declare i32 @hoo() 344 345declare i32 @too() 346 347declare i8 @too8() 348 349; Function Attrs: nounwind readnone 350declare 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