@@ -476,6 +476,8 @@ JL_DLLEXPORT jl_code_instance_t *jl_get_method_inferred(
476
476
return codeinst ;
477
477
}
478
478
479
+ static void record_precompile_statement (jl_method_instance_t * mi , double compilation_time , int is_const_return_abi );
480
+
479
481
JL_DLLEXPORT jl_code_instance_t * jl_new_codeinst (
480
482
jl_method_instance_t * mi , jl_value_t * rettype ,
481
483
jl_value_t * inferred_const , jl_value_t * inferred ,
@@ -501,6 +503,10 @@ JL_DLLEXPORT jl_code_instance_t *jl_new_codeinst(
501
503
jl_atomic_store_relaxed (& codeinst -> invoke , NULL );
502
504
if ((const_flags & 1 ) != 0 ) {
503
505
assert (const_flags & 2 );
506
+ if (jl_is_method (mi -> def .value ) && jl_isa_compileable_sig ((jl_tupletype_t * )mi -> specTypes , mi -> sparam_vals , mi -> def .method )) {
507
+ // This code was freshly-inferred, so let's emit a `precompile(...)` statement for it
508
+ record_precompile_statement (mi , 0.0 , 1 );
509
+ }
504
510
jl_atomic_store_relaxed (& codeinst -> invoke , jl_fptr_const_return );
505
511
}
506
512
jl_atomic_store_relaxed (& codeinst -> specsigflags , 0 );
@@ -2392,7 +2398,7 @@ JL_DLLEXPORT void jl_force_trace_compile_timing_disable(void)
2392
2398
jl_atomic_fetch_add (& jl_force_trace_compile_timing_enabled , -1 );
2393
2399
}
2394
2400
2395
- static void record_precompile_statement (jl_method_instance_t * mi , double compilation_time )
2401
+ static void record_precompile_statement (jl_method_instance_t * mi , double compilation_time , int is_const_return_abi )
2396
2402
{
2397
2403
static ios_t f_precompile ;
2398
2404
static JL_STREAM * s_precompile = NULL ;
@@ -2420,7 +2426,10 @@ static void record_precompile_statement(jl_method_instance_t *mi, double compila
2420
2426
jl_printf (s_precompile , "#= %6.1f =# " , compilation_time / 1e6 );
2421
2427
jl_printf (s_precompile , "precompile(" );
2422
2428
jl_static_show (s_precompile , mi -> specTypes );
2423
- jl_printf (s_precompile , ")\n" );
2429
+ if (is_const_return_abi )
2430
+ jl_printf (s_precompile , ") #= const-return =#\n" );
2431
+ else
2432
+ jl_printf (s_precompile , ")\n" );
2424
2433
if (s_precompile != JL_STDERR )
2425
2434
ios_flush (& f_precompile );
2426
2435
}
@@ -2566,7 +2575,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
2566
2575
codeinst -> rettype_const = unspec -> rettype_const ;
2567
2576
jl_atomic_store_release (& codeinst -> invoke , unspec_invoke );
2568
2577
jl_mi_cache_insert (mi , codeinst );
2569
- record_precompile_statement (mi , 0 );
2578
+ record_precompile_statement (mi , 0.0 , 0 );
2570
2579
return codeinst ;
2571
2580
}
2572
2581
}
@@ -2583,7 +2592,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
2583
2592
0 , 1 , ~(size_t )0 , 0 , 0 , jl_nothing , 0 );
2584
2593
jl_atomic_store_release (& codeinst -> invoke , jl_fptr_interpret_call );
2585
2594
jl_mi_cache_insert (mi , codeinst );
2586
- record_precompile_statement (mi , 0 );
2595
+ record_precompile_statement (mi , 0.0 , 0 );
2587
2596
return codeinst ;
2588
2597
}
2589
2598
if (compile_option == JL_OPTIONS_COMPILE_OFF ) {
@@ -2638,7 +2647,7 @@ jl_code_instance_t *jl_compile_method_internal(jl_method_instance_t *mi, size_t
2638
2647
jl_mi_cache_insert (mi , codeinst );
2639
2648
}
2640
2649
else if (did_compile ) {
2641
- record_precompile_statement (mi , compile_time );
2650
+ record_precompile_statement (mi , compile_time , 0 );
2642
2651
}
2643
2652
jl_atomic_store_relaxed (& codeinst -> precompile , 1 );
2644
2653
return codeinst ;
0 commit comments