Caml1999I037ܠ-Flambda_utils0find_declaration@*Closure_id!t@@@@@@'Flambda5function_declarations@@@@@4function_declaration@@@@@@@@ $middle_end/flambda/flambda_utils.mliXTTYk@@)@@@9find_declaration_variable@(!t@@@@@@&5function_declarations@@@ @@!(Variable!t@@@"@@#@@$@&]'^6s@@NA@@2find_free_variable@2Var_within_closure!t@@@%@@&@M/set_of_closures@@@'@@('!t@@@)@@*@@+@KaLb@@sB@@.function_arity@f4function_declaration@@@,@@-#intA@@@.@@/@df88ef8p@@C@@>variables_bound_by_the_closure@!t@@@0@@1@5function_declarations@@@2@@3d#Set!t@@@4@@5@@6@p ? ?q d @@D@@-can_be_merged@!t@@@7@@8@!t@@@9@@:$boolE@@@;@@<@@=@u  u  F@@E@@@@?&stringQ@@@@@@A@w H Hw H ~@@F@@8make_closure_declaration/is_classic_mode.@@@B@@C"id!t@@@D@@E$body!t@@@F@@G¶ms$listK)Parameter!t@@@H@@@I@@J!t@@@K@@L@@M@@N@@O@ A f f F  @@3G@@5toplevel_substitution@#Map!t!t@@@P@@@Q@@R@9$expr@@@S@@T?$expr@@@U@@V@@W@7H  8K < M@@_H@@;toplevel_substitution_named@'#Map!t.!t@@@X@@@Y@@Z@e%named@@@[@@\k%named@@@]@@^@@_@cM O OdP  @@I@@$bind(bindings|@\!t@@@a@%named@@@`@@b@@@c@@d$body!t@@@e@@f!t@@@g@@h@@i@UIIX@@J@@)name_expr$name7Internal_variable_names!t@@@j@@k@%named@@@l@@m!t@@@n@@o@@p@Z]@@K@@2name_expr_from_var#var!t@@@q@@r@%named@@@s@@t!t@@@u@@v@@w@_b>M@@L@@2initialize_symbols@'program@@@x@@y@&Symbol!t@@@}@#Tag!t@@@|@ (!t@@@z@@@{@@~@@@@@@"dOO#f{@@JM@@0imported_symbols@='program@@@@@4#Set!t@@@@@@=h>h@@eN@@5needed_import_symbols@X'program@@@@@O#Set!t@@@@@@XjYj@@O@@?introduce_needed_import_symbols @s'program@@@@@y'program@@@@@@qlrlg@@P@@+root_symbol!@'program@@@@@!t@@@@@@niini@@Q@@6might_raise_static_exn"@%named@@@@@@0Static_exception!t@@@@@@@@@@@@@rr5@@R@@0make_closure_map#@'program@@@@@#Map!t2Set_of_closures_id!t@@@@@@@@@vx@@S@@4all_lifted_constants$@'program@@@@@@!t@@@@7constant_defining_value@@@@@@@@@@@|~@@#T@@;all_lifted_constants_as_map%@'program@@@@@ #Map!t$7constant_defining_value@@@@@@@@@99n@@EU@@ $all_lifted_constant_sets_of_closures&@8'program@@@@@i#Set!t@@@@@@8**9h@@`V@@ɠ+Stdlib__Sys0b'8=OIn.Stdlib__String0 w_OA4D"Q~~+Stdlib__Set0ܔ@Z8XWaa2+Stdlib__Seq0?72#[O.Stdlib__Result0p~ !ԥ//+Stdlib__Map0*4ɇ2.Stdlib__Domain0'Ϳo\0m.K.Stdlib__Digest0#z25I*.Stdlib__Buffer0,I[?z&Stdlib0t0VoS%{<F:0Static_exception0Jmyrqܒx-8ɞ%Shape0 M``ll6Set_of_closures_origin0!YA _XO 2Set_of_closures_id0LbO`ܩ&M*Projection02hS xj56)Primitive0dU=\I/}$Path0k.tbGmᠠ)Parsetree0v o[pY Y)Parameter0zk^f2my19+Outcometree0BuG^)= 9c 'Numbers0 q޷He0Mutable_variable0CQᷧ$$Misc0Bpg]?[q)Longident0wP q;ɡ(Location0nBɊOn?7~ؠ)Load_path0,j " nn7ݠ,Linkage_name0tԈK1G&Lambda0x_edT-uq7Internal_variable_names0TbgѹG+L,Identifiable0]/*N %Ident0>ЃzV)j⠠*Format_doc0uy@GmWUࠠ'Flambda0VJ͟#Env0S B2)Debuginfo0_ |PooGq*Data_types0v\3,Svh0Compilation_unit0Dl ]wN*Cmi_format0`M{?w}@.Closure_origin0!Havl5"_*Closure_id0 (?$/Closure_element0ǔf#M2Clambda_primitives0|& %ZIǝz0CamlinternalLazy0zY# #4#-8CamlinternalFormatBasics0|.e1R$|o5Build_path_prefix_map0DGl}%Y5Lhi(Asttypes0eT$BbRM dc/Allocated_const0/vVǟx@@@Caml1999T037\V.C-Flambda_utils-ocaml.warning $middle_end/flambda/flambda_utils.mliQQ@2+a-4-9-30-40-41-42 QQ@@QQ@@@@@@QQ@3@@@@@@#intA;@@#intA@@@@@&_none_@@A@A@$charB;@@$charA@@@@@ @A@&stringQ;@@&stringA@@@@@@@@%bytesC;@@%bytesA@@@@@@@@%floatD;@@%floatA@@@@@@@@$boolE;@@%falsec@@%@$trued@@+@@@A@@@@@,@A@$unitF;@@"()e@@6@@@A@@@@@7@A@ #exnG;@@@A@@@@@;@@@#effH;@@O@A@A@@@@@@D@@@,continuationI;@@Q@@P@B,continuationA@nY@@@@@@T@@@%arrayJ;@@R@A%arrayA@@@@@@_@@@ $listK;@@S@A"[]f@@l@"::g@@@T@@y@ @@A@Y@@@@@|@@@&optionL;@@V@A$Noneh@@@$Somei@@@@@A@Y@@@@@@@@)nativeintM;@@)nativeintA@@@@@@@@%int32N;@@%int32A@@@@@@@@%int64O;@@%int64A@@@@@@@@&lazy_tP;@@X@A&lazy_tA@Y@@@@@@@@ 5extension_constructorR;@@5extension_constructorA@@@@@@@@*floatarrayS;@@*floatarrayA@@@@@@@@&iarrayT;@@Y@A&iarrayA@Y@@@@@@@@ *atomic_locU;@@Z@A*atomic_locA@@@@@@@@@ .Assert_failure`#@@@@@J@@@@@@@@[@@A頰=ocaml.warn_on_literal_pattern@@0Division_by_zero]#@@@A󠰠  @+End_of_file\#$@@@A@'FailureY#,@'@@A@0Invalid_argumentX#5@0@@A $#@-Match_failureV#>@@=@9@;@@a@@A5!4!@)Not_foundZ#O@@@A&=)<)@-Out_of_memoryW#W@@@A.E1D1@.Stack_overflow^#_@@@A6M9L9@.Sys_blocked_io_#g@@@A>UATA@)Sys_error[#o@j@@AG^J]J@:Undefined_recursive_modulea#x@@w@s@u@@h@@AXo[n[@:Continuation_already_takenb#@@@A`wcvc@&Stdlib@A@*ocaml.textn : Utility functions for the Flambda intermediate language. SS@@@@@@2 Access functions UU@@@@@@0find_declarationhXTXXTh@б@г*Closure_id!t*Closure_idYkmYkw@ YkxYky@@@@@@ٰ @@б@г'Flambda5function_declarations'FlambdaYk}Yk@ YkYk@@@@@@  @@г4function_declaration'FlambdaYkYk@ YkYk@@@@@@   @@@@@ @@ & @@@=@@  @@ E@@@,XTT@)ocaml.doc𐠠 G [find_declaration f decl] raises [Not_found] if [f] is not in [decl]. ;W#int~f8mf8p@@ @@@o0@@@@@p@@q5 @@@f88 @@C@@@@;>variables_bound_by_the_closureǠp ? Cp ? a@б@г!t*Closure_idq d fq d p@ q d qq d r@@@@@@r3@]X(@A @@б@г5function_declarations'Flambdaq d vq d }@ q d ~q d @@@@@@s @@гE#Set!t(Variableq d q d @ q d q d @@q d q d @ @@@@@ 9@@@'@@@@>/ @@@F@@ @@CN@@@p ? ?@ɐ  Variables "bound by a closure" are those variables free in the corresponding function's body that are neither: - bound as parameters of that function; nor - bound by the [let] binding that introduces the function declaration(s). In particular, if [f], [g] and [h] are being introduced by a simultaneous, possibly mutually-recursive [let] binding then none of [f], [g] or [h] are bound in any of the closures for [f], [g] and [h]. hrro < >@@@@@@@D@@#@Ȑ@@@@@@b-can_be_mergedȠu  u  %@б@г+!t'Flambda(u  ()u  /@ ,u  0-u  1@@@@@@3@A@A @@б@гE!t'FlambdaBu  5Cu  <@ Fu  =Gu  >@@@@@@ @@г$boolTu  BUu  F@@ @@@'@@@@@@@, @@@4@@ @@1<@@@fu  @: g If [can_be_merged f1 f2] is [true], it is safe to merge switch branches containing [f1] and [f2]. ss  tt  @@@@@@@E@@"@J9@@@@@@P[?[@ B[C[@@@@@@321122222@E@A @@б@г[%named'FlambdaX\Y\@ \\]\@@@@@@ @@гq!t'Flambdan]o]@ r]s]@@@@@@0 @@@@@@@5& @@Q=@@ @@:[@@@Z@@K@@@@A2name_expr_from_varf__@б#varг!t(Variable``'@ `(`)@@@@@@3@e*@A @@б@г%named'Flambdaa*0a*7@ a*8a*=@@@@@@ @@г!t'Flambdab>Db>K@ b>Lb>M@@@@@@0 @@@@@@@5& @@O=@@ @@:`@@@_@@L@@@@A2initialize_symbolsdOSdOe@б@г'program'Flambdaefkefr@ efs efz@@@@@@3@c(@A @@гs$listf{f{@В@г&Symbol!t&Symbol,f{-f{@ 0f{1f{@@@@@@D( @@@г#Tag!t#TagFf{Gf{@ Jf{Kf{@@@@@@B @@@г$listZf{[f{@гk!t'Flambdahf{if{@ lf{mf{@@@@@@d @@@ @@@i@@@@I@1@ @@rU&@@@p @@@wf{n@@@@@ @@}s@@@dOOv@@M@@x@@0imported_symbolshh@б@г'program'Flambdahh@ hh@@@@@@3@(@A @@г#Set!t&Symbolhh@ hh@@hh@ @@@@@<!@@@)@@=@@>&1 @@@h@@N@@@@,5needed_import_symbolsjj@б@г'program'Flambdajj@ jj @@@@@@?3@Nl(@A @@г#Set!t&Symbol j j@  j j@@ j j@ @@@@@@!@@@)@@A@@B&1 @@@ (j@@ 4O@@@@,?introduce_needed_import_symbols 3l# 4lB@б@гE'program'Flambda BlE ClL@  FlM GlT@@@@@@C3 6 5 5 6 6 6 6 6@Nl(@A @@г]'program'Flambda ZlX [l_@  ^l` _lg@@@@@@D @@@ @@E@@F( @@@ ll@@ xP@@@@#+root_symbol wnim xnix@б@г'program'Flambda ni{ ni@  ni ni@@@@@@G3 z y y z z z z z@Ec(@A @@гt!t&Symbol ni ni@  ni ni@@@@@@H @@@ @@I@@J( @@@ nii@@ Q@@@@#6might_raise_static_exnȠ r r@б@г%named'Flambda r  r@  r r@@@@@@K3        @Ec(@A @@б@г0Static_exception!t0Static_exception r r+@  r, r-@@@@@@ @@г $bool r1 r5@@ @@@)@@@@@@@. @@@6@@ @@3>@@@ r@ސ O Returns [true] iff the given term might raise the given static exception.  p q@@@@@@@ $R@@"@ ݐ@@@@@@R0make_closure_map .v /v@б@г@'program'Flambda =w >w@  Aw Bw@@@@@@3 1 0 0 1 1 1 1 1@tA@A @@гs#Map!t*Closure_id Yx Zx@  ]x ^x@@ bx cx@ @г2Set_of_closures_id!t2Set_of_closures_id sx tx@  wx xx@@@@@@96 @@@4@@@;; @@@C@@< @@=@K%@@@ v(@^ w Creates a map from closure IDs to set_of_closure IDs by iterating over all sets of closures in the given program.  t77 u@@@@@@@ S@@8@n ]@@@@@@_4all_lifted_constants | |@б@г'program'Flambda } }@  } }@@@@@@>3        @A@A @@г ,$list ~ ~@В@г!t&Symbol ~ ~@  ~ ~@@@@@@?& @@@г7constant_defining_value'Flambda ~ ~@  ~ ~@@@@@@@> @@@@ @ @@AE* @@@C @@@CJ ~A@@@S@@D @@EP[F@@@ |I@ s The definitions of all constants that have been lifted out to [Let_symbol] or [Let_rec_symbol] constructions.  'z   ({Y@@@@@@@ 4T@@Y@ 퐠@@@@@@o;all_lifted_constants_as_mapL >9= ?9X@б@г P'program'Flambda MY^ NYe@  QYf RYm@@@@@@F3 A @ @ A A A A A@A@A @@г<#Map!t&Symbol in jn@  mn nn@@ rn sn@ @г 7constant_defining_value'Flambda ns nz@  n{ n@@@@@@#{4 @@@2@@@#}9@@@A@@#~ @@#>I#@@@ 99&@ l J Like [all_lifted_constant_symbols], but returns a map instead of a list.   8@@@@@@@ U@@6@ | k@@@@@@] $all_lifted_constant_sets_of_closures~ *. *R@б@г 'program'Flambda SX S_@  S` Sg@@@@@@#3        @A@A @@гs#Set!t2Set_of_closures_id hm h@  h h@@ h h@ @@@@@&!@@@)@@&@@&&1 @@@ **@ Ґ The identifiers of all constant sets of closures that have been lifted out to [Let_symbol] or [Let_rec_symbol] constructions.   )@@@@@@@ V@@@  ѐ@@@@@@EI#@@@ 5tt&@@ AY@@(@@D *substitute_read_symbol_field_for_variables @ A@б@г #Map!t(Variable S T@  W X@@ \ ]@ @В@гE!t&Symbol o p@  s t@@@@@@,3 c b b c c c c c@H@A @@@г ࠐ$list  @г O#int  @@ @@@,@@@@@@,  @@@@(@ @@,'2@@@] @@@-, J@@б@г !t'Flambda  @   @@@@@@-E @@г !t'Flambda  @   @@@@@@-[ @@@@@-@@-`& @@@=@@- @@-e9@@@ @@ Z@@@@k-Switch_storerA .5 .B@ \@@Б(mk_store IO IW@б@г $unitIZI^@@ @@@-3        @/@A@@г&Switch't_store&SwitchItIz@  I{!I@@г 2!t'Flambda/Ic0Ij@ 3Ik4Il@@@@@@-3- @@г Р$unitBInCIr@@ @@@-4;@@@9@@@-7ANIb.@@@J@@-8 @@-9GM3@@@VIK6@@b[@@8@@M@c@@3EDDEEEEE@Pe @A3HGGHHHHH@R@A`.Ea@@ 5$ + For the compilation of switch statements. op-@@@@@@@r..@@G& @@г X#Map!t(Variable@ @@@ @г t#Set!t(Variable @   @@@ @@@@@-?@@@;@@@-A'@@wI@@-B @@-C"-@@@@@-D @@-E2@@@*5@  Within a set of function declarations there is a set of function bodies, each of which may (or may not) reference one of the other functions in the same set. Initially such intra-set references are by [Var]s (known as "fun_var"s) but if the function is lifted by [Lift_constants] then the references will be translated to [Symbol]s. This means that optimization passes that need to identify whether a given "fun_var" (i.e. a key in the [funs] map in a value of type [function_declarations]) is used in one of the function bodies need to examine the [free_symbols] as well as the [free_variables] members of [function_declarations]. This function makes that process easier by computing all used "fun_var"s in the bodies of the given set of function declarations, including the cases where the references are [Symbol]s. The returned value is a map from "fun_var"s to the "fun_var"s (if any) used in the body of the function associated with that "fun_var". 78~@@@@@@@D]@@E@ @@@@@@ closures_required_by_entry_pointNO@б+entry_pointг |!t*Closure_id_`@ cd@@@@@@-F3SRRSSSSS@C@A @@б.closure_symbolб@г !t*Closure_id}~@ @@@@@@-G @@гi!t&Symbol@ @@@@@@-H4 @@@@@-I@@-J9& @@б@г 5function_declarations'Flambda @ #@@@@@@-KQ @@г 6#Set!t(Variable$)$1@ $2$5@@$6$7@ @@@@@-Lp@@@'@@-M@@-Nu/ @@sE@@-O @@-Pz@@@@-Q @@-R@@@@ q Computes the set of closure_id in the set of closures that are required used (transitively) the entry_point [@@@@@@@^@@*@ @@@@@@8all_functions_parameters9=9U@б@г#5function_declarations'Flambda 9X!9_@ $9`%9u@@@@@@-S3@A@A @@г #Set!t(Variable<9y=9@ @9A9@@E9F9@ @@@@@-T!@@@)@@-U@@-V&1 @@@S99@@__@@@@,0all_free_symbols^_@б@гp5function_declarations'Flambdamn@ qr@@@@@@-W3a``aaaaa@Nl(@A @@г\#Set!t&Symbol@ @@@ @@@@@-X!@@@)@@-Y@@-Z&1 @@@@@`@@@@,-contains_stub@б@г5function_declarations'Flambda@ @@@@@@-[3@Nl(@A @@гm$bool@@ @@@-\@@@@@-]@@-^ @@@ @@a@@@@1clean_projections@б/which_variablesгg#Map!t(Variable@ @@@ @г.specialised_to'Flambda@ @@@@@@-_3@ZxF@A @@@4 @@@-a @@г#Map!t(Variable45@ 89!@@=">#@ @гO.specialised_to'FlambdaLM@ PQ@@@@@@-b9 @@@2@@@-d>@@t@@@-e @@-fCa$@@@d'@@pb@@)@@J3projection_to_namedo%)p%<@б@г*Projection!t*Projection%?%I@ %J%K@@@@@@.53tssttttt@n*@A @@г%named'Flambda%O%V@ %W%\@@@@@@.6 @@@ @@.7@@.8( @@@%%@@c@@@@#A+6specialised_to_same_asB^c^y@@;@@/Not_specialised@@|~|@@e@:Specialised_and_aliased_toD#Set!t@@@.9@@@@f@@@A@@@@@^^@@@@d@@#|@@@@ @#@@г(Variable@&@@*(@ )@@33@tWM;@@@A@@@@@,@@@*@A/@@@@1@@A@-@@3@@A.1@ +parameters_specialised_to_the_same_variable  !6!: !6!e@б.function_declsг 5function_declarations'Flambda!f!z!f!@ !!f!"!f!@@@@@@63@+wq@A @@б0specialised_argsг#Map!t(Variable=!!>!!@ A!!B!!@@F!!G!!@ @гX.specialised_to'FlambdaU!!V!!@ Y!!Z!!@@@@@@68 @@@2@@@6=@@г#Map!t(Variablet!!u!!@ x!!y!"@@}!"~!"@ @г㠐$list!!!!@гܠ6specialised_to_same_as!!!!@@ @@@6p@@@@@@6u @@@8@@@6z$@@xF@@6 @@6!!*@@@@6 @@6!f!k0@@@!6!63@ n For each parameter in a given set of function declarations and the usual specialised-args mapping, determine which other parameters are specialised to the same variable as that parameter. The result is presented as a map from [fun_vars] to lists, corresponding componentwise to the usual [params] list in the corresponding function declaration. !"!5@@@@@@@g@@C@@@@@@@@@(@@{K@D@t@T"@ u@ n @  u@ n @  `@ Y @  \@ U @  @  @ } B@ ;@l@L@b@B@@I@)@#@@j@@@@@o@h6@/@k@c]A@i@@3@k@A@ H************************************************************************A@@A@L@ H #BMM$BM@ H OCaml )C*C@ H /D0D3@ H Pierre Chambart, OCamlPro 5E446E4@ H Mark Shinwell and Leo White, Jane Street Europe ;F10/.-,+*)('&%$#"! @@0M Ź 6%#Hb3@@@/Allocated_const0/vVǟx(Asttypes0eT$BbRM dc5Build_path_prefix_map0DGl}%Y5Lhi8CamlinternalFormatBasics0|.e1R$|o0CamlinternalLazy0zY# #4#-2Clambda_primitives0|& %ZIǝz/Closure_element0ǔf#M`0 (?$.Closure_origin0!Havl5"_*Cmi_format0`M{?w}@0Compilation_unit0Dl ]wN*Data_types0v\3,Svh)Debuginfo0_ |PooGq#Env0S B2h0VJ͟s0J/驨Ӆi$*Format_doc0uy@GmWUࠠ%Ident0>ЃzV)j⠠,Identifiable0]/*N 7Internal_variable_names0TbgѹG+L&Lambda0x_edT-uq,Linkage_name0tԈK1G)Load_path0,j " nn7ݠ(Location0nBɊOn?7~ؠ)Longident0wP q;ɡ$Misc0Bpg]?[q0Mutable_variable0CQᷧ$'Numbers0 q޷He+Outcometree0BuG^)= 9c )Parameter0zk^f2my19)Parsetree0v o[pY Y$Path0k.tbGmᠠ)Primitive0dU=\I/}*Projection02hS xj562Set_of_closures_id0LbO`ܩ&M6Set_of_closures_origin0!YA _XO %Shape0 M``ll0Static_exception0Jmyrqܒx-8ɞ&Stdlib0t0VoS%{<F:.Stdlib__Buffer0,I[?z.Stdlib__Digest0#z25I*.Stdlib__Domain0'Ϳo\0m.K.Stdlib__Either0HD ?|>.Stdlib__Format00FClW/Stdlib__Hashtbl0(L%bԠ-Stdlib__Int640q=cT?Q1ˠ,Stdlib__Lazy0$1mlࠠ.Stdlib__Lexing0^m|e+Stdlib__Map0*4ɇ2ɠ%Subst0=aqT/!p+0,9QKu @&Symbol03E?Y7(#Tag0&b rٍ.Type_immediacy00$ jbv\"k&%Types0"|Vȷ`X )Unit_info0'T Χ@aR2Var_within_closure0``ݗXFR⠠(Variable0?l猵eY(Warnings0Ef{&@0J/驨Ӆi$Ah ; )@/W@ː@6@@nz. ǐ @@@  T@@@@  f@@-@/@Đ !  "@   o@  ^@@@(@fǰR@L@ 5 u@@  @q@CȰ@  @E  @  @@P@@