Skip to content

Commit 3a20e6a

Browse files
committed
precompile noninlineable but compileable CodeInstances
1 parent 8617cc0 commit 3a20e6a

6 files changed

Lines changed: 26 additions & 16 deletions

File tree

base/boot.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -432,12 +432,12 @@ function CodeInstance(
432432
mi::MethodInstance, @nospecialize(rettype), @nospecialize(inferred_const),
433433
@nospecialize(inferred), const_flags::Int32, min_world::UInt, max_world::UInt,
434434
ipo_effects::UInt32, effects::UInt32, @nospecialize(argescapes#=::Union{Nothing,Vector{ArgEscapeInfo}}=#),
435-
relocatability::UInt8)
435+
relocatability::UInt8, precompile::Bool)
436436
return ccall(:jl_new_codeinst, Ref{CodeInstance},
437-
(Any, Any, Any, Any, Int32, UInt, UInt, UInt32, UInt32, Any, UInt8),
437+
(Any, Any, Any, Any, Int32, UInt, UInt, UInt32, UInt32, Any, UInt8, Bool),
438438
mi, rettype, inferred_const, inferred, const_flags, min_world, max_world,
439439
ipo_effects, effects, argescapes,
440-
relocatability)
440+
relocatability, precompile)
441441
end
442442
GlobalRef(m::Module, s::Symbol) = ccall(:jl_module_globalref, Ref{GlobalRef}, (Any, Any), m, s)
443443
Module(name::Symbol=:anonymous, std_imports::Bool=true, default_names::Bool=true) = ccall(:jl_f_new_module, Ref{Module}, (Any, Bool, Bool), name, std_imports, default_names)

base/compiler/typeinfer.jl

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,13 +325,23 @@ function CodeInstance(interp::AbstractInterpreter, result::InferenceResult,
325325
relocatability = isa(inferred_result, Vector{UInt8}) ? inferred_result[end] :
326326
inferred_result === nothing ? UInt8(1) : UInt8(0)
327327
# relocatability = isa(inferred_result, Vector{UInt8}) ? inferred_result[end] : UInt8(0)
328+
precompile = false
329+
if isa(interp, NativeInterpreter)
330+
if inferred_result !== nothing
331+
src = inferred_result::MaybeCompressed
332+
iinfo = InlineeInfo(result_type, result.linfo)
333+
if !is_inlineable(interp, src, iinfo)
334+
precompile = true
335+
end
336+
end
337+
end
328338
ipo_effects = effects = encode_effects(result.ipo_effects)
329339
return CodeInstance(result.linfo,
330340
widenconst(result_type), rettype_const, inferred_result,
331341
const_flags, first(valid_worlds), last(valid_worlds),
332342
# TODO: Actually do something with non-IPO effects
333-
encode_effects(result.ipo_effects), encode_effects(result.ipo_effects), result.argescapes,
334-
relocatability)
343+
ipo_effects, effects, result.argescapes,
344+
relocatability, precompile)
335345
end
336346

337347
function maybe_compress_codeinfo(interp::AbstractInterpreter, mi::MethodInstance, ci::CodeInfo)

src/gf.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ JL_DLLEXPORT jl_code_instance_t* jl_new_codeinst(
259259
jl_value_t *inferred_const, jl_value_t *inferred,
260260
int32_t const_flags, size_t min_world, size_t max_world,
261261
uint32_t ipo_effects, uint32_t effects, jl_value_t *argescapes,
262-
uint8_t relocatability);
262+
uint8_t relocatability, uint8_t precompile);
263263

