|
3 | 3 | ; RUN: opt < %s -passes='function(lower-allow-check)' -lower-allow-check-random-rate=0 -S | FileCheck %s --check-prefixes=NONE
|
4 | 4 | ; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check)' -lower-allow-check-percentile-cutoff-hot=990000 -S | FileCheck %s --check-prefixes=HOT99
|
5 | 5 | ; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check)' -lower-allow-check-percentile-cutoff-hot=700000 -S | FileCheck %s --check-prefixes=HOT70
|
| 6 | +; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check)' -lower-allow-check-random-rate=0 -lower-allow-check-percentile-cutoff-hot=990000 -S | FileCheck %s --check-prefixes=NONE99 |
| 7 | +; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check)' -lower-allow-check-random-rate=1 -lower-allow-check-percentile-cutoff-hot=700000 -S | FileCheck %s --check-prefixes=ALL70 |
6 | 8 |
|
7 | 9 | target triple = "x86_64-pc-linux-gnu"
|
8 | 10 |
|
@@ -61,6 +63,32 @@ define dso_local noundef i32 @simple(ptr noundef readonly %0) {
|
61 | 63 | ; HOT70: 4:
|
62 | 64 | ; HOT70-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
|
63 | 65 | ; HOT70-NEXT: ret i32 [[TMP5]]
|
| 66 | +; |
| 67 | +; NONE99-LABEL: define dso_local noundef i32 @simple( |
| 68 | +; NONE99-SAME: ptr noundef readonly [[TMP0:%.*]]) { |
| 69 | +; NONE99-NEXT: [[CHK:%.*]] = icmp eq ptr [[TMP0]], null |
| 70 | +; NONE99-NEXT: [[HOT:%.*]] = xor i1 false, true |
| 71 | +; NONE99-NEXT: [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]] |
| 72 | +; NONE99-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]] |
| 73 | +; NONE99: 3: |
| 74 | +; NONE99-NEXT: tail call void @llvm.ubsantrap(i8 22) |
| 75 | +; NONE99-NEXT: unreachable |
| 76 | +; NONE99: 4: |
| 77 | +; NONE99-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4 |
| 78 | +; NONE99-NEXT: ret i32 [[TMP5]] |
| 79 | +; |
| 80 | +; ALL70-LABEL: define dso_local noundef i32 @simple( |
| 81 | +; ALL70-SAME: ptr noundef readonly [[TMP0:%.*]]) { |
| 82 | +; ALL70-NEXT: [[CHK:%.*]] = icmp eq ptr [[TMP0]], null |
| 83 | +; ALL70-NEXT: [[HOT:%.*]] = xor i1 true, true |
| 84 | +; ALL70-NEXT: [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]] |
| 85 | +; ALL70-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]] |
| 86 | +; ALL70: 3: |
| 87 | +; ALL70-NEXT: tail call void @llvm.ubsantrap(i8 22) |
| 88 | +; ALL70-NEXT: unreachable |
| 89 | +; ALL70: 4: |
| 90 | +; ALL70-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4 |
| 91 | +; ALL70-NEXT: ret i32 [[TMP5]] |
64 | 92 | ;
|
65 | 93 | %chk = icmp eq ptr %0, null
|
66 | 94 | %allow = call i1 @llvm.allow.ubsan.check(i8 22)
|
@@ -130,6 +158,32 @@ define dso_local noundef i32 @hot(ptr noundef readonly %0) !prof !36 {
|
130 | 158 | ; HOT70: 4:
|
131 | 159 | ; HOT70-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
|
132 | 160 | ; HOT70-NEXT: ret i32 [[TMP5]]
|
| 161 | +; |
| 162 | +; NONE99-LABEL: define dso_local noundef i32 @hot( |
| 163 | +; NONE99-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF16:![0-9]+]] { |
| 164 | +; NONE99-NEXT: [[CHK:%.*]] = icmp eq ptr [[TMP0]], null |
| 165 | +; NONE99-NEXT: [[HOT:%.*]] = xor i1 false, true |
| 166 | +; NONE99-NEXT: [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]] |
| 167 | +; NONE99-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]] |
| 168 | +; NONE99: 3: |
| 169 | +; NONE99-NEXT: tail call void @llvm.ubsantrap(i8 22) |
| 170 | +; NONE99-NEXT: unreachable |
| 171 | +; NONE99: 4: |
| 172 | +; NONE99-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4 |
| 173 | +; NONE99-NEXT: ret i32 [[TMP5]] |
| 174 | +; |
| 175 | +; ALL70-LABEL: define dso_local noundef i32 @hot( |
| 176 | +; ALL70-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF16:![0-9]+]] { |
| 177 | +; ALL70-NEXT: [[CHK:%.*]] = icmp eq ptr [[TMP0]], null |
| 178 | +; ALL70-NEXT: [[HOT:%.*]] = xor i1 true, true |
| 179 | +; ALL70-NEXT: [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]] |
| 180 | +; ALL70-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]] |
| 181 | +; ALL70: 3: |
| 182 | +; ALL70-NEXT: tail call void @llvm.ubsantrap(i8 22) |
| 183 | +; ALL70-NEXT: unreachable |
| 184 | +; ALL70: 4: |
| 185 | +; ALL70-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4 |
| 186 | +; ALL70-NEXT: ret i32 [[TMP5]] |
133 | 187 | ;
|
134 | 188 | %chk = icmp eq ptr %0, null
|
135 | 189 | %allow = call i1 @llvm.allow.ubsan.check(i8 22)
|
@@ -198,6 +252,32 @@ define dso_local noundef i32 @veryHot(ptr noundef readonly %0) !prof !39 {
|
198 | 252 | ; HOT70: 4:
|
199 | 253 | ; HOT70-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
|
200 | 254 | ; HOT70-NEXT: ret i32 [[TMP5]]
|
| 255 | +; |
| 256 | +; NONE99-LABEL: define dso_local noundef i32 @veryHot( |
| 257 | +; NONE99-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF17:![0-9]+]] { |
| 258 | +; NONE99-NEXT: [[CHK:%.*]] = icmp eq ptr [[TMP0]], null |
| 259 | +; NONE99-NEXT: [[HOT:%.*]] = xor i1 false, true |
| 260 | +; NONE99-NEXT: [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]] |
| 261 | +; NONE99-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]] |
| 262 | +; NONE99: 3: |
| 263 | +; NONE99-NEXT: tail call void @llvm.ubsantrap(i8 22) |
| 264 | +; NONE99-NEXT: unreachable |
| 265 | +; NONE99: 4: |
| 266 | +; NONE99-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4 |
| 267 | +; NONE99-NEXT: ret i32 [[TMP5]] |
| 268 | +; |
| 269 | +; ALL70-LABEL: define dso_local noundef i32 @veryHot( |
| 270 | +; ALL70-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF17:![0-9]+]] { |
| 271 | +; ALL70-NEXT: [[CHK:%.*]] = icmp eq ptr [[TMP0]], null |
| 272 | +; ALL70-NEXT: [[HOT:%.*]] = xor i1 true, true |
| 273 | +; ALL70-NEXT: [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]] |
| 274 | +; ALL70-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]] |
| 275 | +; ALL70: 3: |
| 276 | +; ALL70-NEXT: tail call void @llvm.ubsantrap(i8 22) |
| 277 | +; ALL70-NEXT: unreachable |
| 278 | +; ALL70: 4: |
| 279 | +; ALL70-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4 |
| 280 | +; ALL70-NEXT: ret i32 [[TMP5]] |
201 | 281 | ;
|
202 | 282 | %chk = icmp eq ptr %0, null
|
203 | 283 | %allow = call i1 @llvm.allow.ubsan.check(i8 22)
|
@@ -291,6 +371,44 @@ define dso_local noundef i32 @branchColdFnHot(i32 noundef %0, ptr noundef readon
|
291 | 371 | ; HOT70: 9:
|
292 | 372 | ; HOT70-NEXT: [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
|
293 | 373 | ; HOT70-NEXT: ret i32 [[TMP10]]
|
| 374 | +; |
| 375 | +; NONE99-LABEL: define dso_local noundef i32 @branchColdFnHot( |
| 376 | +; NONE99-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF17]] { |
| 377 | +; NONE99-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0 |
| 378 | +; NONE99-NEXT: br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF18:![0-9]+]] |
| 379 | +; NONE99: 4: |
| 380 | +; NONE99-NEXT: [[CHK:%.*]] = icmp eq ptr [[TMP1]], null |
| 381 | +; NONE99-NEXT: [[HOT:%.*]] = xor i1 false, true |
| 382 | +; NONE99-NEXT: [[TMP5:%.*]] = or i1 [[CHK]], [[HOT]] |
| 383 | +; NONE99-NEXT: br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP7:%.*]] |
| 384 | +; NONE99: 6: |
| 385 | +; NONE99-NEXT: tail call void @llvm.ubsantrap(i8 22) |
| 386 | +; NONE99-NEXT: unreachable |
| 387 | +; NONE99: 7: |
| 388 | +; NONE99-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4 |
| 389 | +; NONE99-NEXT: br label [[TMP9]] |
| 390 | +; NONE99: 9: |
| 391 | +; NONE99-NEXT: [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ] |
| 392 | +; NONE99-NEXT: ret i32 [[TMP10]] |
| 393 | +; |
| 394 | +; ALL70-LABEL: define dso_local noundef i32 @branchColdFnHot( |
| 395 | +; ALL70-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF17]] { |
| 396 | +; ALL70-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0 |
| 397 | +; ALL70-NEXT: br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF18:![0-9]+]] |
| 398 | +; ALL70: 4: |
| 399 | +; ALL70-NEXT: [[CHK:%.*]] = icmp eq ptr [[TMP1]], null |
| 400 | +; ALL70-NEXT: [[HOT:%.*]] = xor i1 true, true |
| 401 | +; ALL70-NEXT: [[TMP5:%.*]] = or i1 [[CHK]], [[HOT]] |
| 402 | +; ALL70-NEXT: br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP7:%.*]] |
| 403 | +; ALL70: 6: |
| 404 | +; ALL70-NEXT: tail call void @llvm.ubsantrap(i8 22) |
| 405 | +; ALL70-NEXT: unreachable |
| 406 | +; ALL70: 7: |
| 407 | +; ALL70-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4 |
| 408 | +; ALL70-NEXT: br label [[TMP9]] |
| 409 | +; ALL70: 9: |
| 410 | +; ALL70-NEXT: [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ] |
| 411 | +; ALL70-NEXT: ret i32 [[TMP10]] |
294 | 412 | ;
|
295 | 413 | %3 = icmp eq i32 %0, 0
|
296 | 414 | br i1 %3, label %9, label %4, !prof !38
|
@@ -391,6 +509,44 @@ define dso_local noundef i32 @branchHotFnCold(i32 noundef %0, ptr noundef readon
|
391 | 509 | ; HOT70: 9:
|
392 | 510 | ; HOT70-NEXT: [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
|
393 | 511 | ; HOT70-NEXT: ret i32 [[TMP10]]
|
| 512 | +; |
| 513 | +; NONE99-LABEL: define dso_local noundef i32 @branchHotFnCold( |
| 514 | +; NONE99-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF16]] { |
| 515 | +; NONE99-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0 |
| 516 | +; NONE99-NEXT: br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF19:![0-9]+]] |
| 517 | +; NONE99: 4: |
| 518 | +; NONE99-NEXT: [[CHK:%.*]] = icmp eq ptr [[TMP1]], null |
| 519 | +; NONE99-NEXT: [[HOT:%.*]] = xor i1 false, true |
| 520 | +; NONE99-NEXT: [[TMP5:%.*]] = or i1 [[CHK]], [[HOT]] |
| 521 | +; NONE99-NEXT: br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP7:%.*]] |
| 522 | +; NONE99: 6: |
| 523 | +; NONE99-NEXT: tail call void @llvm.ubsantrap(i8 22) |
| 524 | +; NONE99-NEXT: unreachable |
| 525 | +; NONE99: 7: |
| 526 | +; NONE99-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4 |
| 527 | +; NONE99-NEXT: br label [[TMP9]] |
| 528 | +; NONE99: 9: |
| 529 | +; NONE99-NEXT: [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ] |
| 530 | +; NONE99-NEXT: ret i32 [[TMP10]] |
| 531 | +; |
| 532 | +; ALL70-LABEL: define dso_local noundef i32 @branchHotFnCold( |
| 533 | +; ALL70-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF16]] { |
| 534 | +; ALL70-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0 |
| 535 | +; ALL70-NEXT: br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF19:![0-9]+]] |
| 536 | +; ALL70: 4: |
| 537 | +; ALL70-NEXT: [[CHK:%.*]] = icmp eq ptr [[TMP1]], null |
| 538 | +; ALL70-NEXT: [[HOT:%.*]] = xor i1 true, true |
| 539 | +; ALL70-NEXT: [[TMP5:%.*]] = or i1 [[CHK]], [[HOT]] |
| 540 | +; ALL70-NEXT: br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP7:%.*]] |
| 541 | +; ALL70: 6: |
| 542 | +; ALL70-NEXT: tail call void @llvm.ubsantrap(i8 22) |
| 543 | +; ALL70-NEXT: unreachable |
| 544 | +; ALL70: 7: |
| 545 | +; ALL70-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4 |
| 546 | +; ALL70-NEXT: br label [[TMP9]] |
| 547 | +; ALL70: 9: |
| 548 | +; ALL70-NEXT: [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ] |
| 549 | +; ALL70-NEXT: ret i32 [[TMP10]] |
394 | 550 | ;
|
395 | 551 | %3 = icmp eq i32 %0, 0
|
396 | 552 | br i1 %3, label %9, label %4, !prof !37
|
@@ -460,3 +616,13 @@ define dso_local noundef i32 @branchHotFnCold(i32 noundef %0, ptr noundef readon
|
460 | 616 | ; HOT70: [[PROF18]] = !{!"branch_weights", i32 1000, i32 1}
|
461 | 617 | ; HOT70: [[PROF19]] = !{!"branch_weights", i32 1, i32 1000}
|
462 | 618 | ;.
|
| 619 | +; NONE99: [[PROF16]] = !{!"function_entry_count", i64 1000} |
| 620 | +; NONE99: [[PROF17]] = !{!"function_entry_count", i64 7000} |
| 621 | +; NONE99: [[PROF18]] = !{!"branch_weights", i32 1000, i32 1} |
| 622 | +; NONE99: [[PROF19]] = !{!"branch_weights", i32 1, i32 1000} |
| 623 | +;. |
| 624 | +; ALL70: [[PROF16]] = !{!"function_entry_count", i64 1000} |
| 625 | +; ALL70: [[PROF17]] = !{!"function_entry_count", i64 7000} |
| 626 | +; ALL70: [[PROF18]] = !{!"branch_weights", i32 1000, i32 1} |
| 627 | +; ALL70: [[PROF19]] = !{!"branch_weights", i32 1, i32 1000} |
| 628 | +;. |
0 commit comments