@@ -9874,56 +9874,57 @@ void linkFunctionBody(Function &Dst, Function &Src)
98749874
98759875void  emit_always_inline (orc::ThreadSafeModule &result_m, jl_codegen_params_t  ¶ms) JL_NOTSAFEPOINT_LEAVE JL_NOTSAFEPOINT_ENTER
98769876{
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+                     }
99209921                }
99219922            }
99229923        }
9924+         params.temporary_roots  = nullptr ;
9925+         JL_GC_POP ();
9926+         jl_gc_unsafe_leave (ct->ptls , gc_state);
99239927    }
9924-     params.temporary_roots  = nullptr ;
9925-     JL_GC_POP ();
9926-     jl_gc_unsafe_leave (ct->ptls , gc_state);
99279928}
99289929
99299930//  --- initialization ---
0 commit comments