@@ -9874,56 +9874,57 @@ void linkFunctionBody(Function &Dst, Function &Src)
9874
9874
9875
9875
void emit_always_inline(orc::ThreadSafeModule &result_m, jl_codegen_params_t ¶ms) JL_NOTSAFEPOINT_LEAVE JL_NOTSAFEPOINT_ENTER
9876
9876
{
9877
- jl_workqueue_t &edges = params.workqueue;
9878
- bool always_inline = false;
9879
- for (auto &it : edges) {
9880
- if (it.second.private_linkage)
9881
- always_inline = true;
9882
- }
9883
- if (!always_inline)
9884
- return;
9885
- jl_task_t *ct = jl_current_task;
9886
- int8_t gc_state = jl_gc_unsafe_enter(ct->ptls); // codegen may contain safepoints (such as jl_subtype calls)
9887
- jl_code_info_t *src = nullptr;
9888
- params.safepoint_on_entry = false;
9889
- params.temporary_roots = jl_alloc_array_1d(jl_array_any_type, 0);
9890
- JL_GC_PUSH2(¶ms.temporary_roots, &src);
9891
- for (auto &it : edges) {
9892
- jl_code_instance_t *codeinst = it.first;
9893
- auto &proto = it.second;
9894
- if (!proto.private_linkage)
9895
- continue;
9896
- if (proto.decl->isDeclaration()) {
9897
- src = (jl_code_info_t*)jl_atomic_load_relaxed(&codeinst->inferred);
9898
- jl_method_instance_t *mi = jl_get_ci_mi(codeinst);
9899
- jl_method_t *def = mi->def.method;
9900
- if (src && (jl_value_t*)src != jl_nothing && jl_is_method(def) && jl_ir_inlining_cost((jl_value_t*)src) < UINT16_MAX)
9901
- src = jl_uncompress_ir(def, codeinst, (jl_value_t*)src);
9902
- if (src && jl_is_code_info(src) && jl_ir_inlining_cost((jl_value_t*)src) < UINT16_MAX) {
9903
- jl_llvm_functions_t decls = jl_emit_codeinst(result_m, codeinst, src, params); // contains safepoints
9904
- if (!result_m)
9905
- break;
9906
- // TODO: jl_optimize_roots(params, mi, *result_m.getModuleUnlocked()); // contains safepoints
9907
- Module &M = *result_m.getModuleUnlocked();
9908
- if (decls.functionObject != "jl_fptr_args" &&
9909
- decls.functionObject != "jl_fptr_sparam" &&
9910
- decls.functionObject != "jl_f_opaque_closure_call") {
9911
- Function *F = M.getFunction(decls.functionObject);
9912
- F->eraseFromParent();
9913
- }
9914
- if (!decls.specFunctionObject.empty()) {
9915
- Function *specF = M.getFunction(decls.specFunctionObject);
9916
- linkFunctionBody(*proto.decl, *specF);
9917
- proto.decl->addFnAttr(Attribute::InlineHint);
9918
- proto.decl->setLinkage(proto.external_linkage ? GlobalValue::AvailableExternallyLinkage : GlobalValue::PrivateLinkage);
9919
- specF->eraseFromParent();
9877
+ while (true) {
9878
+ SmallVector<jl_workqueue_t::value_type> always_inline;
9879
+ for (auto &it : params.workqueue) {
9880
+ if (it.second.private_linkage && it.second.decl->isDeclaration())
9881
+ always_inline.push_back(it);
9882
+ it.second.private_linkage = false;
9883
+ }
9884
+ if (always_inline.empty())
9885
+ return;
9886
+ jl_task_t *ct = jl_current_task;
9887
+ int8_t gc_state = jl_gc_unsafe_enter(ct->ptls); // codegen may contain safepoints (such as jl_subtype calls)
9888
+ jl_code_info_t *src = nullptr;
9889
+ params.safepoint_on_entry = false;
9890
+ params.temporary_roots = jl_alloc_array_1d(jl_array_any_type, 0);
9891
+ JL_GC_PUSH2(¶ms.temporary_roots, &src);
9892
+ for (auto &it : always_inline) {
9893
+ jl_code_instance_t *codeinst = it.first;
9894
+ auto &proto = it.second;
9895
+ Function *decl = proto.decl;
9896
+ if (decl->isDeclaration()) {
9897
+ src = (jl_code_info_t*)jl_atomic_load_relaxed(&codeinst->inferred);
9898
+ jl_method_instance_t *mi = jl_get_ci_mi(codeinst);
9899
+ jl_method_t *def = mi->def.method;
9900
+ if (src && (jl_value_t*)src != jl_nothing && jl_is_method(def) && jl_ir_inlining_cost((jl_value_t*)src) < UINT16_MAX)
9901
+ src = jl_uncompress_ir(def, codeinst, (jl_value_t*)src);
9902
+ if (src && jl_is_code_info(src) && jl_ir_inlining_cost((jl_value_t*)src) < UINT16_MAX) {
9903
+ jl_llvm_functions_t decls = jl_emit_codeinst(result_m, codeinst, src, params); // contains safepoints
9904
+ if (!result_m)
9905
+ break;
9906
+ // TODO: jl_optimize_roots(params, mi, *result_m.getModuleUnlocked()); // contains safepoints
9907
+ Module &M = *result_m.getModuleUnlocked();
9908
+ if (decls.functionObject != "jl_fptr_args" &&
9909
+ decls.functionObject != "jl_fptr_sparam" &&
9910
+ decls.functionObject != "jl_f_opaque_closure_call") {
9911
+ Function *F = M.getFunction(decls.functionObject);
9912
+ F->eraseFromParent();
9913
+ }
9914
+ if (!decls.specFunctionObject.empty()) {
9915
+ Function *specF = M.getFunction(decls.specFunctionObject);
9916
+ linkFunctionBody(*decl, *specF);
9917
+ decl->addFnAttr(Attribute::InlineHint);
9918
+ decl->setLinkage(proto.external_linkage ? GlobalValue::AvailableExternallyLinkage : GlobalValue::PrivateLinkage);
9919
+ specF->eraseFromParent();
9920
+ }
9920
9921
}
9921
9922
}
9922
9923
}
9924
+ params.temporary_roots = nullptr;
9925
+ JL_GC_POP();
9926
+ jl_gc_unsafe_leave(ct->ptls, gc_state);
9923
9927
}
9924
- params.temporary_roots = nullptr;
9925
- JL_GC_POP();
9926
- jl_gc_unsafe_leave(ct->ptls, gc_state);
9927
9928
}
9928
9929
9929
9930
// --- initialization ---
0 commit comments