|
1 | | -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 5 |
2 | 2 | ; RUN: opt -passes='simplifycfg<switch-to-lookup>' -simplifycfg-require-and-preserve-domtree=1 -S < %s | FileCheck %s |
3 | 3 |
|
4 | 4 | target triple = "x86_64-unknown-linux-gnu" |
5 | 5 |
|
| 6 | +;. |
| 7 | +; CHECK: @switch.table.switch_of_powers_two = private unnamed_addr constant [7 x i32] [i32 3, i32 poison, i32 poison, i32 2, i32 1, i32 0, i32 42], align 4 |
| 8 | +; CHECK: @switch.table.switch_of_powers_two_default_reachable = private unnamed_addr constant [7 x i32] [i32 3, i32 5, i32 5, i32 2, i32 1, i32 0, i32 42], align 4 |
| 9 | +; CHECK: @switch.table.switch_of_powers_two_default_reachable_multipreds = private unnamed_addr constant [7 x i32] [i32 3, i32 poison, i32 poison, i32 2, i32 1, i32 0, i32 42], align 4 |
| 10 | +;. |
6 | 11 | define i32 @switch_of_powers_two(i32 %arg) { |
7 | 12 | ; CHECK-LABEL: define i32 @switch_of_powers_two( |
8 | 13 | ; CHECK-SAME: i32 [[ARG:%.*]]) { |
@@ -35,17 +40,17 @@ return: |
35 | 40 | ret i32 %phi |
36 | 41 | } |
37 | 42 |
|
38 | | -define i32 @switch_of_powers_two_default_reachable(i32 %arg) { |
| 43 | +define i32 @switch_of_powers_two_default_reachable(i32 %arg) !prof !0 { |
39 | 44 | ; CHECK-LABEL: define i32 @switch_of_powers_two_default_reachable( |
40 | | -; CHECK-SAME: i32 [[ARG:%.*]]) { |
| 45 | +; CHECK-SAME: i32 [[ARG:%.*]]) !prof [[PROF0:![0-9]+]] { |
41 | 46 | ; CHECK-NEXT: [[ENTRY:.*]]: |
42 | 47 | ; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.ctpop.i32(i32 [[ARG]]) |
43 | 48 | ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 1 |
44 | | -; CHECK-NEXT: br i1 [[TMP1]], label %[[ENTRY_SPLIT:.*]], label %[[RETURN:.*]] |
| 49 | +; CHECK-NEXT: br i1 [[TMP1]], label %[[ENTRY_SPLIT:.*]], label %[[RETURN:.*]], !prof [[PROF1:![0-9]+]] |
45 | 50 | ; CHECK: [[ENTRY_SPLIT]]: |
46 | 51 | ; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.cttz.i32(i32 [[ARG]], i1 true) |
47 | 52 | ; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i32 [[TMP2]], 7 |
48 | | -; CHECK-NEXT: br i1 [[TMP3]], label %[[SWITCH_LOOKUP:.*]], label %[[RETURN]] |
| 53 | +; CHECK-NEXT: br i1 [[TMP3]], label %[[SWITCH_LOOKUP:.*]], label %[[RETURN]], !prof [[PROF2:![0-9]+]] |
49 | 54 | ; CHECK: [[SWITCH_LOOKUP]]: |
50 | 55 | ; CHECK-NEXT: [[TMP4:%.*]] = zext nneg i32 [[TMP2]] to i64 |
51 | 56 | ; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [7 x i32], ptr @switch.table.switch_of_powers_two_default_reachable, i64 0, i64 [[TMP4]] |
|
62 | 67 | i32 16, label %bb3 |
63 | 68 | i32 32, label %bb4 |
64 | 69 | i32 64, label %bb5 |
65 | | - ] |
| 70 | + ], !prof !1 |
66 | 71 |
|
67 | 72 | default_case: br label %return |
68 | 73 | bb1: br label %return |
@@ -128,3 +133,13 @@ return: |
128 | 133 | %phi = phi i32 [ 3, %bb1 ], [ 2, %bb2 ], [ 1, %bb3 ], [ 0, %bb4 ], [ 42, %bb5 ], [ %pn, %default_case ] |
129 | 134 | ret i32 %phi |
130 | 135 | } |
| 136 | + |
| 137 | +!0 = !{!"function_entry_count", i32 10} |
| 138 | +!1 = !{!"branch_weights", i32 10, i32 5, i32 7, i32 11, i32 13, i32 17} |
| 139 | +;. |
| 140 | +; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } |
| 141 | +;. |
| 142 | +; CHECK: [[PROF0]] = !{!"function_entry_count", i32 10} |
| 143 | +; CHECK: [[PROF1]] = !{!"branch_weights", i32 58, i32 5} |
| 144 | +; CHECK: [[PROF2]] = !{!"branch_weights", i32 46, i32 5} |
| 145 | +;. |
0 commit comments