
Previous stabs at this setting (https://github.com/llvm/llvm-project/pull/71166) hypertuned it for SPEC2017, but Clang's own compilation can benefit from a slightly lower threshold, yielding a 0.3% improvement in compile time, while still not regressing SPEC. Most notable beneficiaries of this change are: - `llvm::Instruction::getNumSuccessors` (11 cases) - `llvm::Instruction::getSuccessor` (11 cases) Test Suite with a bootstrapped build: ``` Tests: 4316 Metric: compile_time Program compile_time lhs rhs diff SingleSour...ce/UnitTests/SignlessTypes/div 0.02 0.02 3.0% SingleSour.../UnitTests/SignlessTypes/cast2 0.02 0.02 2.8% SingleSource/Benchmarks/Misc/flops-4 0.02 0.02 1.9% SingleSour...ebra/solvers/cholesky/cholesky 0.05 0.05 1.8% SingleSour...tTests/2020-01-06-coverage-006 0.02 0.02 1.7% SingleSour...ce/Benchmarks/Stanford/FloatMM 0.03 0.03 1.7% SingleSour...9-04-16-BitfieldInitialization 0.02 0.02 1.7% SingleSour...nitTests/2003-07-08-BitOpsTest 0.02 0.02 1.7% MultiSourc...marks/Prolangs-C++/vcirc/vcirc 0.02 0.02 1.6% MultiSourc...Prolangs-C/fixoutput/fixoutput 0.05 0.05 1.5% SingleSour...h/stencils/jacobi-1d/jacobi-1d 0.04 0.04 1.4% MultiSourc...rks/Prolangs-C++/office/office 0.28 0.28 1.4% SingleSour...arks/Adobe-C++/functionobjects 0.39 0.40 1.3% SingleSour...Tests/2003-10-29-ScalarReplBug 0.02 0.02 1.2% SingleSour...arks/Adobe-C++/stepanov_vector 0.41 0.42 1.2% Geomean difference -0.3% compile_time l/r lhs rhs diff count 4316.000000 4316.000000 469.000000 mean 0.057747 0.057595 -0.003034 std 0.544528 0.543139 0.007625 min 0.000000 0.000000 -0.035294 25% 0.000000 0.000000 -0.007006 50% 0.000000 0.000000 -0.003257 75% 0.000000 0.000000 0.000000 max 18.295300 18.252500 0.030151 ```
202 lines
6.8 KiB
LLVM
202 lines
6.8 KiB
LLVM
; RUN: llc %s -O2 -print-after-isel -mtriple=aarch64-linux-gnu -jump-table-density=40 -aarch64-min-jump-table-entries=0 -o /dev/null 2> %t; FileCheck %s --check-prefixes=CHECK,CHECK0 < %t
|
|
; RUN: llc %s -O2 -print-after-isel -mtriple=aarch64-linux-gnu -jump-table-density=40 -aarch64-min-jump-table-entries=2 -o /dev/null 2> %t; FileCheck %s --check-prefixes=CHECK,CHECK2 < %t
|
|
; RUN: llc %s -O2 -print-after-isel -mtriple=aarch64-linux-gnu -jump-table-density=40 -aarch64-min-jump-table-entries=4 -o /dev/null 2> %t; FileCheck %s --check-prefixes=CHECK,CHECK4 < %t
|
|
; RUN: llc %s -O2 -print-after-isel -mtriple=aarch64-linux-gnu -jump-table-density=40 -aarch64-min-jump-table-entries=8 -o /dev/null 2> %t; FileCheck %s --check-prefixes=CHECK,CHECK8 < %t
|
|
; RUN: llc %s -O2 -print-after-isel -mtriple=aarch64-linux-gnu -jump-table-density=40 -aarch64-min-jump-table-entries=12 -o /dev/null 2> %t; FileCheck %s --check-prefixes=CHECK,CHECK12 < %t
|
|
; RUN: llc %s -O2 -print-after-isel -mtriple=aarch64-linux-gnu -jump-table-density=40 -o /dev/null 2> %t; FileCheck %s --check-prefixes=CHECK,CHECK-DEFAULT < %t
|
|
|
|
declare void @ext(i32, i32)
|
|
|
|
define i32 @jt2(i32 %a, i32 %b) {
|
|
entry:
|
|
switch i32 %a, label %return [
|
|
i32 1, label %bb1
|
|
i32 3, label %bb2
|
|
]
|
|
; CHECK-LABEL: function jt2:
|
|
; CHECK0-NEXT: Jump Tables:
|
|
; CHECK2-NEXT: Jump Tables:
|
|
; CHECK4-NOT: {{^}}Jump Tables:
|
|
; CHECK8-NOT: {{^}}Jump Tables:
|
|
; CHECK12-NOT: {{^}}Jump Tables:
|
|
; CHECK-DEFAULT-NOT: {{^}}Jump Tables:
|
|
|
|
bb1: tail call void @ext(i32 1, i32 0) br label %return
|
|
bb2: tail call void @ext(i32 2, i32 2) br label %return
|
|
|
|
return: ret i32 %b
|
|
}
|
|
|
|
define i32 @jt4(i32 %a, i32 %b) {
|
|
entry:
|
|
switch i32 %a, label %return [
|
|
i32 1, label %bb1
|
|
i32 2, label %bb2
|
|
i32 3, label %bb3
|
|
i32 5, label %bb4
|
|
]
|
|
; CHECK-LABEL: function jt4:
|
|
; CHECK0-NEXT: Jump Tables:
|
|
; CHECK2-NEXT: Jump Tables:
|
|
; CHECK4-NEXT: Jump Tables:
|
|
; CHECK8-NOT: {{^}}Jump Tables:
|
|
; CHECK12-NOT: {{^}}Jump Tables:
|
|
; CHECK-DEFAULT-NOT: {{^}}Jump Tables:
|
|
|
|
bb1: tail call void @ext(i32 1, i32 0) br label %return
|
|
bb2: tail call void @ext(i32 3, i32 2) br label %return
|
|
bb3: tail call void @ext(i32 4, i32 4) br label %return
|
|
bb4: tail call void @ext(i32 5, i32 6) br label %return
|
|
|
|
return: ret i32 %b
|
|
}
|
|
|
|
define i32 @jt8(i32 %a, i32 %b) {
|
|
entry:
|
|
switch i32 %a, label %return [
|
|
i32 1, label %bb1
|
|
i32 2, label %bb2
|
|
i32 3, label %bb3
|
|
i32 4, label %bb4
|
|
i32 5, label %bb5
|
|
i32 6, label %bb6
|
|
i32 7, label %bb7
|
|
i32 9, label %bb8
|
|
]
|
|
; CHECK-LABEL: function jt8:
|
|
; CHECK0-NEXT: Jump Tables:
|
|
; CHECK2-NEXT: Jump Tables:
|
|
; CHECK4-NEXT: Jump Tables:
|
|
; CHECK8-NEXT: Jump Tables:
|
|
; CHECK12-NOT: Jump Tables:
|
|
; CHECK-DEFAULT-NOT: {{^}}Jump Tables:
|
|
|
|
bb1: tail call void @ext(i32 1, i32 0) br label %return
|
|
bb2: tail call void @ext(i32 2, i32 2) br label %return
|
|
bb3: tail call void @ext(i32 3, i32 4) br label %return
|
|
bb4: tail call void @ext(i32 4, i32 6) br label %return
|
|
bb5: tail call void @ext(i32 5, i32 8) br label %return
|
|
bb6: tail call void @ext(i32 6, i32 10) br label %return
|
|
bb7: tail call void @ext(i32 7, i32 12) br label %return
|
|
bb8: tail call void @ext(i32 8, i32 14) br label %return
|
|
|
|
return: ret i32 %b
|
|
}
|
|
|
|
define i32 @jt12(i32 %a, i32 %b) {
|
|
entry:
|
|
switch i32 %a, label %return [
|
|
i32 1, label %bb1
|
|
i32 2, label %bb2
|
|
i32 3, label %bb3
|
|
i32 4, label %bb4
|
|
i32 5, label %bb5
|
|
i32 6, label %bb6
|
|
i32 7, label %bb7
|
|
i32 8, label %bb8
|
|
i32 9, label %bb9
|
|
i32 10, label %bb10
|
|
i32 11, label %bb11
|
|
i32 12, label %bb12
|
|
]
|
|
; CHECK-LABEL: function jt12:
|
|
; CHECK0-NEXT: Jump Tables:
|
|
; CHECK2-NEXT: Jump Tables:
|
|
; CHECK4-NEXT: Jump Tables:
|
|
; CHECK8-NEXT: Jump Tables:
|
|
; CHECK12-NEXT: Jump Tables:
|
|
; CHECK-DEFAULT: {{^}}Jump Tables:
|
|
|
|
bb1: tail call void @ext(i32 1, i32 0) br label %return
|
|
bb2: tail call void @ext(i32 2, i32 2) br label %return
|
|
bb3: tail call void @ext(i32 3, i32 4) br label %return
|
|
bb4: tail call void @ext(i32 4, i32 6) br label %return
|
|
bb5: tail call void @ext(i32 5, i32 8) br label %return
|
|
bb6: tail call void @ext(i32 6, i32 10) br label %return
|
|
bb7: tail call void @ext(i32 7, i32 12) br label %return
|
|
bb8: tail call void @ext(i32 8, i32 14) br label %return
|
|
bb9: tail call void @ext(i32 9, i32 16) br label %return
|
|
bb10: tail call void @ext(i32 10, i32 18) br label %return
|
|
bb11: tail call void @ext(i32 11, i32 20) br label %return
|
|
bb12: tail call void @ext(i32 12, i32 22) br label %return
|
|
|
|
return: ret i32 %b
|
|
}
|
|
|
|
define i32 @jt12_min_size(i32 %a, i32 %b) minsize {
|
|
entry:
|
|
switch i32 %a, label %return [
|
|
i32 1, label %bb1
|
|
i32 2, label %bb2
|
|
i32 3, label %bb3
|
|
i32 4, label %bb4
|
|
i32 5, label %bb5
|
|
i32 6, label %bb6
|
|
i32 7, label %bb7
|
|
i32 8, label %bb8
|
|
i32 9, label %bb9
|
|
i32 10, label %bb10
|
|
i32 11, label %bb11
|
|
i32 12, label %bb12
|
|
]
|
|
; CHECK-LABEL: function jt12_min_size:
|
|
; CHECK0-NEXT: Jump Tables:
|
|
; CHECK2-NEXT: Jump Tables:
|
|
; CHECK4-NEXT: Jump Tables:
|
|
; CHECK8-NEXT: Jump Tables:
|
|
; CHECK12-NEXT: Jump Tables:
|
|
; CHECK-DEFAULT: Jump Tables:
|
|
|
|
bb1: tail call void @ext(i32 1, i32 0) br label %return
|
|
bb2: tail call void @ext(i32 2, i32 2) br label %return
|
|
bb3: tail call void @ext(i32 3, i32 4) br label %return
|
|
bb4: tail call void @ext(i32 4, i32 6) br label %return
|
|
bb5: tail call void @ext(i32 5, i32 8) br label %return
|
|
bb6: tail call void @ext(i32 6, i32 10) br label %return
|
|
bb7: tail call void @ext(i32 7, i32 12) br label %return
|
|
bb8: tail call void @ext(i32 8, i32 14) br label %return
|
|
bb9: tail call void @ext(i32 9, i32 16) br label %return
|
|
bb10: tail call void @ext(i32 10, i32 18) br label %return
|
|
bb11: tail call void @ext(i32 11, i32 20) br label %return
|
|
bb12: tail call void @ext(i32 12, i32 22) br label %return
|
|
|
|
return: ret i32 %b
|
|
}
|
|
|
|
define i32 @jt13(i32 %a, i32 %b) {
|
|
entry:
|
|
switch i32 %a, label %return [
|
|
i32 1, label %bb1
|
|
i32 2, label %bb2
|
|
i32 3, label %bb3
|
|
i32 4, label %bb4
|
|
i32 5, label %bb5
|
|
i32 6, label %bb6
|
|
i32 7, label %bb7
|
|
i32 8, label %bb8
|
|
i32 9, label %bb9
|
|
i32 10, label %bb10
|
|
i32 11, label %bb11
|
|
i32 12, label %bb12
|
|
i32 13, label %bb13
|
|
]
|
|
; CHECK-LABEL: function jt13:
|
|
; CHECK-NEXT: Jump Tables:
|
|
|
|
bb1: tail call void @ext(i32 1, i32 0) br label %return
|
|
bb2: tail call void @ext(i32 2, i32 2) br label %return
|
|
bb3: tail call void @ext(i32 3, i32 4) br label %return
|
|
bb4: tail call void @ext(i32 4, i32 6) br label %return
|
|
bb5: tail call void @ext(i32 5, i32 8) br label %return
|
|
bb6: tail call void @ext(i32 6, i32 10) br label %return
|
|
bb7: tail call void @ext(i32 7, i32 12) br label %return
|
|
bb8: tail call void @ext(i32 8, i32 14) br label %return
|
|
bb9: tail call void @ext(i32 9, i32 16) br label %return
|
|
bb10: tail call void @ext(i32 10, i32 18) br label %return
|
|
bb11: tail call void @ext(i32 11, i32 20) br label %return
|
|
bb12: tail call void @ext(i32 12, i32 22) br label %return
|
|
bb13: tail call void @ext(i32 13, i32 24) br label %return
|
|
|
|
return: ret i32 %b
|
|
}
|