264264
jl_datatype_t *jl_mk_builtin_func(jl_datatype_t *dt, const char *name, jl_fptr_args_t fptr) JL_GC_DISABLED
265265
{
@@ -294,7 +294,7 @@ jl_datatype_t *jl_mk_builtin_func(jl_datatype_t *dt, const char *name, jl_fptr_a
294294

295295
jl_code_instance_t *codeinst = jl_new_codeinst(mi,
296296
(jl_value_t*)jl_any_type, jl_nothing, jl_nothing,
297-
0, 1, ~(size_t)0, 0, 0, jl_nothing, 0);
297+
0, 1, ~(size_t)0, 0, 0, jl_nothing, 0, 0);
298298
jl_mi_cache_insert(mi, codeinst);
299299
jl_atomic_store_relaxed(&codeinst->specptr.fptr1, fptr);
300300
jl_atomic_store_relaxed(&codeinst->invoke, jl_fptr_args);
@@ -434,7 +434,7 @@ JL_DLLEXPORT jl_code_instance_t *jl_get_method_inferred(
434434
}
435435
codeinst = jl_new_codeinst(
436436
mi, rettype, NULL, NULL,
437-
0, min_world, max_world, 0, 0, jl_nothing, 0);
437+
0, min_world, max_world, 0, 0, jl_nothing, 0, 0);
438438
jl_mi_cache_insert(mi, codeinst);
439439
return codeinst;
440440
}
@@ -444,7 +444,7 @@ JL_DLLEXPORT jl_code_instance_t *jl_new_codeinst(
444444
jl_value_t *inferred_const, jl_value_t *inferred,
445445
int32_t const_flags, size_t min_world, size_t max_world,
446446
uint32_t ipo_effects, uint32_t effects, jl_value_t *argescapes,
447-
uint8_t relocatability
447+
uint8_t relocatability, uint8_t precompile
448448
/*, jl_array_t *edges, int absolute_max*/)
449449
{
450450
jl_task_t *ct = jl_current_task;
@@ -467,7 +467,7 @@ JL_DLLEXPORT jl_code_instance_t *jl_new_codeinst(
467467
jl_atomic_store_relaxed(&codeinst->invoke, jl_fptr_const_return);
468468
}
469469
jl_atomic_store_relaxed(&codeinst->specsigflags, 0);
470-
jl_atomic_store_relaxed(&codeinst->precompile, 0);
470+
jl_atomic_store_relaxed(&codeinst->precompile, precompile ? 1 : 0);
471471
jl_atomic_store_relaxed(&codeinst->next, NULL);
472472
codeinst->ipo_purity_bits = ipo_effects;
473473
jl_atomic_store_relaxed(&codeinst->purity_bits, effects);
@@ -2372,7 +2372,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
23722372
if (unspec && (unspec_invoke = jl_atomic_load_acquire(&unspec->invoke))) {
23732373
jl_code_instance_t *codeinst = jl_new_codeinst(mi,
23742374
(jl_value_t*)jl_any_type, NULL, NULL,
2375-
0, 1, ~(size_t)0, 0, 0, jl_nothing, 0);
2375+
0, 1, ~(size_t)0, 0, 0, jl_nothing, 0, 0);
23762376
void *unspec_fptr = jl_atomic_load_relaxed(&unspec->specptr.fptr);
23772377
if (unspec_fptr) {
23782378
// wait until invoke and specsigflags are properly set
@@ -2399,7 +2399,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
23992399
if (!jl_code_requires_compiler(src, 0)) {
24002400
jl_code_instance_t *codeinst = jl_new_codeinst(mi,
24012401
(jl_value_t*)jl_any_type, NULL, NULL,
2402-
0, 1, ~(size_t)0, 0, 0, jl_nothing, 0);
2402+
0, 1, ~(size_t)0, 0, 0, jl_nothing, 0, 0);
24032403
jl_atomic_store_release(&codeinst->invoke, jl_fptr_interpret_call);
24042404
jl_mi_cache_insert(mi, codeinst);
24052405
record_precompile_statement(mi);
@@ -2436,7 +2436,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
24362436
return ucache;
24372437
}
24382438
codeinst = jl_new_codeinst(mi, (jl_value_t*)jl_any_type, NULL, NULL,
2439-
0, 1, ~(size_t)0, 0, 0, jl_nothing, 0);
2439+
0, 1, ~(size_t)0, 0, 0, jl_nothing, 0, 0);
24402440
void *unspec_fptr = jl_atomic_load_relaxed(&ucache->specptr.fptr);
24412441
if (unspec_fptr) {
24422442
// wait until invoke and specsigflags are properly set

src/opaque_closure.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ jl_opaque_closure_t *jl_new_opaque_closure(jl_tupletype_t *argt, jl_value_t *rt_
110110
jl_method_t *jl_make_opaque_closure_method(jl_module_t *module, jl_value_t *name,
111111
int nargs, jl_value_t *functionloc, jl_code_info_t *ci, int isva);
112112

113-
JL_DLLEXPORT jl_code_instance_t* jl_new_codeinst(
113+
jl_code_instance_t* jl_new_codeinst(
114114
jl_method_instance_t *mi, jl_value_t *rettype,
115115
jl_value_t *inferred_const, jl_value_t *inferred,
116116
int32_t const_flags, size_t min_world, size_t max_world,

src/precompile_utils.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ static int precompile_enq_specialization_(jl_method_instance_t *mi, void *closur
187187
if (inferred &&
188188
inferred != jl_nothing &&
189189
jl_ir_flag_inferred((jl_array_t*)inferred) &&
190-
(jl_ir_inlining_cost((jl_array_t*)inferred) == UINT16_MAX)) {
190+
jl_atomic_load_relaxed(&codeinst->precompile)) {
191191
do_compile = 1;
192192
}
193193
else if (jl_atomic_load_relaxed(&codeinst->invoke) != NULL || jl_atomic_load_relaxed(&codeinst->precompile)) {

test/precompile.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1578,7 +1578,7 @@ precompile_test_harness("issue #46296") do load_path
15781578
15791579
mi = first(Base.specializations(first(methods(identity))))
15801580
ci = Core.CodeInstance(mi, Any, nothing, nothing, zero(Int32), typemin(UInt),
1581-
typemax(UInt), zero(UInt32), zero(UInt32), nothing, 0x00)
1581+
typemax(UInt), zero(UInt32), zero(UInt32), nothing, 0x00, false)
15821582
15831583
__init__() = @assert ci isa Core.CodeInstance
15841584

0 commit comments

Comments
 (0)