-
-
Notifications
You must be signed in to change notification settings - Fork 5.6k
/
Copy pathparams.jl
72 lines (66 loc) · 3.38 KB
/
params.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# This file is a part of Julia. License is MIT: https://julialang.org/license
struct Params
cache::Vector{InferenceResult}
world::UInt
global_cache::Bool
# optimization
inlining::Bool
ipo_constant_propagation::Bool
aggressive_constant_propagation::Bool
inline_cost_threshold::Int # number of CPU cycles beyond which it's not worth inlining
inline_nonleaf_penalty::Int # penalty for dynamic dispatch
inline_tupleret_bonus::Int # extra willingness for non-isbits tuple return types
# don't consider more than N methods. this trades off between
# compiler performance and generated code performance.
# typically, considering many methods means spending lots of time
# obtaining poor type information.
# It is important for N to be >= the number of methods in the error()
# function, so we can still know that error() is always Bottom.
MAX_METHODS::Int
# the maximum number of union-tuples to swap / expand
# before computing the set of matching methods
MAX_UNION_SPLITTING::Int
# the maximum number of union-tuples to swap / expand
# when inferring a call to _apply
MAX_APPLY_UNION_ENUM::Int
# parameters limiting large (tuple) types
TUPLE_COMPLEXITY_LIMIT_DEPTH::Int
# when attempting to inlining _apply, abort the optimization if the tuple
# contains more than this many elements
MAX_TUPLE_SPLAT::Int
# reasonable defaults
global function CustomParams(world::UInt,
;
inlining::Bool = inlining_enabled(),
inline_cost_threshold::Int = DEFAULT_PARAMS.inline_cost_threshold,
inline_nonleaf_penalty::Int = DEFAULT_PARAMS.inline_nonleaf_penalty,
inline_tupleret_bonus::Int = DEFAULT_PARAMS.inline_tupleret_bonus,
ipo_constant_propagation::Bool = true,
aggressive_constant_propagation::Bool = false,
max_methods::Int = DEFAULT_PARAMS.MAX_METHODS,
tupletype_depth::Int = DEFAULT_PARAMS.TUPLE_COMPLEXITY_LIMIT_DEPTH,
tuple_splat::Int = DEFAULT_PARAMS.MAX_TUPLE_SPLAT,
union_splitting::Int = DEFAULT_PARAMS.MAX_UNION_SPLITTING,
apply_union_enum::Int = DEFAULT_PARAMS.MAX_APPLY_UNION_ENUM)
return new(Vector{InferenceResult}(),
world, false,
inlining, ipo_constant_propagation, aggressive_constant_propagation,
inline_cost_threshold, inline_nonleaf_penalty, inline_tupleret_bonus,
max_methods, union_splitting, apply_union_enum, tupletype_depth,
tuple_splat)
end
function Params(world::UInt)
world == typemax(UInt) && (world = get_world_counter()) # workaround for bad callers
@assert world <= get_world_counter()
inlining = inlining_enabled()
return new(Vector{InferenceResult}(),
world, true,
#=inlining, ipo_constant_propagation, aggressive_constant_propagation, inline_cost_threshold, inline_nonleaf_penalty,=#
inlining, true, false, 100, 1000,
#=inline_tupleret_bonus, max_methods, union_splitting, apply_union_enum=#
400, 4, 4, 8,
#=tupletype_depth, tuple_splat=#
3, 32)
end
end
const DEFAULT_PARAMS = Params(UInt(0))