Skip to content

Commit 5c51af5

Browse files
committed
[JTS] Use common branch weigth downscaling
1 parent 5b1cbec commit 5c51af5

File tree

2 files changed

+78
-17
lines changed

2 files changed

+78
-17
lines changed

llvm/lib/Transforms/Scalar/JumpTableToSwitch.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ expandToSwitch(CallBase *CB, const JumpTableTy &JT, DomTreeUpdater &DTU,
159159
DTUpdates.push_back({DominatorTree::Insert, B, Tail});
160160

161161
CallBase *Call = cast<CallBase>(CB->clone());
162+
// The MD_prof metadata (VP kind), if it existed, can be dropped, it doesn't
163+
// make sense on a direct call. Note that the values are used for the branch
164+
// weights of the switch.
165+
Call->setMetadata(LLVMContext::MD_prof, nullptr);
162166
Call->setCalledFunction(Func);
163167
Call->insertInto(B, B->end());
164168
Switch->addCase(
@@ -180,14 +184,8 @@ expandToSwitch(CallBase *CB, const JumpTableTy &JT, DomTreeUpdater &DTU,
180184
if (HadProfile && !ProfcheckDisableMetadataFixes) {
181185
// At least one of the targets must've been taken.
182186
assert(llvm::any_of(BranchWeights, [](uint64_t V) { return V != 0; }));
183-
// FIXME: this duplicates logic in instrumentation. Note: since there's at
184-
// least a nonzero and these are unsigned values, it follows MaxBW != 0.
185-
uint64_t MaxBW = *llvm::max_element(BranchWeights);
186-
SmallVector<uint32_t> ScaledBranchWeights(
187-
llvm::map_range(BranchWeights, [MaxBW](uint64_t V) {
188-
return static_cast<uint32_t>(V / MaxBW);
189-
}));
190-
setBranchWeights(*Switch, ScaledBranchWeights, /*IsExpected=*/false);
187+
setBranchWeights(*Switch, downscaleWeights(BranchWeights),
188+
/*IsExpected=*/false);
191189
} else
192190
setExplicitlyUnknownBranchWeights(*Switch);
193191
if (PHI)

llvm/test/Transforms/JumpTableToSwitch/basic.ll

Lines changed: 72 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,39 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 4
22
; RUN: opt < %s -passes=jump-table-to-switch -verify-dom-info -S | FileCheck %s
33
; RUN: opt < %s -passes=jump-table-to-switch -jump-table-to-switch-size-threshold=0 -verify-dom-info -S | FileCheck %s --check-prefix=THRESHOLD-0
44

55
@func_array = constant [2 x ptr] [ptr @func0, ptr @func1]
66

7+
;.
8+
; CHECK: @func_array = constant [2 x ptr] [ptr @func0, ptr @func1]
9+
; CHECK: @void_func_array = constant [2 x ptr] [ptr @void_func0, ptr @void_func1]
10+
; CHECK: @func_array_addrspace_42 = addrspace(42) constant [2 x ptr addrspace(42)] [ptr addrspace(42) @func0_addrspace_42, ptr addrspace(42) @func1_addrspace_42]
11+
;.
12+
; THRESHOLD-0: @func_array = constant [2 x ptr] [ptr @func0, ptr @func1]
13+
; THRESHOLD-0: @void_func_array = constant [2 x ptr] [ptr @void_func0, ptr @void_func1]
14+
; THRESHOLD-0: @func_array_addrspace_42 = addrspace(42) constant [2 x ptr addrspace(42)] [ptr addrspace(42) @func0_addrspace_42, ptr addrspace(42) @func1_addrspace_42]
15+
;.
716
define i32 @func0() !guid !0 {
17+
; CHECK-LABEL: define i32 @func0(
18+
; CHECK-SAME: ) !guid [[META0:![0-9]+]] {
19+
; CHECK-NEXT: ret i32 1
20+
;
21+
; THRESHOLD-0-LABEL: define i32 @func0(
22+
; THRESHOLD-0-SAME: ) !guid [[META0:![0-9]+]] {
23+
; THRESHOLD-0-NEXT: ret i32 1
24+
;
825
ret i32 1
926
}
1027

1128
define i32 @func1() !guid !1 {
29+
; CHECK-LABEL: define i32 @func1(
30+
; CHECK-SAME: ) !guid [[META1:![0-9]+]] {
31+
; CHECK-NEXT: ret i32 2
32+
;
33+
; THRESHOLD-0-LABEL: define i32 @func1(
34+
; THRESHOLD-0-SAME: ) !guid [[META1:![0-9]+]] {
35+
; THRESHOLD-0-NEXT: ret i32 2
36+
;
1237
ret i32 2
1338
}
1439

@@ -20,7 +45,7 @@ define i32 @function_with_jump_table(i32 %index) {
2045
; CHECK-NEXT: switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [
2146
; CHECK-NEXT: i32 0, label [[CALL_0:%.*]]
2247
; CHECK-NEXT: i32 1, label [[CALL_1:%.*]]
23-
; CHECK-NEXT: ]
48+
; CHECK-NEXT: ], !prof [[PROF2:![0-9]+]]
2449
; CHECK: default.switch.case.unreachable:
2550
; CHECK-NEXT: unreachable
2651
; CHECK: call.0:
@@ -37,7 +62,7 @@ define i32 @function_with_jump_table(i32 %index) {
3762
; THRESHOLD-0-SAME: i32 [[INDEX:%.*]]) {
3863
; THRESHOLD-0-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]]
3964
; THRESHOLD-0-NEXT: [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 8
40-
; THRESHOLD-0-NEXT: [[RESULT:%.*]] = call i32 [[FUNC_PTR]]()
65+
; THRESHOLD-0-NEXT: [[RESULT:%.*]] = call i32 [[FUNC_PTR]](), !prof [[PROF2:![0-9]+]]
4166
; THRESHOLD-0-NEXT: ret i32 [[RESULT]]
4267
;
4368
%gep = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 %index
@@ -54,7 +79,7 @@ define i32 @basic_block_splitted_twice(i32 %index) {
5479
; CHECK-NEXT: switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [
5580
; CHECK-NEXT: i32 0, label [[CALL_0:%.*]]
5681
; CHECK-NEXT: i32 1, label [[CALL_1:%.*]]
57-
; CHECK-NEXT: ]
82+
; CHECK-NEXT: ], !prof [[PROF3:![0-9]+]]
5883
; CHECK: default.switch.case.unreachable:
5984
; CHECK-NEXT: unreachable
6085
; CHECK: call.0:
@@ -70,7 +95,7 @@ define i32 @basic_block_splitted_twice(i32 %index) {
7095
; CHECK-NEXT: switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE1:%.*]] [
7196
; CHECK-NEXT: i32 0, label [[CALL_02:%.*]]
7297
; CHECK-NEXT: i32 1, label [[CALL_13:%.*]]
73-
; CHECK-NEXT: ]
98+
; CHECK-NEXT: ], !prof [[PROF3]]
7499
; CHECK: default.switch.case.unreachable1:
75100
; CHECK-NEXT: unreachable
76101
; CHECK: call.02:
@@ -106,10 +131,22 @@ define i32 @basic_block_splitted_twice(i32 %index) {
106131
}
107132

108133
define void @void_func0() {
134+
; CHECK-LABEL: define void @void_func0() {
135+
; CHECK-NEXT: ret void
136+
;
137+
; THRESHOLD-0-LABEL: define void @void_func0() {
138+
; THRESHOLD-0-NEXT: ret void
139+
;
109140
ret void
110141
}
111142

112143
define void @void_func1() {
144+
; CHECK-LABEL: define void @void_func1() {
145+
; CHECK-NEXT: ret void
146+
;
147+
; THRESHOLD-0-LABEL: define void @void_func1() {
148+
; THRESHOLD-0-NEXT: ret void
149+
;
113150
ret void
114151
}
115152

@@ -123,7 +160,7 @@ define void @void_function_with_jump_table(i32 %index) {
123160
; CHECK-NEXT: switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [
124161
; CHECK-NEXT: i32 0, label [[CALL_0:%.*]]
125162
; CHECK-NEXT: i32 1, label [[CALL_1:%.*]]
126-
; CHECK-NEXT: ]
163+
; CHECK-NEXT: ], !prof [[PROF3]]
127164
; CHECK: default.switch.case.unreachable:
128165
; CHECK-NEXT: unreachable
129166
; CHECK: call.0:
@@ -156,7 +193,7 @@ define void @void_function_with_jump_table_and_call_site_attr(i32 %index) {
156193
; CHECK-NEXT: switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [
157194
; CHECK-NEXT: i32 0, label [[CALL_0:%.*]]
158195
; CHECK-NEXT: i32 1, label [[CALL_1:%.*]]
159-
; CHECK-NEXT: ]
196+
; CHECK-NEXT: ], !prof [[PROF3]]
160197
; CHECK: default.switch.case.unreachable:
161198
; CHECK-NEXT: unreachable
162199
; CHECK: call.0:
@@ -183,10 +220,22 @@ define void @void_function_with_jump_table_and_call_site_attr(i32 %index) {
183220

184221

185222
define i32 @func0_addrspace_42() addrspace(42) {
223+
; CHECK-LABEL: define i32 @func0_addrspace_42() addrspace(42) {
224+
; CHECK-NEXT: ret i32 1
225+
;
226+
; THRESHOLD-0-LABEL: define i32 @func0_addrspace_42() addrspace(42) {
227+
; THRESHOLD-0-NEXT: ret i32 1
228+
;
186229
ret i32 1
187230
}
188231

189232
define i32 @func1_addrspace_42() addrspace(42) {
233+
; CHECK-LABEL: define i32 @func1_addrspace_42() addrspace(42) {
234+
; CHECK-NEXT: ret i32 2
235+
;
236+
; THRESHOLD-0-LABEL: define i32 @func1_addrspace_42() addrspace(42) {
237+
; THRESHOLD-0-NEXT: ret i32 2
238+
;
190239
ret i32 2
191240
}
192241

@@ -200,7 +249,7 @@ define i32 @function_with_jump_table_addrspace_42(i32 %index) addrspace(42) {
200249
; CHECK-NEXT: switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [
201250
; CHECK-NEXT: i32 0, label [[CALL_0:%.*]]
202251
; CHECK-NEXT: i32 1, label [[CALL_1:%.*]]
203-
; CHECK-NEXT: ]
252+
; CHECK-NEXT: ], !prof [[PROF3]]
204253
; CHECK: default.switch.case.unreachable:
205254
; CHECK-NEXT: unreachable
206255
; CHECK: call.0:
@@ -228,4 +277,18 @@ define i32 @function_with_jump_table_addrspace_42(i32 %index) addrspace(42) {
228277

229278
!0 = !{i64 5678}
230279
!1 = !{i64 5555}
231-
!2 = !{!"VP", i32 0, i64 25, i64 5678, i64 20, i64 5555, i64 5}
280+
!2 = !{!"VP", i32 0, i64 25, i64 5678, i64 20, i64 5555, i64 5}
281+
;.
282+
; CHECK: attributes #[[ATTR0]] = { nounwind }
283+
;.
284+
; THRESHOLD-0: attributes #[[ATTR0]] = { nounwind }
285+
;.
286+
; CHECK: [[META0]] = !{i64 5678}
287+
; CHECK: [[META1]] = !{i64 5555}
288+
; CHECK: [[PROF2]] = !{!"branch_weights", i32 0, i32 20, i32 5}
289+
; CHECK: [[PROF3]] = !{!"unknown"}
290+
;.
291+
; THRESHOLD-0: [[META0]] = !{i64 5678}
292+
; THRESHOLD-0: [[META1]] = !{i64 5555}
293+
; THRESHOLD-0: [[PROF2]] = !{!"VP", i32 0, i64 25, i64 5678, i64 20, i64 5555, i64 5}
294+
;.

0 commit comments

Comments
 (0)