@@ -2021,6 +2021,25 @@ let extend1_signature base_signature (signature : checked_compilation_unit_signa
20212021
20222022 { Assembled. kinds; types; type_abbrevs; toplevel_macros }
20232023
2024+ let new_symbols_of_types ~(base_sig :checked_compilation_unit_signature ) new_types =
2025+ let symbs = TypingEnv. all_symbols new_types in
2026+ symbs |> List. filter_map (fun (symb ,m ) -> if TypingEnv. mem_symbol base_sig.types symb then None else Some symb),
2027+ symbs |> List. filter_map (fun (symb , { TypingEnv. indexing } ) -> match indexing with Index m -> Some (symb, m) | _ -> None )
2028+
2029+ let allocate_new_symbols state ~symbols ~new_defined_symbols =
2030+ (* THE MISTERY: allocating symbols following their declaration order makes the grundlagen job 30% faster (600M less memory):
2031+ time typchk wall mem
2032+ with: 14.75 0.53 16.69 2348.4M
2033+ wout: 19.61 0.56 21.72 2789.1M
2034+ *)
2035+ let new_defined_symbols =
2036+ if List. length new_defined_symbols > 2000 then
2037+ new_defined_symbols |> List. sort (fun s1 s2 -> compare (Symbol. get_loc s1).line (Symbol. get_loc s2).line)
2038+ else
2039+ new_defined_symbols in
2040+ List. fold_left (fun symbols s -> SymbolMap. allocate_global_symbol state symbols s |> fst)
2041+ symbols new_defined_symbols
2042+
20242043let extend1 flags (state , base ) unit =
20252044
20262045 let signature =
@@ -2033,25 +2052,9 @@ let extend1 flags (state, base) unit =
20332052
20342053 (* Format.eprintf "extend %a\n%!" (F.Map.pp (fun _ _ -> ())) types_indexing; *)
20352054
2036- let new_defined_symbols, new_indexable =
2037- let symbs = TypingEnv. all_symbols new_types in
2038- symbs |> List. filter_map (fun (symb ,m ) -> if TypingEnv. mem_symbol bsig.types symb then None else Some symb),
2039- symbs |> List. filter_map (fun (symb , { TypingEnv. indexing } ) -> match indexing with Index m -> Some (symb, m) | _ -> None ) in
2040-
2041- let symbols =
2042- (* THE MISTERY: allocating symbols following their declaration order makes the grundlagen job 30% faster (600M less memory):
2043- time typchk wall mem
2044- with: 14.75 0.53 16.69 2348.4M
2045- wout: 19.61 0.56 21.72 2789.1M
2046- *)
2047- let new_defined_symbols =
2048- if List. length new_defined_symbols > 2000 then
2049- new_defined_symbols |> List. sort (fun s1 s2 -> compare (Symbol. get_loc s1).line (Symbol. get_loc s2).line)
2050- else
2051- new_defined_symbols in
2052- List. fold_left (fun symbols s -> SymbolMap. allocate_global_symbol state symbols s |> fst)
2053- symbols new_defined_symbols in
2055+ let new_defined_symbols, new_indexable = new_symbols_of_types ~base_sig: bsig new_types in
20542056
2057+ let symbols = allocate_new_symbols state ~symbols ~new_defined_symbols in
20552058
20562059 let prolog_program, indexing = update_indexing state symbols prolog_program new_indexable indexing in
20572060 (* Format.eprintf "extended\n%!"; *)
@@ -2081,11 +2084,15 @@ let extend1 flags (state, base) unit =
20812084 let hash = hash_base base in
20822085 state, { base with hash }
20832086
2084- let extend flags state assembled u = extend1 flags (state, assembled) u
2085- let extend_signature state assembled u =
2086- let signature = extend1_signature assembled.Assembled. signature u in
2087- let base = { assembled with signature } in
2088- state, { base with hash = hash_base base }
2087+ let extend flags state assembled u = extend1 flags (state, assembled) u
2088+ let extend_signature state assembled u =
2089+ let signature = extend1_signature assembled.Assembled. signature u in
2090+ let base_sig = assembled.Assembled. signature in
2091+ let new_defined_symbols, new_indexable = new_symbols_of_types ~base_sig signature.types in
2092+ let symbols = allocate_new_symbols state ~symbols: assembled.symbols ~new_defined_symbols in
2093+ let prolog_program, indexing = update_indexing state symbols assembled.prolog_program new_indexable assembled.indexing in
2094+ let base = { assembled with symbols; prolog_program; indexing; signature } in
2095+ state, { base with hash = hash_base base }
20892096
20902097 let compile_query state { Assembled. symbols; builtins; signature = { types; type_abbrevs } } (needs_spilling ,t ) =
20912098 let (symbols, amap), t = spill_todbl ~builtins ~needs_spilling ~types ~type_abbrevs state symbols t in
0 commit comments