Caml1999I037tVq'Flambda)call_kind 9;@@(Indirect@@>middle_end/flambda/flambda.mliWY[WYe@@A@&Direct*Closure_id!t@@@@@XfhXf@@#B@@@A@@@@@VHH@@@@&@@A@%const :;@@#Int(#intA@@@!@@,]#%-]#1@@;@@@A*Projection/project_closure@@@1@@@@8B 5 59B 5 f@@@@HX@A@;move_within_set_of_closures ?;@@@A;move_within_set_of_closures@@@2@@@@IC g gJC g @@@@YY@A@+project_var @;@@@A$+project_var@@@3@@@@ZD  [D  @@@@jZ@A@.specialised_to A;@@#var@@!t@@@6nK  oK  @@~\@*projection@@&optionLL!t@@@4@@@5M  M  .@@]@@@A@@@@@J  T  @@@@[@A@!t B;@@#VarJ!t@@@X@@]AC]AV@@i@#Let(let_expr D@@@W@@^WY^Wj@@j@+Let_mutable+let_mutable E@@@V@@_km_k@@k@%Apply@@@U@@``@@l@$Send@@@T@@aa@@m@&Assign8@@@S@@bb@@n@,If_then_else!t@@@Rn@@@Q@@@P@@cc@@o@&Switch!t@@@O&switch I@@@N@@dd @@'p@-String_switch!t@@@Mˠ@&stringQ@@@J@@@@@I@@K@@@LǠI@@@G@@@H@@Ee Fe J@@Uq@,Static_raise0Static_exception!t@@@F!t@@@D@@@E@@cgdg@@sr@,Static_catch!t@@@C@/!t@@@@@*value_kind@@@?@@A@@@B@@@>@@@=@@hi/@@s@(Try_with@@@<T!t@@@;@@@:@@j02j0R@@t@%While@@@9@@@8@@kSUkSe@@u@#For(for_loop J@@@7@@lfhlfy@@v@2Proved_unreachable @@mz|mz@@w@@@A@@@@@\88@@@@^@A@%named C;@@&Symbol &Symbol!t@@@g@@qq@@x@%Const@@@f@@rr@@y@/Allocated_const/Allocated_const!t@@@e@@ss<@@ z@,Read_mutable"d!t@@@d@@ t=?!t=c@@0{@1Read_symbol_field#B!t@@@c @@@b@@5udf6ud@@E|@/Set_of_closures$/set_of_closures F@@@a@@EDFFDj@@U}@/Project_closure%'@@@`@@SkmTk@@c~@;Move_within_set_of_closures&"@@@_@@ab@@q@+Project_var'@@@^@@op@@@@$Prim(2Clambda_primitives)primitive@@@]%9!t@@@[@@@\!t@@@Z@@8@@C@$Expr;@@@Y@@9;9F@@D@@@A@@@@@p@@@@_@B@;@@#var<@@c!t@@@l!#!4@@E@-defining_expr=@@@@@k575M@@F@$body>@@@@@jNPNY@@G@:free_vars_of_defining_expro@@#Set!t@@@i @@H@1free_vars_of_bodyp@@#Set!t@@@h[][@@I@@@@@@@@@@@@@`@B@=;@@#varq@@G!t@@@p    @@J@-initial_valuer@@!t@@@o  !  <@@!K@-contents_kinds@@*value_kind@@@n = ?  = a@@/L@$bodyt@@/@@@m* b d+ b m@@:M@@@A@@@@@./ n o@@@@>a@B@;@@.function_declsu@@5function_declarations G@@@w@$$A$$@@PN@)free_vars@@#Map!t@@@u@@@vU''V'';@@eO@0specialised_args@@#Map!t@@@s@@@ti(6(8j(6(i@@yP@6direct_call_surrogates@@%#Map!t,!t@@@q@@@r2223@@Q@@@@@@@@@$w$w44@@@@b@B@M;@@/is_classic_mode@@$boolE@@@|4444@@R@2set_of_closures_id@@2Set_of_closures_id!t@@@{5254525^@@S@6set_of_closures_origin@@6Set_of_closures_origin!t@@@z"66"666@@T@$funs@@r#Map!t4function_declaration H@@@x@@@y'7(7*'7(7U@@U@@@@@@@@@44*77@@@@c@B@;@@.closure_origin@@.Closure_origin!t@@@-88-884@@V@¶ms@@)Parameter!t@@@@@@.8587.858Q@@ W@$body@@ @@@/8R8T/8R8]@@X@.free_variables@@#Set!t@@@288288@@%Y@,free_symbols @@6#Set!t@@@%699&699@@5Z@$stub!@@@@@1:::2:::@@A[@#dbg"@@!t@@@??;;@?;;@@O\@&inline#@@0inline_attribute@@@MA<<NA<<@@@]]@*specialise$@@4specialise_attribute@@@[C@@b@)numblocksi@@.#Int#Set!t@@@O>> O>>>@@c@&blocksj@@h@@@@@@@@@@@@@P>`>bP>`>z@@d@*failactionk@@i@@@@@@Q>>Q>>@@e@@@A@@@@@L==R>>@@@@e@B@(;@@)bound_varV@@!t@@@V??V??1@@ f@*from_valueW@@!t@@@ W?2?4 W?2?L@@g@(to_valueX@@!t@@@X?M?OX?M?e@@)h@)directionh@@(Asttypes.direction_flag@@@)Y?f?h*Y?f?@@9i@$bodyi@@9@@@4Z??5Z??@@Dj@@@A@@@@@8U??9[??@@@@Hf@B@7constant_defining_value K;@@/Allocated_constj@!t@@@@@Nb@@Ob@A@@^k@%Blockk#Tag!t@@@ #constant_defining_value_block_field L@@@@@@@@leAAmeAA@@|l@/Set_of_closuresz7@@@@@yhBVBXzhBVB|@@m@/Project_closure{!t@@@!t@@@@@kBBkBC@@n@@@A@@@@@a@@@@@@g@B@1;@@&Symbol|!t@@@@@pCCpCC@@o@%Const}@@@@@qCCqCC@@p@@@A@@@@@oCC@@@@h@B@Ӡ7Constant_defining_value M@!t };@@@A@@@@@@@tDD+tDDK@@@@q@A@Ӡ!T ~@!t ;@@@A@@@@@@@6utils/identifiable.mlii@Xi@b@@@@,Identifiabler@A@%equal @@@@@@@@$boolE@@@@@@@@[HR[Hu@@/Stdlib__Hashtbl`@@$hash @@@@#intA@@@@@@@a@@'compare @,@@@@1@@@#intA@@@@@@@@G\vH\v@@+Stdlib__MapA@@&output @&Stdlib+out_channel@@@@P@@@$unitF@@@@@@@@f^g^@@eC@@%print @&Format)formatter@@@@m@@@@@@@@@@@__@@D@@@@i@B@s@@@ @!t@@@@@@@ @@@ @@ @@ @jcmjc@@@ @@@@ @@@@@@@|@{ @%$@@@@+*@@@|@@@@@@@@#@v@t @sp@@@@>=@@@p@@@@@@@@6@j@i @hg@@@@RQ@@@g@@@@@@@@J@c@Ӡ#Set @#elt ;@@@Af!t@@@@@@@ll@@@@K@A@!t ;@@@A#Set$Make{!t@@@@@@@@@@ L@A@%empty @@@@@+Stdlib__SetE@@#add @5@@@@@@@@@@@@@@@4@F@@)singleton @@@@$@@@@@@B@#G@@&remove @"@@@ @4@@@ 7@@@ @@ @@ @U@6H@@%union @B@@@@G@@@J@@@@@@@@h@II@@%inter @U@@@@Z@@@]@@@@@@@@{@\J@@(disjoint @h@@@@m@@@$boolE@@@@@@@@@rK@@$diff @~@@@@@@@@@@@@ @@!@@L@@(cardinal @@@@"#intA@@@#@@$@@M@@(elements @@@@%$listK@@@&@@@'@@(@@N@@'min_elt @@@@)@@@*@@+@@O@@+min_elt_opt @@@@,&optionL@@@-@@@.@@/@@P@@'max_elt @@@@0@@@1@@2@@Q@@+max_elt_opt @@@@3#@@@4@@@5@@6@@R@@&choose @@@@7@@@8@@9@@S@@*choose_opt @ @@@:D@@@;@@@<@@=@/@T@@$find @@@@>@!@@@?@@@@@@A@@B@B@#U@@(find_opt @"@@@C@4@@@Do.@@@E@@@F@@G@@H@Z@;V@@*find_first @@<@@@I@@@J@@K@R@@@LH@@@M@@N@@O@s@TW@@.find_first_opt @@U@@@P@@@Q@@R@k@@@Se@@@T@@@U@@V@@W@@rX@@)find_last @@s@@@X@@@Y@@Z@@@@[@@@\@@]@@^@@Y@@-find_last_opt @@@@@_,@@@`@@a@@@@bݠ@@@c@@@d@@e@@f@@Z@@$iter @@@@@g$unitF@@@h@@i@@@@j @@@k@@l@@m@@[@@$fold @@@@@n@#acc@r@@o@@p@@@@q@  @@s@@t@@u@@\@@&filter @@@@@v@@@w@@x@@@@y@@@z@@{@@|@@^@@*filter_map @@@@@}A@@@~@@@@@@@@@@@@@@@@@4@_@@)partition @@@@@@@@@@@,@@@@3@@@@8@@@@@@@@@@V@7`@@%split @6@@@@H@@@@O@@@@@@@@Z@@@@@@@@@@x@Ya@@(is_empty @e@@@@@@@@@@hb@@#mem @g@@@@y@@@ @@@@@@@@@|c@@%equal @@@@@@@@ @@@@@@@@@d@@'compare @@@@@@@@@@@@@@@@@e@@&subset @@@@@@@@H@@@@@@@@@f@@'for_all @@@@@Y@@@@@@@@@b@@@@@@@@@g@@&exists @@@@@s@@@@@@@@@|@@@@@@@@ @h@@'to_list @@@@V@@@@@@@@@@i@@+to_seq_from @@@@@@@@&Stdlib#Seq!t@@@@@@@@@@@<@k@@&to_seq @)@@@#Seq!t&@@@@@@@@@R@3l@@*to_rev_seq @?@@@/#Seq!t<@@@@@@@@@h@Im@@'add_seq @B#Seq!tO@@@@@@@b@@@e@@@@@@@@@dn@@&of_seq @]#Seq!tj@@@@@@{@@@@@@@zo@@&output @G+out_channel@@@@@@@D@@@@@@@@@M@@%print @^&Format)formatter@@@@@@@\@@@@@@@@@N@@)to_string @@@@&stringQ@@@@@@@O@@'of_list @$listK@@@@@@@@@@@@@P@@#map @@@@@@@@@@@@@@@@@@@@@@@Q@@@@l@u@@@Ӡ#Map @#key ;@@@A!t@@@\@@@@mm@@@@T@A@!t ;!a@]@A@A#Map$Make!t@@@^I@B@@@@@@-U@A@%empty  !a@_@@@`@,@E@@#add @A@@@a@!a@c@ @@@b! @@@d@@e@@f@@g@H@F@@+add_to_list @@@@h@!a@k@8$listK@@@i@@@jC @@@l@@@m@@n@@o@@p@o@9G@@&update @C@@@q@@&optionL!a@v@@@r  @@@s@@t@m@@@uq@@@w@@x@@y@@z@@bH@@)singleton @l@@@{@!a@|@@@}@@~@@@@wI@@&remove @@@@@!a@@@@@@@@@@@@@J@@%merge @@@@@@W!a@@@@@b!b@@@@k!c@@@@@@@@@@@Ѡ@@@@נ@@@۠@@@@@@@@@@@K@@%union @@@@@@!a@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@,@L@@(cardinal @!a@@@@@@@@@@@@ M@@(bindings @%!a@@@@@$@@@@@@@@@@@@^@(N@@+min_binding @C!a@@@@@>@@@@@@@@@w@AO@@/min_binding_opt @\!a@@@@ @[@@@@@@@@@@@@@_P@@+max_binding @z!a@@@@@u@@@@@@@@@@xQ@@/max_binding_opt @!a@@@@@@@@@@@@@@@@@@@R@@&choose @!a@@@@@@@@Ġ@@@@@@@S@@*choose_opt @ʠ!a@@@@w@@@@ɠ@@@@@@@@@@T@@$find @@@@@!a@@@@@@@@@@U@@(find_opt @@@@@!a@@@@ @@@@@@@@2@V@@*find_first @@@@@$boolE@@@@@@$!a@@@@@@@@ݠ@@@@@@@@X@"W@@.find_first_opt @@.@@@&@@@@@@H!a@@@@@G@@@栠@@@@@@@@@@@@KX@@)find_last @@W@@@O@@@@@@q!a@@@@@l@@@@@@@@@@@@oY@@-find_last_opt @@{@@@s@@@@@@!a@@@@B@@@@@@@@@@@@@@@@Z@@$iter @@@@@@!a@$unitF@@@@@@@@Ơ@@@ @@@@@@@@@[@@$fold @@@@@@!a@ @#acc@ @@@@ @@ @@@@ @  @@@@@@@@\@@#map @@!a@!b@@@@ @@@ @@@@@@@@.@]@@$mapi @@@@@@!a@!b@@@@@@$ @@@( @@@@@@@ @O@^@@&filter @@%@@@!@!a@&#@@@"@@#@@$@E @@@%I@@@'@@(@@)@p@:_@@*filter_map @@F@@@*@!a@.!b@0@@@+@@,@@-@k@@@/o@@@1@@2@@3@@``@@)partition @@l@@@4@!a@:j@@@5@@6@@7@ @@@8@@@@;@@@@9@@<@@=@@>@@a@@%split @@@@?@!a@C@@@@@ @@@D@b@@@B@Ġ@@@A@@E@@F@@G@@b@@(is_empty @Р!a@H@@@I@@@J@@K@@c@@#mem @@@@L@!a@M@@@N@@@O@@P@@Q@@d@@%equal @@!a@V@@@@R@@S@@T@ @@@U@@@@W@@@X@@Y@@Z@@[@<@ e@@'compare @@!a@`@ @@@\@@]@@^@/@@@_@5@@@a /@@@b@@c@@d@@e@`@ *f@@'for_all @@6@@@f@!a@j4@@@g@@h@@i@V @@@k>@@@l@@m@@n@@ Kg@@&exists @@W@@@o@!a@sU@@@p@@q@@r@w @@@t_@@@u@@v@@w@@ lh@@'to_list @!a@y@@@xT@@@@z@@@{@@@|@@}@@ i@@&to_seq @!a@@@@~&Stdlib#Seq!t@@@@@@@@@@@@@@ k@@*to_rev_seq @ɠ!a@@@@$#Seq!t@@@@@@@@@@@@@@ l@@+to_seq_from @@@@@!a@@@@J#Seq!t@@@@@@@@@@@@@@@+@ m@@'add_seq @c#Seq!t@ @@@@!a@@@@@@@' @@@+@@@@@@@@R@ n@@&of_seq @#Seq!t@1@@@@!a@@@@@@L@@@@@@s@ =o@@'of_list @@O@@@@!a@@@@@@j@@@@@@@ V@@.disjoint_union "eq&optionL@!a@@$boolE@@@@@@@@@@%print@ {&Format)formatter@@@@ v@@@@@@@@@@@)@@@@/@@@3@@@@@@@@@@@@@ W@@+union_right @!a@@@@@Ơ @@@ʠ@@@@@@@@@ X@@*union_left @֠!a@@@@@ @@@@@@@@@@@ @ Y@@+union_merge @@!a@@@@@@@ @@@@@@@@@@@@@@@@@+@ ;Z@@&rename @@@@@@@@@@@ @@@@@@@@B@ R[@@(map_keys @@@@@@@@@@@1!a@@@@9@@@@@@@@`@ p\@@$keys @E!a@@@@ 4#Set$Make !t@@@@@@z@ ]@@$data @_!a@@@@Š @@@@@@@ ^@@&of_set @@e@@@!a@@@@ f#Set$Make -!t@@@@@@@@@@@@ _@@7transpose_keys_and_data @@@@@@@@@@@@@@@@@ `@@;transpose_keys_and_data_set @@@@@@@ #Set$Make c!t@@@@@@@@@@ a@@%print @@ &Format)formatter@@@@!a@ @@@@@@@@ &Format)formatter@@@@@@@ @@@@@@@@@@@ !b@@@@ &m@ $v@@@Ӡ#Tbl @#key ;@@@A !t@@@@@@@ ;n <n@@@@ :h@A@!t ;!a@@A@A 'Hashtbl$Make !t@@@O@B@@@@@@ Ti@A@&create @ 5@@@&!a@@@@@@@2@ Ne@@%clear @!a@@@@$unitF@@@@@@H@ df@@%reset @'!a@@@@@@@@@@\@ xg@@$copy @;!a@@@@C@@@@@@p@ h@@#add @O!a@@@@@@@@@ F@@@@@@@@@@@ i@@&remove @k!a@@@@@@@@_@@@@@@@@@ j@@$find @!a@@@@@5@@@ @@@@@@ k@@(find_opt @!a@@@@@J@@@&optionL@@@@@@@@@ l@@(find_all @!a@@@@@f@@@$listK@@@@@@@@@ m@@'replace @Ѡ!a@@@@@@@@@ @@@@@@@@@@ @ )n@@#mem @!a@@@@@@@@ G@@@@@@@@&@ Bo@@$iter @@@@@@!a@@@@@@@@@ @@@@@@@@@@@G@ cp@@2filter_map_inplace @@@@@@!a@@@@@@@@@8@@@#@@@@@@@@i@ q@@$fold @@@@@@!a@@#acc@@@@@@@@[@@@@  @@ @@ @@ @@ r@@&length @i!a@ @@@  @@@@@@@ s@@%stats @}!a@@@@ *statistics@@@@@@@ t@@&to_seq @!a@@@@&Stdlib#Seq!t@Q@@@@@@@@@@@@@ u@@+to_seq_keys @@@@@@"#Seq!tl@@@@@@@@@@v@@-to_seq_values @Ѡ!a@ @@@=#Seq!t @@@!@@"@ @&w@@'add_seq @!a@$@@@#@W#Seq!t@@@@%@@@&@@@'@@@(@@)@@*@1@Mx@@+replace_seq @!a@,@@@+@~#Seq!t@@@@-@@@.@@@/@@@0@@1@@2@X@ty@@&of_seq @#Seq!t@@@@3@!a@6@@4@@@5L@@@7@@8@y@z@@'to_list @X!a@:@@@9 @>!t@@@;@@@<@@@=@@>@@j@@'of_list @ @V!t@@@?@!a@B@@@@@@A@@@C@@D@@k@@&to_map @!a@F@@@E#Map$Make{!t@@@G@@H@@ l@@&of_map @#Map$Make!t!a@J@@@I @@@K@@L@@&m@@'memoize @Π!a@Q@@@M@@@@@N @@O@@@@P@@R@@S@@T@ @Bn@@#map @!a@V@@@U@@ !b@X@@W@@@Y@@Z@@[@'@^o@@@@cn(@aw@@@@@GsCC{@Vr@@@$expr N;@@@AY@@@@@@@TvDMDMUvDMDZ@@@@ds@A@,program_body O;@@*Let_symbol萠|!t@@@@@@@@@@@s}E}Et}E}E@@u@.Let_rec_symbol鐠 @!t@@@@@@@@@@@@#@@@@@FFFFR@@v@1Initialize_symbolꐠ!t@@@N!t@@@P@@@@@@G@@@@@IIII@@w@&Effect될@@@X@@@@@JJJJ@@x@#End쐠!t@@@@@KKKK@@y@@@A@@@@@|EiEi@@@@t@A@'program P;@@0imported_symbols@@#Set!t@@@LLLL5@@{@,program_body@@@@@L6L8L6LT@@|@@@A@@@@@LLLULV@@@@z@A@.free_variables Q5ignore_uses_as_callee$unitF@@@@@@7ignore_uses_as_argument@@@@@@:ignore_uses_in_project_var@@@@@@@<@@@#Set!t@@@@@@@@@@@@?MJMJ@MM@@O}@@4free_variables_named R:ignore_uses_in_project_var=<@@@@@@@@@@ #Set!t@@@@@@@@aNNbNfNy@@q~@@.used_variables S5ignore_uses_as_callee_^@@@@@@7ignore_uses_as_argumentkj@@@@@@:ignore_uses_in_project_varwv@@@@@@@@@@G#Set!t@@@@@@@@@@@@NNO>OQ@@@@4used_variables_named T:ignore_uses_in_project_var@@@@@@@@@@i#Set!t@@@@@@@@OOOO@@@@,free_symbols U@@@@#Set!t@@@@@@OOOP@@@@2free_symbols_named V@!@@@#Set!t@@@@@@PPPPM@@@@4free_symbols_program W@@@@#Set!t@@@@@@POPOPOP@@@@0fold_lets_option X@@@@$init!a@1for_defining_expr@ @!t@@@@i@@@@@!t@@@砠@z@@@@@@@@@@@-for_last_body@.@K@@@@R@@@@!b@@@@@@@4filter_defining_expr@ @!t@@@@@@@@#Set!t@@@@%@)!t@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@QQSS#@@@@(map_lets Y@@@@1for_defining_expr@V!t@@@@@@@@@@@@ @@ -for_last_body@@@@ @@@ @@ -after_rebuild@@@@@@@@@@@@@@@@@@@@@SUSUSS@@@@)iter_lets Z@@@@1for_defining_expr@!t@@@@*@@@@@@@@@@-for_last_body@@@@@@@@@,for_each_let@ @@@@@@ @@!@@@"@@#@@$@@%@@&@ T T TT@@@@*create_let [@!t@@@'@b@@@(@-@@@)0@@@*@@+@@,@@-@+UU,UUA@@;@@8map_defining_expr_of_let \@@@@.!f@@@@/@@@0@@1M@@@2@@3@@4@HUUIUV@@X@@Ӡ3With_free_variables ]@!t ;!a@|@A@A@G@B@@@_VV`VV@@@@o@A@7of_defining_expr_of_let @@@@}@@@~@@@@@@uVVvVV@@@@.of_body_of_let @@@@@@@@@@@@@W W W W4@@@@'of_expr @@@@+@@@@@@@@@WWWX @@@@(of_named @@@@@@@@@@@@@@X XX X-@@@@ create_let_reusing_defining_expr @r!t@@@@Z @@@@@@@@@@ @@@@@@@@@@XX XX@@@@7create_let_reusing_body @!t@@@@+@@@@)@@@@@@-@@@@@@@@@@ YIYKYY@@@@7create_let_reusing_both @!t@@@@P@@@@@@@O@@@@@@S@@@@@@@@@@YYZZ @@.@@$expr @d@@@@@@àu@@@@@@@@@7ZBZD8ZBZ`@@G@@(contents @ՠ!a@@@@@@@JZbZdKZbZ}@@Z@@.free_variables @X@@@@#Set!t@@@@@@b ZZc ZZ@@r@@@@fVVg!ZZ@v@@@;create_function_declaration ^¶ms!t@@@5@@@6$body@@@7$stub@@@8#dbg!t@@@9&inline 0inline_attribute@@@:*specialise4specialise_attribute@@@;,is_a_functor@@@<.closure_origin!t@@@=$poll3.poll_attribute@@@>@@@?@@@@@A@@B@@C@@D@@E@@F@@G@@H@%[B[B/\[\t@@@@;update_function_declaration _@@@@I¶ms!t@@@J@@@K$body@@@L(@@@M@@N@@O@@P@2\\6]#]<@@@@s-Stdlib__Uchar056uf4[_+Stdlib__Sys0 -ռ鱦s5/.Stdlib__String0Vê>)Longident0s `7mɕc(Location0a7cK_H%9)Load_path0I@18 ~,Linkage_name0EwKсڊs&Lambda0z1x]&ZT7Internal_variable_names0HdeՄL ԩ,Identifiable0 {d\FX'`%Ident0">WA+9*X*Format_doc0]mWϓ:Mݠ#Env0zV L{YWI)Debuginfo0PtJ=^w/*Data_types0I'Ue`wq]Ѡ0Compilation_unit0 {p-Vg_*Cmi_format0c˯7͗ԩmݠ.Closure_origin0vˆtT{(}z*Closure_id05:z[ކ/Closure_element0YWZ̡Q.hV&2Clambda_primitives01U10CamlinternalLazy0&͂7 Pˆ8CamlinternalFormatBasics0%FU(Q/Tu5Build_path_prefix_map0z HkGs(Asttypes0>n{T8cئ/Allocated_const0ЖݔTW@@@Caml1999T037If<[' C'Flambda-ocaml.warning>middle_end/flambda/flambda.mliQQ@2+a-4-9-30-40-41-42 QQ@@QQ@@@@@@QQ@3@@@@@@#intA;@@@A@@@@@&_none_@@A@A@$charB;@@A@@@@@@A@&stringQ;@@ A@@@@@ @@@%bytesC;@@A@@@@@@@@%floatD;@@A@@@@@@@@$boolE;@@%falsec@@@$trued@@#@@@A@@@@@$@A@$unitF;@@"()e@@.@@@A@@@@@/@A@ #exnG;@@@A@@@@@3@@@#effH;@@O@A@A@@@@@@<@@@,continuationI;@@Q@@P@B@A@nY@@@@@@K@@@%arrayJ;@@R@A@A@@@@@@U@@@ $listK;@@S@A"[]f@@b@"::g@@@T@@o@ @@A@Y@@@@@r@@@&optionL;@@V@A$Noneh@@@$Somei@@@@@A@Y@@@@@@@@)nativeintM;@@A@@@@@@@@%int32N;@@A@@@@@@@@%int64O;@@A@@@@@@@@&lazy_tP;@@X@AJA@Y@@@@@@@@5extension_constructorR;@@A@@@@@@@@*floatarrayS;@@A@@@@@@@@&iarrayT;@@Y@A[A@Y@@@@@@@@*atomic_locU;@@Z@AdA@@@@@@@@@.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@@A54@)Not_foundZ#O@@@A =<@-Out_of_memoryW#W@@@AED@.Stack_overflow^#_@@@AML@.Sys_blocked_io_#g@@@A$U'T'@)Sys_error[#o@j@@A-^0]0@:Undefined_recursive_modulea#x@@w@s@u@@h@@A>oAnA@:Continuation_already_takenb#@@@AFwIvI@&Stdlib@Azy@*ocaml.textT F Intermediate language used for tree-based analysis and optimization. SS@@@@@@A+)call_kindAVHMVHV@@;@@(Indirect@@WY[WYe@@A@&Direct*Closure_id!t@@@@@XfhXf@@B@@@A@@@@@VHH@)ocaml.doc H Whether the callee in a function application is known at compile time. UUG@@@@@@@@@@@@#//WY]-@,@@@0@#,,XfjXfp@!@г.*Closure_idXftXf~@3Xf1@2@@<3@U;@@@A@@@@@42@@"@A 7@@@@9@@A@5321@11@@@1@1@@@C@A+%const'B\\ @@;@@#Int(@@@@@!]#%"]#1@@.D@$Char)@@@@@/^240^2B@g 8 [Char] is kept separate from [Int] to improve printing =_CE>_C@@@@@@@JE@@@A@@@@@A\@x Simple constants. ("Structured constants" are rewritten to invocations of [Pmakeblock] so that they easily take part in optimizations.) NZO[@@@@@@@@@[C@@#<<V]#'W]#*@5@г>#int`]#.?@@E3KJJKKKKK@KV;@@@A@@@@@&$@@@AE@@@@G@#CCk^26l^2:@.@гE$charu^2>F@@LG@@@@I:GF@FF@@@F@F@@A@BEA@@@@@@@@@@@@3wvvwwwww@+@AN_@A+%apply*Cbb@@;@@$funcC@@(Variable!t@@@ɰe(*e(<@@G@$argsD@@!t@@@@@@ΰf=?f=V@@H@$kindE@@!@@@ѰgWYgWj@@I@#dbgT@@)Debuginfo!t@@@0hkmhk@@J@&inline@@&Lambda0inline_attribute@@@ <ii@ U Instructions from the source code as to whether the callee should be inlined. jk@@@@@@@M@*specialise@@4specialise_attribute@@@ ?ll,@< Y Instructions from the source code as to whether the callee should be specialised. m-/nu@@@@@@@N@@@A@@@@@bo@N 7 The application of a function to a list of arguments. $a%a@@@@@@@@@1F@@#,e(.@@@Ш@г(Variable7e(18e(9@;e(:}  ?}  @B}  C}  @@@Y@@@Z @@@@ ]@@#M~  @@@Ш@г)DebuginfoX~  Y~  @\~  ]~  @@@s@@@@ v@@@A@%@@@@@@@3WVVWWWWW@@A@A+/project_closureFxB 5 :yB 5 I@@;@@@A*Projection/project_closure@@@ @@@@B 5 5B 5 f@ 1 For details on these types, see projection.mli. A  A  4@@@@@@@@@X@@@Aг*ProjectionB 5 LB 5 V@ B 5 W@@@)3@935;@@@A=@@@ @ @@@@-*@@@A,@@.v,+@++@@@+@+@@3@@A:9@A+;move_within_set_of_closuresGC g lC g @@;@@QAP;move_within_set_of_closures@@@ @@@@C g gC g @@@@Y@@@Aг *ProjectionC g C g @C g @@@3@Auo$;@@@A,@@@ @ @@@@@@@@A@@ @@3@ @A! @A++project_varHD  D  @@;@@A+project_var@@@ @@@@ D   D  @@@@Z@@@Aг *ProjectionD  D  @D  @@@3@6YS$;@@@A,@@@ @ @@@@@@@@A@@ @@3@ @A! @A+.specialised_toI3J  4J  @@;@@#var@@!t@@@ ҰBK  CK  @z7 The "outer variable". PL  QL  @@@@@@@]\@*projection@@!t@@@ @@@ װcM  dM  .@  The [projecting_from] value (see projection.mli) of any [projection] must be another free variable or specialised argument (depending on whether this record type is involved in [free_vars] or [specialised_args] respectively) in the same set of closures. As such, this field describes a relation of projections between either the [free_vars] or the [specialised_args]. qN / 1rS  @@@@@@@~]@@@A@@@@@uJ  vT  @ 0 See [free_vars] and [specialised_args], below. F  F  @@@@@@@@@[@@#PPIK  @:@@Ш@гS(VariableK  K  @ZK  K  @@@b3@q;@@@A@@@@@.+@@@A @@j@@ @dhba@aa@@@a@a@#]]QM  @B@@Ш@г`&optionM  'M  -@гe*ProjectionM  M  $@lM  %M  &@@@t2@@@y3 @@|@@ 6@q on@nn@@@n@n@@A@jhg@gg@@@g@g@@3@K@Avu@A+!tJ\8=\8>@@;@@#Var^!t@@@ @@]AC]AV@@i@#Let(let_exprJ@@@ @@^WY^Wj@@"j@+Let_mutable+let_mutableJ@@@ @@%_km&_k@@2k@%Apply@@@ @@3`4`@@@l@$Send@@@ @@AaBa@@Nm@&Assign_@@@ @@ObPb@@\n@,If_then_else!t@@@ r@@@ w@@@ @@icjc@@vo@&Switch!t@@@ &switchJ@@@ @@dd @@p@-String_switch!t@@@ @S@@@ @@@@ @@ @@@ @@@ @@@ @@e e J@搠 G Restrictions on [Lambda.Lstringswitch] also apply to [String_switch]. fKMfK@@@@@@@q@,Static_raise0Static_exception!t@@@ 4;2!t@@@ 5@@@ 7@@gg@@r@,Static_catch!t@@@ 8W@R!t@@@ 9@*value_kind@@@ :@@ ;@@@ =@@@ >@@@ ?@@ h i/@@s@(Try_with(@@@ @z!t@@@ A4@@@ B@@&j02'j0R@@3t@%WhileB@@@ CG@@@ D@@9kSU:kSe@@Fu@#For(for_loopJ@@@ E@@IlfhJlfy@@Vv@2Proved_unreachable @@Rmz|Smz@@_w@@@A@@@@@V\88@ i Flambda terms are partitioned in a pseudo-ANF manner; many terms are required to be [let]-bound. This in particular ensures there is always a variable name for an expression that may be lifted out (for example if it is found to be constant). Note: All bound variables in Flambda terms must be distinct. [Flambda_invariants] verifies this. cV  d[ 7@@@@@@@@@p^@@#ook]AEl]AH@f@гq(Variablew]ALx]AT@x{]AUv@w@@3gffggggg@[U;@@@A@@@@@75@@'%namedJ;@@@A@@@@@p9F@ɐ F Values of type [named] will always be [let]-bound to a [Variable.t]. oo@@@@@@@@@_@;@@@@@@@@@@@@@`@;@@@A@@@@@ n o@@@@a@/set_of_closuresJ;@@@@@@@@@$w$w44@될  The representation of a set of function declarations (possibly mutually recursive). Such a set encapsulates the declarations themselves, information about their defining environment, and information used specifically for optimization. Before a function can be applied it must be "projected" from a set of closures to yield a "closure". This is done using [Project_closure] (see above). Given a closure, not only can it be applied, but information about its defining environment can be retrieved (using [Project_var], see above). At runtime, a [set_of_closures] corresponds to an OCaml value with tag [Closure_tag] (possibly with inline [Infix_tag](s)). As an optimization, an operation ([Move_within_set_of_closures]) is provided (see above) which enables one closure within a set to be located given another closure in the same set. This avoids keeping a pointer to the whole set of closures alive when compiling, for example, mutually-recursive functions.  q q$t$v@@@@@@@@@b@5function_declarationsJ;@@@@@@@@@44*77@@@@c@4function_declarationJ;@@@@@@@@@,77I=s=t@@@@d@X;@@@A@@@@@L==R>>@ - Equivalent to the similar type in [Lambda]. K=v=vK=v=@@@@@@@@@e@;@@@A@@@@@U??[??@# - Equivalent to the similar type in [Lambda]. T>>T>?@@@@@@@@@ f@7constant_defining_valueJ;@@@A@@@@@ a@@ kBC@9 ) Like a subset of [Flambda.named], except that instead of [Variable.t]s we have [Symbol.t]s, and everything is a constant (i.e. with a fixed value known at compile time). Values of this type describe constants that will be directly assigned to symbols in the object file (see below).  ]?? `@@@@@@@@@@@ g@ #constant_defining_value_block_fieldJ;@@@A@@@@@ oCC qCC@@@@ $h@@A@@@@@# ^W[ ^W^@ @г(let_expr )^Wb@@@@@@@# /_ko 0_kz@ @г+let_mutable 9_k~@@@@@@@# ?` @`@ @г%apply I`@@Ͱ@@@@@# Oa Pa@@г$send Ya@@ݰ@@@@@# _b `b@@г&assign ib@@ @@@@@# oc pc@@г(Variable {c |c@" c c@@@*@@г%!t c c@@-@@г*!t c+@@1,@@@@.@#** d d@@г,(Variable d d@3 d d@@@;0@@г6&switch d5@@=96@@@@8@#44 e  e @@г6(Variable e ! e )@= e * e +@@@EQ@@г@$list e ; e ?@В@гE&string e / e 5@@Mh@@@гJ!t e 8 e 9@@Rs@@@]t@@@bu e .@@гQ&option e DM@гU!t e B e C@@]@@@bX@@@@Z= ʐXW@WW@@@W@W@#SS g g@<@гU0Static_exception "g #g@Z &g 'g@@@d@@г]$list 1gW@гa(Variable ;g <g@h ?g @g@@@pŰ@@@uư i@@@@k@#gg Hh Ih@<@гi0Static_exception Ti Ui@p Xi Yi@@@xް@@гs$list ci# di'@В@гx(Variable ri si @ vi  wi @@@@@@г&Lambda i i@ i i!@@@@@@@@@ i+@@г!t i* i+@@@@г!t i.@@$@@@@@# j04 j0<@@г!t j0@ j0A@@5@@г(Variable j0D j0L@ j0M j0N@@@F@@г!t j0Q@@O@@@@@# kSW kS\@@г!t kS` kSa@@`@@г!t kSd@@i@@@@@# lfj lfm@@г(for_loop lfq@@y@@@@@# mz~@@@@@@A@ 3 @@@@@@+~~ p p@@;@@&Symbol &Symbol!t@@@ @@ q q@@ ,x@%Const @@@ @@ -r .r@@ :y@/Allocated_const/Allocated_const!t@@@ @@ ?s @s<@@ Lz@,Read_mutable"N!t@@@ @@ Ot=? Pt=c@@ \{@1Read_symbol_field#B!t@@@  &@@@ @@ dudf eud@  During the lifting of [let] bindings to [program] constructions after closure conversion, we generate symbols and their corresponding definitions (which may or may not be constant), together with field accesses to such symbols. We would like it to be the case that such field accesses are simplified to the relevant component of the symbol concerned. (The rationale is to generate efficient code and share constants as expected: see e.g. tests/asmcomp/staticalloc.ml.) The components of the symbol would be identified by other symbols. This sort of access pattern is feasible because the top-level structure of symbols is statically allocated and fixed at compile time. It may seem that [Prim (Pfield, ...)] expressions could be used to perform the field accesses. However for simplicity, to avoid having to keep track of properties of individual fields of blocks, [Inconstant_idents] never deems a [Prim (Pfield, ...)] expression to be constant. This would in general prevent field accesses to symbols from being simplified in the way we would like, since [Lift_constants] would not assign new symbols (i.e. the things we would like to simplify to) to the various projections from the symbols in question. To circumvent this problem we use [Read_symbol_field] when generating projections from the top level of symbols. Owing to the properties of symbols described above, such expressions may be eligible for declaration as constant by [Inconstant_idents] (and thus themselves lifted to another symbol), without any further complication. [Read_symbol_field] may only be used when the definition of the symbol is in scope in the [program]. For external unresolved symbols, [Pfield] may still be used; it will be changed to [Read_symbol_field] by [Inline_and_simplify] when (and if) the symbol is imported.  rv sC@@@@@@@ |@/Set_of_closures$@@@ @@ DF Dj@@ }@/Project_closure%@@@ @@ km k@@ ~@;Move_within_set_of_closures&@@@ @@  @@ @+Project_var'@@@ @@  @@ @@$Prim(2Clambda_primitives)primitive@@@ʠ ) !t@@@@@@͠!t@@@@@  8@@ C@$Expr;@@@@@ 9;L@ 3 ANF escape hatch.  9H 9`@@@@@@@ D@@@A@@@@@]Z@@L@#ޠް q q@@гࠡ&Symbol q q@ q@@@@@@@@# r r @@г堐%const r@@@@@@@# s s'@@г砡/Allocated_const %s+ &s:@ )s;@@@@@@@@# 0t=A 1t=M@@г젡0Mutable_variable <t=Q =t=a@ @t=b@@@Ű@@@@@# Gudh Hudy@@г󠡠&Symbol Sud} Tud@ Wud Xud@@@ݰ@@г#int bud@@@@@@  '@@@@@@# sDH tDW@@г/set_of_closures }D[@@@@@@@# ko k~@@г/project_closure k@@@@@@@#  @@г;move_within_set_of_closures @@!@@@@@#  @@г+project_var @@ 1@@@@@#  @@г2Clambda_primitives  @   @@@I@@г $list & *@г(Variable  #@ $ %@@@ c@@@%d @@г)Debuginfo - 6@" 7 @!@@)t"@@@@$@#   9= 9A@ @г"!t 9Eo@@)p@@@@& 8 Ő%$@$$@@@$@$@@A@} C А{z@zz@@@z@z@+     @@;@@#var<@@ !t@@@а +!# ,!4@@ 8E@-defining_expr=@@@@@Ӱ 757 85M@@ DF@$body>@@Q@@@ְ CNP DNY@@ PG@:free_vars_of_defining_expro@@ #Set!t@@@ S T @ H A cache of the free variables in the defining expression of the [let].  a   b Z@@@@@@@ nH@1free_vars_of_bodyp@@ #Set!t@@@ q[] r[@ c A cache of the free variables of the body of the [let]. This is an important optimization.   @@@@@@@ I@@@@@@@@@@@@@#cc\ !&@[@@Ш@гf(Variable !) !1@m !2 !3@@@u@@x@@@r@#nni 5D@h@@Ш@гq%named 5G 5L@@y.@@|@@1@x@#tto NT@n@@Ш@гw!t NW NX@@@@@@@C@~@#zzq @b@@Ш@г}(Variable  @  @@   @ @@` @@@@c@  @@@@@@#~ [n@o@@Ш@г(Variable [q [y@[z[}@@[~[@ @@ @@@@@ A ΐ@@@@@@@@@r@+@@;@@#varq@@ (!t@@@)  *  @@6J@-initial_valuer@@ !t@@@ð7  !8  <@@DK@-contents_kinds@@ _*value_kind@@@ưE = ?F = a@@RL@$bodyt@@_@@@ɰQ b dR b m@@^M@@@A@@@@@@@@@#770Y  @/@@Ш@г:0Mutable_variabled  e  @Ah  i  @@@I@@L@@@F@#BB;r  .@:@@Ш@гE(Variable}  1~  9@L  :  ;@@@T@@W@@ @Q@#MMF = L@E@@Ш@гP&Lambda = O = U@W = V = `@@@_ @@b@@#@\@#XXS b h@R@@Ш@г[!t b k b l@@c2@@f@@5@b@@A@@+$w${$w$@@;@@.function_declsu@@@@@̰$$$$@@N@)free_vars@@ +#Map!t@@@@@@ڰ'''';@  Mapping from all variables free in the body of the [function_decls] to variables in scope at the definition point of the [set_of_closures]. The domain of this map is sometimes known as the "variables bound by the closure". '<'>((5@@@@@@@O@0specialised_args@@ N#Map!t@@@@@@߰(6(8(6(i@ 3 a Parameters whose corresponding arguments are known to always alias a particular value. These are the only parameters that may, during [Inline_and_simplify], have non-unknown approximations. An argument may only be specialised to a variable in the scope of the corresponding set of closures declaration. Usually, that variable itself also appears in the position of the specialised argument at all call sites of the function. However it may also be the case (for example in code generated as a result of [Augment_specialised_args]) that the various call sites of such a function have differing variables in the position of the specialised argument. This is permissible *so long as it is certain they all alias the same value*. Great care must be taken in transformations that result in this situation since there are no invariant checks for correctness. As an example, supposing all call sites of f are represented here: [let x = ... in let f a b c = ... in let y = ... in f x y 1; f x y 1] the specialised arguments of f can (but does not necessarily) contain the association [a] -> [x], but cannot contain [b] -> [y] because [f] is not in the scope of [y]. If f were the recursive function [let rec f a b c = f a 1 2 in], [a] -> [x] would still be a valid specialised argument because all recursive calls maintain the invariant. This information is used for optimization purposes, if such a binding is known, it is possible to specialise the body of the function according to its parameter. This is usually introduced when specialising a recursive function, for instance. [let rec map f = function | [] -> [] | h :: t -> f h :: map f t let map_succ l = let succ x = x + 1 in map succ l] [map] can be duplicated in [map_succ] to be specialised for the argument [f]. This will result in [let map_succ l = let succ x = x + 1 in let rec map f = function | [] -> [] | h :: t -> f h :: map f t in map succ l] with map having [f] -> [succ] in its [specialised_args] field. Specialised argument information for arguments that are used must never be erased. This ensures that specialised arguments whose approximations describe closures maintain those approximations, which is essential to transport the closure freshening information to the point of use (e.g. a [Project_var] from such an argument).  (j(l 22@@@@@@@P@6direct_call_surrogates@@ q#Map!t x!t@@@@@@ 22!23@ X  If [direct_call_surrogates] maps [fun_var1] to [fun_var2] then direct calls to [fun_var1] should be redirected to [fun_var2]. This is used to reduce the overhead of transformations that introduce wrapper functions (which will be inlined at direct call sites, but will penalise indirect call sites). [direct_call_surrogates] may not be transitively closed. .3 3 /4S4@@@@@@@;Q@@@@@@@@@|@@n@#xxs6$$@r@@Ш@г{5function_declarations?$$@$$@@İ@@@@@@#~~pH''@a@@Ш@г(VariableU'',V''4@Y''5Z''8@@^''9_'':@ @г.specialised_toh''i''+@@@@@ @@@@@ 1@@@@@@#}(6(H@s@@Ш@г(Variable(6(Z(6(b@(6(c(6(f@@(6(g(6(h@ @г.specialised_to(6(K(6(Y@@"@@@# @@@@&@ f@@@@@@#22@@@Ш@г(Variable2223@2323@@2323@ @г(Variable2222@2222@@@^@@@_ @@@@b@@@@@@@@@@8 65@55@@@5@5@+334444@@;@@/is_classic_mode@@@@@4444@> S Indicates whether this [function_declarations] was compiled with -Oclassic. 44551@@@@@@@!R@2set_of_closures_id@@2Set_of_closures_id!t@@@2$5254%525^@\ An identifier (unique across all Flambda trees currently in memory) of the set of closures associated with this set of function declarations. 25_5a3!56@@@@@@@?S@6set_of_closures_origin@@6Set_of_closures_origin!t@@@}B"66C"666@z An identifier of the original set of closures on which this set of function declarations is based. Used to prevent different specialisations of the same functions from being inlined/specialised within each other. P#6769Q&7 7'@@@@@@@]T@$funs@@ #Map!t@@@@@@e'7(7*f'7(7U@ The function(s) defined by the set of function declarations. The keys of this map are often referred to in the code as "fun_var"s. s(7V7Xt)77@@@@@@@U@@@@@@@@@@@@@#zzu{44@f@@Ш@г}$bool4444@@ @@@@ @L@@@@@@#}}t525F@e@@Ш@г2Set_of_closures_id525I525[@525\525]@@@-@@@@30@p@@@@@@#z"66@k@@Ш@г6Set_of_closures_origin"66"663@"664"665@@@Q@@@@~T@@@@@@@#{'7(7.@l@@Ш@г(Variable'7(7F'7(7N@'7(7O'7(7R@@'7(7S'7(7T@ @г4function_declaration'7(71'7(7E@@@@@ @@@@@<ɐ@@@@@@@@@I@+GG,77,78@@;@@.closure_origin@@.Closure_origin!t@@@&-88'-884@@3V@¶ms@@)Parameter!t@@@@@@;.8587<.858Q@@HW@$body@@ U@@@G/8R8TH/8R8]@@TX@.free_variables@@#Set!t@@@ W288X288@ All variables free in the *body* of the function. For example, a variable that is bound as one of the function's parameters will still be included in this set. This field is present as an optimization. e388f59q9@@@@@@@rY@,free_symbols @@W#Set!t@@@u699v699@ All symbols that occur in the function's body. (Symbols can never be bound in a function's body; the only thing that binds symbols is the [program] constructions below.) 7999:t:@@@@@@@Z@$stub!@@9@@@::::::@ǐ " A stub function is a generated function used to prepare arguments or return values to allow indirect calls to functions with a special calling convention. For instance indirect calls to tuplified functions must go through a stub. Stubs will be unconditionally inlined. ;::>;;@@@@@@@[@#dbg"@@!t@@@ ?;;?;;@㐠 * Debug info for the function declaration. @;;@;<@@@@@@@\@&inline#@@0inline_attribute@@@ A<<A<<@@ - Inlining requirements from the source code. B-882?-883@@@$ İ@@'@@ @@# H.858=@ @@Ш@г$listQ.858LR.858P@г#)Parameter\.858@].858I@(`.858Ja.858K@@@2 @@@7  @@:@@ @-@#))$k/8R8X@#@@Ш@г,!tt/8R8[u/8R8\@@4 @@7@@ @3@#//&}288@@@Ш@г2(Variable288288@:288288@@>288288@ @@H  @@K@@! @C\A@@@@@@@@@@@#<<3699@$@@Ш@г?&Symbol699699@G699699@@K699699@ @@U D @@X@@ G@PNM@MM@@@M@M@#IID:::@5@@Ш@гL$bool::::::@@T a@@W@@ d@SQP@PP@@@P@P@#LLE?;;@6@@Ш@гO)Debuginfo?;;?;;@V?;;?;;@@@^ @@a@@  @[;ȐYX@XX@@@X@X@#TTMA<<%@>@@Ш@гW&LambdaA<<( A<<.@^#A<@/ Integer cases N=> N=>@@@@@@@b@)numblocksi@@K#Int#Set!t@@@@O>> O>>>@3; Number of tag block cases  O>>? O>>_@@@@@@@c@&blocksj@@}@@@@C@ 1@@@D@@E@@@G$P>`>b%P>`>z@\1 Tag block cases 2P>`>{3P>`>@@@@@@@?d@*failactionk@@ P@@@J@@@LCQ>>DQ>>@{ Action to take if none matched QQ>>RQ>>@@@@@@@^e@@@A@@@@@ ~ {@@ m@#YM==@@@Ш@г'NumbershM==iM==@lM==mM==@@°qM==rM==@ @ưvM==wM==@@@ @@@@7 @ˠ?@@@@@@#ĠİN==@@@Ш@гǠ$listN=>N=>@В@г̠#intN==N==@@ &@@@гѠ!tN=>N=>@@ 1@@@ 2@@@ 3N==@@@@> 7@ڠw@@@@@@#ӠӰO>>)@@@Ш@г֠'NumbersO>>,O>>3@߰O>>4O>>7@@O>>8O>>;@ @O>><O>>=@@@ f@@@@A i@젰@@@@@@#P>`>h@@@Ш@г蠐$listP>`>uP>`>y@В@г#int P>`>l P>`>o@@ @@@г!tP>`>rP>`>s@@ @@@ @@@  P>`>k@@@@H @Tᐠ@@@@@@#-Q>>@@@Ш@г&option6Q>>7Q>>@г!t?Q>>@Q>>@@ İ@@@  Ű @@ @@M @{@@@@@@@A@ z x w@ w w@@@ w@ w@+  _U?? `U??@@;@@)bound_varV@@!t@@@nV??oV??1@@{f@*from_valueW@@!t@@@|W?2?4}W?2?L@@g@(to_valueX@@!t@@@X?M?OX?M?e@@h@)directionh@@(Asttypes.direction_flag@@@°Y?f?hY?f?@@i@$bodyi@@@@@ŰZ??Z??@@j@@@A@@@@@  @@ @#GG@V??#@?@@Ш@гJ(VariableV??&V??.@QV??/V??0@@@Y C@@\@@ F@V@#RRKW?2?>@J@@Ш@гU(VariableW?2?AW?2?I@\W?2?JW?2?K@@@d \@@g@@ _@a@#]]VX?M?W@U@@Ш@г`(VariableX?M?ZX?M?b@gX?M?cX?M?d@@@o u@@r@@ x@l@#hh_Y?f?q@^@@Ш@гk(AsttypesY?f?tY?f?|@pY?f?} Y?f?@@@z @@}@@ @u@#qqlZ??@k@@Ш@гt!tZ??u@@{ v@@~@@ @z@@A@ 5U␠ 3 2@ 2 2@@@ 2@ 2@+ 0 0.a@@/a@@@@;@@/Allocated_constj !t@@@@@?b@@@b@A@w { A single constant. These are never "simple constants" (type [const]) but instead more complicated constructions. McAANdA_A@@@@@@@Zk@%Blockk#Tag!t@@@ ̠ T@@@ @@@ @@ieAAjeAA@ x A pre-allocated block full of constants (either simple constants or references to other constants, see below). wfAAxgBBU@@@@@@@l@/Set_of_closuresz @@@ @@hBVBXhBVB|@ e A closed (and thus constant) set of closures. (That is to say, [free_vars] must be empty.) iB}BjBB@@@@@@@m@/Project_closure{ !t@@@ !t@@@ @@kBB @ᐠ y Selection of one closure from a constant set of closures. Analogous to the equivalent operation on expressions. lCCmC]C@@@@@@@n@@@A@@@@@  @@ @#b@@b@@@r@г/Allocated_constb@@b@A@b@A@@@T@@@@@@@@@@#eAAeAA@j@г#TageAAeAA@eAAeAA@@@w@@г$listeAA@г #constant_defining_value_block_fieldeAAeAA@@@@@@@@@>ː@@@@@@#hBVBZhBVBi@@г/set_of_closures!hBVBm@@@@@@Y搠@@@@@@#2kBB3kBB@{@г&Symbol>kBC?kBC @BkBC CkBC @@@Ȱ@@г*Closure_idOkBCPkBC@SkBCR@S@@ذT@@@@@@@@@@@A@a$_^@^^@@@^@^@+\\poCCqoCC@@;@@&Symbol| d!t@@@ @@pCCpCC@@o@%Const}@@@ @@qCCx@@p@@@A@@@@@{@@@x@#pCCpCC@@г &SymbolpCCpCC@'pCC%@&@@.+'@@@@)@#%%qCCqCC@@г'%constqCC@@.;@@@@+@@A@@@3@1@Ae@7Constant_defining_valueKsCCsCD@r@@УР,Identifiable!S,IdentifiabletDDtDD#@ tDD$tDD%@@3@byoL'= 3  _ @A@@!t)@!ttDD0tDD1@+ @;@@@A@@@4@@@@tDD+tDDK@@@@q@@@Aг 7constant_defining_value tDD4 @@. @@ @@"NL;@@@A@@@7H@@@@@@@A@ӱ!TOL@!tXL;@@@A@@@7`@@@@6utils/identifiable.mlii@Xi@b@@@@,Identifiabler@A@%equalY@@@@7_@@@@7^$boolE@@@7]@@7\@@7[@[HR[Hu@@/Stdlib__Hashtbl`@@$hashZ@@@@7Z#intA@@@7Y@@7X@@a@@'compare[@,@@@7W@1@@@7V#intA@@@7U@@7T@@7S@G\vH\v@@+Stdlib__MapA@@&output\@&Stdlib+out_channel@@@7R@P@@@7Q$unitF@@@7P@@7O@@7N@f^g^@@eC@@%print]@&Format)formatter@@@7M@m@@@7L@@@7K@@7J@@7I@__@@D@@@@i@B@s@@@P@!t@@@7G@@@@7F@@@7E@@7D@@7C@jcmjc@@@Q@@@@7B@@@7A@@7@@@|@{R@%$@@@7?@+*@@@7>|@@@7=@@7<@@7;@#@v@tS@sp@@@7:@>=@@@79p@@@78@@77@@76@6@j@iT@hg@@@75@RQ@@@74g@@@73@@72@@71@J@c@ӱ#SetUL@#elt^L;@@@Af!t@@@8P@@@@ll@@@@K@A@!t_L;@@@A#Set$Make{!t@@@8O@@@@@@@ L@A@%empty`@@@8N@@+Stdlib__SetE@@#adda@5@@@8M@@@@8L@@@8K@@8J@@8I@4@F@@)singletonb@@@@8H$@@@8G@@8F@B@#G@@&removec@"@@@8E@4@@@8D7@@@8C@@8B@@8A@U@6H@@%uniond@B@@@8@@G@@@8?J@@@8>@@8=@@8<@h@II@@%intere@U@@@8;@Z@@@8:]@@@89@@88@@87@{@\J@@(disjointf@h@@@86@m@@@85$boolE@@@84@@83@@82@@rK@@$diffg@~@@@81@@@@80@@@8/@@8.@@8-@@L@@(cardinalh@@@@8,#intA@@@8+@@8*@@M@@(elementsi@@@@8)$listK@@@8(@@@8'@@8&@@N@@'min_eltj@@@@8%@@@8$@@8#@@O@@+min_elt_optk@@@@8"&optionL@@@8!@@@8 @@8@@P@@'max_eltl@@@@8@@@8@@8@@Q@@+max_elt_optm@@@@8#@@@8@@@8@@8@@R@@&choosen@@@@8@@@8@@8@@S@@*choose_opto@ @@@8D@@@8@@@8@@8@/@T@@$findp@@@@8@!@@@8@@@8@@8 @@8 @B@#U@@(find_optq@"@@@8 @4@@@8 o.@@@8 @@@8@@8@@8@Z@;V@@*find_firstr@@<@@@8@@@8@@8@R@@@8H@@@8@@8@@7@s@TW@@.find_first_opts@@U@@@7@@@7@@7@k@@@7e@@@7@@@7@@7@@7@@rX@@)find_lastt@@s@@@7@@@7@@7@@@@7@@@7@@7@@7@@Y@@-find_last_optu@@@@@7,@@@7@@7@@@@7ݠ@@@7@@@7@@7@@7@@Z@@$iterv@@@@@7$unitF@@@7@@7@@@@7 @@@7@@7@@7@@[@@$foldw@@@@@7@#acc@1]@@7@@7@@@@7@  @@7@@7@@7@@\@@&filterx@@@@@7@@@7@@7@@@@7@@@7@@7@@7@@^@@*filter_mapy@@@@@7A@@@7@@@7@@7@@@@7@@@7@@7@@7@4@_@@)partitionz@@@@@7@@@7@@7@,@@@7@3@@@7Š@8@@@7@@7@@7@@7@V@7`@@%split{@6@@@7@H@@@7@O@@@7@@@@7@Z@@@7@@7@@7@@7@x@Ya@@(is_empty|@e@@@7@@@7@@7@@hb@@#mem}@g@@@7@y@@@7 @@@7@@7@@7@@|c@@%equal~@@@@7@@@@7 @@@7@@7@@7@@d@@'compare@@@@7@@@@7@@@7@@7@@7@@e@@&subset@@@@7@@@@7H@@@7@@7@@7@@f@@'for_all@@@@@7Y@@@7@@7@@@@7b@@@7@@7@@7@@g@@&exists@@@@@7s@@@7@@7@@@@7|@@@7@@7@@7@ @h@@'to_list@@@@7V@@@7@@@7@@7@@i@@+to_seq_from@@@@7@@@@7&Stdlib#Seq!t@@@7@@@7@@7@@7@<@k@@&to_seq@)@@@7#Seq!t&@@@7@@@7@@7@R@3l@@*to_rev_seq@?@@@7/#Seq!t<@@@7@@@7@@7@h@Im@@'add_seq@B#Seq!tO@@@7@@@7@b@@@7e@@@7@@7~@@7}@@dn@@&of_seq@]#Seq!tj@@@7|@@@7{{@@@7z@@7y@@zo@@&output@G+out_channel@@@7x@@@@7wD@@@7v@@7u@@7t@@M@@%print@^&Format)formatter@@@7s@@@@7r\@@@7q@@7p@@7o@@N@@)to_string@@@@7n&stringQ@@@7m@@7l@@O@@'of_list@$listK@@@7k@@@7j@@@7i@@7h@@P@@#map@@@@@7g@@@7f@@7e@@@@7d@@@7c@@7b@@7a@@Q@@@@l@u@@@ӱ#MapVL@#keyL;@@@A!t@@@9@@@@mm@@@@T@A@!tL;!a@3r@A@A#Map$Make!t@@@9I@B@@@@@@-U@A@%empty !a@3p@@@9@,@E@@#add@A@@@9@!a@3l@ @@@9! @@@9@@9@@9@@9@H@F@@+add_to_list@@@@9@!a@3d@8$listK@@@9@@@9C @@@9@@@9@@9@@9@@9@o@9G@@&update@C@@@9@@&optionL!a@3Y@@@9  @@@9@@9@m@@@9q@@@9@@9@@9@@9@@bH@@)singleton@l@@@9@!a@3S@@@9@@9@@9@@wI@@&remove@@@@9@!a@3M@@@9@@@9@@9@@9@@J@@%merge@@@@@9@W!a@3B@@@9@b!b@3@@@@9k!c@3>@@@9@@9@@9@@9@Ѡ@@@9@נ@@@9۠@@@9@@9@@9@@9@@K@@%union@@@@@9@!a@32@ @@@9@@9@@9@@9@@@@9@@@@9@@@9@@9@@9~@@9}@,@L@@(cardinal@!a@3-@@@9|@@@9{@@9z@@@ M@@(bindings@%!a@3(@@@9y@$@@@9x@@@9w@@@9v@@9u@^@(N@@+min_binding@C!a@3"@@@9t@>@@@9s@@@9r@@9q@w@AO@@/min_binding_opt@\!a@3@@@9p @[@@@9o@@@9n@@@9m@@9l@@_P@@+max_binding@z!a@3@@@9k@u@@@9j@@@9i@@9h@@xQ@@/max_binding_opt@!a@3@@@9g@@@@@9f@@@9e@@@9d@@9c@@R@@&choose@!a@3 @@@9b@@@@9a@@@9`@@9_@@S@@*choose_opt@ʠ!a@3@@@9^w@@@@9]@@@9\@@@9[@@9Z@@T@@$find@@@@9Y@!a@3@@@9X@@9W@@9V@@U@@(find_opt@@@@9U@!a@2@@@9T @@@9S@@9R@@9Q@2@V@@*find_first@@@@@9P$boolE@@@9O@@9N@$!a@2@@@9M@@@@9L@@@9K@@9J@@9I@X@"W@@.find_first_opt@@.@@@9H&@@@9G@@9F@H!a@2@@@9E@G@@@9D@@@9C@@@9B@@9A@@9@@@KX@@)find_last@@W@@@9?O@@@9>@@9=@q!a@2@@@9<@l@@@9;@@@9:@@99@@98@@oY@@-find_last_opt@@{@@@97s@@@96@@95@!a@2@@@94B@@@@93@@@92@@@91@@90@@9/@@Z@@$iter@@@@@9.@!a@2$unitF@@@9-@@9,@@9+@Ơ@@@9* @@@9)@@9(@@9'@@[@@$fold@@@@@9&@!a@2@#acc@2@@9%@@9$@@9#@@@@9"@  @@9!@@9 @@9@@\@@#map@@!a@2!b@2@@9@ @@@9 @@@9@@9@@9@.@]@@$mapi@@@@@9@!a@2!b@2@@9@@9@$ @@@9( @@@9@@9@@9@O@^@@&filter@@%@@@9@!a@2#@@@9@@9@@9@E @@@9I@@@9 @@9 @@9 @p@:_@@*filter_map@@F@@@9 @!a@2!b@2@@@9 @@9@@9@k@@@9o@@@9@@9@@9@@``@@)partition@@l@@@9@!a@2j@@@9@@9@@8@ @@@8@@@@8@@@@8@@8@@8@@8@@a@@%split@@@@8@!a@2@@@8@ @@@8@b@@@8@Ġ@@@8@@8@@8@@8@@b@@(is_empty@Р!a@2@@@8@@@8@@8@@c@@#mem@@@@8@!a@2@@@8@@@8@@8@@8@@d@@%equal@@!a@2y@@@@8@@8@@8@ @@@8@@@@8@@@8@@8@@8@@8@<@ e@@'compare@@!a@2o@ @@@8@@8@@8@/@@@8@5@@@8 /@@@8@@8@@8@@8@`@ *f@@'for_all@@6@@@8@!a@2e4@@@8@@8@@8@V @@@8>@@@8@@8@@8@@ Kg@@&exists@@W@@@8@!a@2\U@@@8@@8@@8@w @@@8_@@@8@@8@@8@@ lh@@'to_list@!a@2V@@@8T@@@@8Š@@@8@@@8@@8@@ i@@&to_seq@!a@2P@@@8&Stdlib#Seq!t@@@@8@@@8@@@8@@8@@ k@@*to_rev_seq@ɠ!a@2J@@@8$#Seq!t@@@@8@@@8@@@8@@8@@ l@@+to_seq_from@@@@8@!a@2C@@@8J#Seq!t@@@@8@@@8@@@8@@8@@8@+@ m@@'add_seq@c#Seq!t@ @@@8@!a@29@@8@@@8@' @@@8+@@@8@@8@@8@R@ n@@&of_seq@#Seq!t@1@@@8@!a@22@@8@@@8L@@@8@@8@s@ =o@@'of_list@@O@@@8@!a@2,@@8@@@8j@@@8@@8@@ V@@.disjoint_union"eq&optionL@!a@2@$boolE@@@8@@8@@8@@@8%print@ {&Format)formatter@@@8@ v@@@8@@8@@8@@@8@)@@@8@/@@@83@@@8@@8@@8@@8@@8@@ W@@+union_right@!a@2@@@8@Ơ @@@8ʠ@@@8@@8@@8@@ X@@*union_left@֠!a@2@@@8@ @@@8@@@8@@8@@8@ @ Y@@+union_merge@@!a@2@@@8@@8@ @@@8@@@@8@@@8@@8@@8@@8~@+@ ;Z@@&rename@@@@8}@@@8|@@@@8{ @@@8z@@8y@@8x@B@ R[@@(map_keys@@@@@8w@@@8v@@8u@1!a@1@@@8t9@@@8s@@8r@@8q@`@ p\@@$keys@E!a@1@@@8p 4#Set$Make !t@@@8o@@8n@z@ ]@@$data@_!a@1@@@8mŠ @@@8l@@8k@@ ^@@&of_set@@e@@@8j!a@1@@8i@ f#Set$Make -!t@@@8h@@@8g@@8f@@8e@@ _@@7transpose_keys_and_data@@@@8d@@@8c@@@8b@@@8a@@8`@@ `@@;transpose_keys_and_data_set@@@@8_@@@8^ #Set$Make c!t@@@8]@@@8\@@8[@@ a@@%print@@ &Format)formatter@@@8Z@!a@1 @@@8Y@@8X@@8W@ &Format)formatter@@@8V@@@@8U @@@8T@@8S@@8R@@8Q@@ !b@@@@ &m@ $v@@@ӱ#TblWL@#keyL;@@@A !t@@@:B@@@@ ;n <n@@@@ :h@A@!tL;!a@4@A@A 'Hashtbl$Make !t@@@:AO@B@@@@@@ Ti@A@&create@ 5@@@:@&!a@4@@@:?@@:>@2@ Ne@@%clear@!a@4@@@:=$unitF@@@:<@@:;@H@ df@@%reset@'!a@4@@@::@@@:9@@:8@\@ xg@@$copy@;!a@4 @@@:7C@@@:6@@:5@p@ h@@#add@O!a@4@@@:4@@@@:3@ F@@@:2@@:1@@:0@@:/@@ i@@&remove@k!a@4@@@:.@@@@:-_@@@:,@@:+@@:*@@ j@@$find@!a@3@@@:)@5@@@:( @@:'@@:&@@ k@@(find_opt@!a@3@@@:%@J@@@:$&optionL@@@:#@@:"@@:!@@ l@@(find_all@!a@3@@@: @f@@@:$listK@@@:@@:@@:@@ m@@'replace@Ѡ!a@3@@@:@@@@:@ @@@:@@:@@:@@:@ @ )n@@#mem@!a@3@@@:@@@@: G@@@:@@:@@:@&@ Bo@@$iter@@@@@:@!a@3@@@:@@:@@: @ @@@: @@@: @@: @@: @G@ cp@@2filter_map_inplace@@@@@:@!a@3@@@:@@:@@:@8@@@:#@@@:@@:@@:@i@ q@@$fold@@@@@:@!a@3@#acc@3@@9@@9@@9@[@@@9@  @@9@@9@@9@@ r@@&length@i!a@3@@@9 @@@9@@9@@ s@@%stats@}!a@3@@@9 *statistics@@@9@@9@@ t@@&to_seq@!a@3@@@9&Stdlib#Seq!t@Q@@@9@@@9@@@9@@9@@ u@@+to_seq_keys@@@3@@@9"#Seq!tl@@@9@@@9@@9@@v@@-to_seq_values@Ѡ!a@3@@@9=#Seq!t @@@9@@9@ @&w@@'add_seq@!a@3@@@9@W#Seq!t@@@@9堠@@@9@@@9@@@9@@9@@9@1@Mx@@+replace_seq@!a@3@@@9@~#Seq!t@@@@9ޠ@@@9@@@9@@@9@@9@@9@X@ty@@&of_seq@#Seq!t@@@@9ؠ@!a@3@@9@@@9L@@@9@@9@y@z@@'to_list@X!a@3@@@9 @>!t@@@9Ҡ@@@9@@@9@@9@@j@@'of_list@ @V!t@@@9Π@!a@3@@9@@@9@@@9@@9@@k@@&to_map@!a@3@@@9#Map$Make{!t@@@9@@9@@ l@@&of_map@#Map$Make!t!a@3@@@9 @@@9@@9@@&m@@'memoize@Π!a@3~@@@9@@@@@9 @@9@@@@9@@9@@9@@9@ @Bn@@#map@!a@3y@@@9@@ !b@3w@@9@@@9@@9@@9@'@^o@@@@cn(@aw@@@@@@@'sCC@@A+$exprM'vDMDR'vDMDV@@;@@"$A @@@:D@@@@'vDMDM'vDMDZ@@@@'s@@@Aг !t'vDMDY @@3''''''''@@A@@A@@us@fd@NL@20@@@@@@@@@@@A@A@@@@zx@ig@XV@GE@31@" @@ @  @  @  @  @  @  @  @  ~@ i g@ M K@ 6 4@  @  @  @  @  @  @ v t@ i g@ W U@ E C@ 3 1@ ! @  @  @  @  @  @  @  @ o m@ [ Y@ E C@ 6 4@ # !@@@  @@ @  A@  A@  @  @  @  @ o m@ \ Z@ E C@  @  @  @  @  @  @ k i@ O M@ 8 6@  @  @@@@@][@<:@@@@@@xv@PN@><@'%@@@@@@ge@HF@$"@@@@~@hf@PN@20@@@@@@@@@@\Z@@Y@WUA@IGA@1/@@ @@@@@@@nl@US@><@@@@@@@~@jh@EC@ @@@@@@yw@@@_]@@@@[$S;@@@A[@@@:I@:C@@@@P@@@M@AFO@@Q@@3((((((((@D@ARQ@A+,program_bodyN)|EiEn)|EiEz@@;@@*Let_symbol萠!t@@@:K @@@:L@@@:M@@)}E}E)}E}E@'S ; Define the given symbol to have the given constant value. ))~EE)*~EF@@@@@@@)6u@.Let_rec_symbol鐠(@$!t@@@:N@ I@@@:O@@:P@@@:RO@@@:S@@)MFF)NFFR@' 6 As for [Let_symbol], but recursive. This is needed to treat examples like this, where a constant set of closures is lifted to toplevel: let rec f x = f x After lifting this produces (in pseudo-Flambda): Let_rec_symbol set_of_closures_symbol = (Set_of_closures { f x -> let applied_function = Symbol f_closure in Apply (applied_function, x) }) and f_closure = Project_closure (set_of_closures_symbol, f) Use of [Let_rec_symbol], by virtue of the special handling in [Inline_and_simplify.define_let_rec_symbol_approx], enables the approximation of the set of closures to be present in order to correctly simplify the [Project_closure] construction. (See [Inline_and_simplify.simplify_project_closure] for that part.) )[FSFU)\III@@@@@@@)hv@1Initialize_symbolꐠN!t@@@:T!t@@@:U(ߠ"@@@:V@@@:X@@@:Y@@)II)II@' Define the given symbol as a constant block of the given size and tag; but with a possibly non-constant initializer. The initializer will be executed at most once (from the entry point of the compilation unit). )II)JJ@@@@@@@)w@&Effect될"@@@:Z@@@:[@@)JJ)JJ@'ڐ Cause the given expression, which may have a side effect, to be executed. The resulting value is discarded. [Effect] constructions are never re-ordered. )JJ)KrK@@@@@@@)x@#End쐠!t@@@:\@@)KK)KK@' T [End] accepts the root symbol: the only symbol that can never be eliminated. )KK)KL@@@@@@@)y@@@A@@@@@)|EiEi@(  A "program" is the contents of one compilation unit. It describes the various values that are assigned to symbols (and in some cases fields of such symbols) in the object file. As such, it is closely related to the compilation of toplevel modules. )xD\D\){E=Eh@@@@@@@@@)t@@#ߠ߰)}E}E)}E}E@@гᠡ&Symbol)}E}E)}E}E@)}E}E)}E}E@@@3))))))))@Ke_;@@@A@@@@@.,@@@A @@г7constant_defining_value*}E}E*}E}E@@@@г,program_body*}E}E@@@@@@(I)֐@@@@@@#*"FF*#FF@@г$list*,FF?*-FFC@В@г&Symbol*;FF*<FF!@*?FF"*@FF#@@@H@@@г7constant_defining_value*KFF&*LFF=@@ S@@@T@@@U*PFF$@@г ,program_body*XFFF @@_ @@@@(*  @  @@@ @ @#*iII*jII@@г &Symbol*uII*vII@*yII*zII@@@@@г#Tag*II*II@*II*II@@@"@@г$list*II*II@г"!t*II*II@@*@@@/ @@г',program_body*II(@@.)@@@@+(*n)(@((@@@(@(@#$$*JJ*JJ@ @г&!t*JJ*JJ@@.̰@@г+,program_body*JJ,@@2հ-@@@@/)*-,@,,@@@,@,@#((*KK*KK@@г*&Symbol*KK*KK@1*KK/@0@@81@@@@3)(*10@00@@@0@0@@A@,)3*+*@**@@@*@*@@3********@ @A8I@A+'programO+LL+LL@@;@@0imported_symbols@@ #Set!t@@@:+$LL+%LL5@@+1{@,program_body@@2@@@:+0L6L8+1L6LT@@+=|@@@A@@@@@+4LL+5LULV@@@@+Az@@#!!+<LL%@@@Ш@г$&Symbol+ILL(+JLL.@,+MLL/+NLL2@@0+RLL3+SLL4@ @@:3+?+>+>+?+?+?+?+?@\\VI;@@@A@@@@@'@@@$@A@@B@@:@:@#661+aL6LD@0@@Ш@г9,program_body+jL6LG+kL6LS@@A@@D@@:@@@@A@<@@3+Y+X+X+Y+Y+Y+Y+Y@@A=<@.free_variables+yMJMN+zMJM\@б5ignore_uses_as_calleeг+$unit+M]My+M]M}@@ @@@:3+u+t+t+u+u+u+u+u@6~x@A@@б7ignore_uses_as_argumentг+0$unit+M~M+M~M@@ @@@:@@б:ignore_uses_in_project_varг+A$unit+MM+MM@@ @@@:$@@б@г$Š!t+MM+MM@@ @@@:3@@г) #Set!t(Variable+MM+MM@ +MM+MM@@+MM+MM@ @@@@@:R@@@%@@:U( @@B+3;@@@: @@:]+MM@@\ T@@@:@@:e+M~M@@wo@@@:@@:m+M]Mb"@@ @+MJMJ%@*3 Compute the free variables of a term. (This is O(1) for [Let]s). If [ignore_uses_as_callee], all free variables inside [Apply] expressions are ignored. Likewise [ignore_uses_in_project_var] for [Project_var] expressions. , LXLX, MGMI@@@@@@@,}@@5@*C+А@@@@@@4free_variables_named, NN ,!NN4@б:ignore_uses_in_project_varг+Ġ$unit,-N5NV,.N5NZ@@ @@@:3,,,,,,,,@:@A@@б@г#%named,>N[N`,?N[Ne@@ @@@:@@г)#Set!t(Variable,SNfNk,TNfNs@ ,WNfNt,XNfNw@@,\NfNx,]NfNy@ @@@@@:0@@@%@@:3( @@D<@@@: @@::,mN5N:@@ @,pNN@* 3 Compute the free variables of a named expression. ,}MM,~MN@@@@@@@,~@@$@*,D@@@@@@Z.used_variables,NN,NN@б5ignore_uses_as_calleeг,8$unit,NN,NN@@ @@@:3,,,,,,,,@u:@A@@б7ignore_uses_as_argumentг,K$unit,NO ,NO@@ @@@:@@б:ignore_uses_in_project_varг,\$unit,OO2,OO6@@ @@@:$@@б@г%ࠐ!t,O7O<,O7O=@@ @@@:3@@г*;#Set!t(Variable,O>OC,O>OK@ ,O>OL,O>OO@@,O>OP,O>OQ@ @@@@@:R@@@%@@:U( @@B:@@@: @@:\-OO@@[#S@@@:@@:d- NN@@v+n@@@:@@:l-NN!@@ @-NN$@+M 9 Compute _all_ variables occurring inside an expression. -#N{N{-$N{N@@@@@@@-0@@4@+],ꐠ@@@@@@4used_variables_named-:OO-;OO@б:ignore_uses_in_project_varг,ޠ$unit-GOO-HOO@@ @@@:3-6-5-5-6-6-6-6-6@:@A@@б@г$Ƞ%named-XOO-YOO@@ @@@:@@г*#Set!t(Variable-mOO-nOO@ -qOO-rOO@@-vOO-wOO@ @@@@@:0@@@%@@:3( @@D<@@@: @@::-OO@@ @-OO@+ > Compute _all_ variables occurring inside a named expression. -OSOS-OSO@@@@@@@-@@$@+-^@@@@@@Z,free_symbols-OO-OP@б@г$expr-OP -OP @@ @@@:3--------@s8@A@@г"#Set!t&Symbol-OP-OP@ -OP-OP@@-OP-OP@ @@@@@:!@@@'@@:$* @@@-OO @@-@@@@*2free_symbols_named-PP#-PP5@б@г%k%named-PP8-PP=@@ @@@:3--------@CX@A@@г"#Set!t&Symbol.PPA.PPG@ .PPH.PPK@@.PPL.PPM@ @@@@@:!@@@'@@:$* @@@.'PP @@.3@@@@*4free_symbols_program.2POPS.3POPg@б@г*'program.=POPj.>POPq@@ @@@:3.,.+.+.,.,.,.,.,@CX@A@@г#0#Set!t&Symbol.TPOPu.UPOP{@ .XPOP|.YPOP@@.]POP.^POP@ @@@@@:!@@@'@@:$* @@@.iPOPO @@.u@@@@*0fold_lets_option.tQQ.uQQ@б@г'!t.QQ.QQ@@ @@@:3.n.m.m.n.n.n.n.n@CX@A@@б$initА!a@:P@:.QQ.QQ@@б1for_defining_exprб@А!a.QQ.QQ@@б@г,!t(Variable.QQ.QQ@ .QQ.QQ@@@@@@:5 @@б@г&3%named.QQ.QQ@@ @@@:D@@В@А!aBL.QR.QR@@@г,5!t(Variable.QR.QR @ .QR.QR@@@@@@:f @@@г&d%named.QR.QR@@ @@@:u@@@@p@@ @@:~2@@@@ @@:C@@@R@@:Z@@@}@@:l@@б-for_last_bodyб@А!a/RR-/RR/@@б@г(-!t/!RR3/"RR4@@ @@@:@@В@г(>!t/2RR8/3RR9@@ @@@:@@@А!b@:P@:/CRR</DRR>@@@@@@@:ǰ@@@+ @@:ʰ. @@@@@:Ͱ<@@б4filter_defining_exprб@А!bװ/\RR/]RR@@б@г,!t(Variable/kRR/lRR@ /oRR/pRR@@@@@@: @@б@г&%named/RR/RR@@ @@@:@@б@г,#Set!t(Variable/RR/RR@ /RR/RR@@/RR/RR@ @@@@@:!@@В@А!bp)/RR/RR@@@г-!t(Variable/RR/RS@ /RS/RS@@@@@@:C @@@г/&option/RS/RS@г'K%named/RS /RS@@ @@@:\@@@@@@:a @@@@@(@ @@:jA@@@O @@:m\ @@@s@@:pv#@@@@@:s&@@@@@:v)@@В@г)!t0SS0SS@@ @@@:@@@А!b0SS!0SS#@@@@@@@:@@% @@:0RR @@@@:0"RR@@@@:0&QQ@@@@:0*QQ@@@@@:@@@00QQ@.g  Used to avoid exceeding the stack limit when handling expressions with multiple consecutive nested [Let]-expressions. This saves rewriting large simplification functions in CPS. This function provides for the rewriting or elimination of expressions during the fold. 0=PP0>QbQ@@@@@@@0J@@.@.w0@@@@@@(map_lets0TSUSY0USUSa@б@г)k!t0_SbSg0`SbSh@@ @@@:30N0M0M0N0N0N0N0N@8@A@@б1for_defining_exprб@г-!t(Variable0xSiS0ySiS@ 0|SiS0}SiS@@@@@@: @@б@г'%named0SiS0SiS@@ @@@:-@@г( %named0SiS0SiS@@ @@@::@@@@@:=@@@%@@:@- @@б-for_last_bodyб@г)!t0SS0SS@@ @@@:S@@г)ˠ!t0SS0SS@@ @@@:`@@@@@:c@@б-after_rebuildб@г)᠐!t0SS0SS@@ @@@:v@@г)!t0SS0SS@@ @@@:@@@@@:@@г)!t0SS0SS@@ @@@:@@0@@:0SS @@W9@@:0SS @@`@@:1SiSn@@@@@:@@@1 SUSU@/@ * Like [fold_lets_option], but just a map. 1S%S%1S%ST@@@@@@@1#@@'@/P0ݐ@@@@@@)iter_lets1-T T1.T T@б@г*D!t18TT 19TT!@@ @@@:31'1&1&1'1'1'1'1'@8@A@@б1for_defining_exprб@г.!t(Variable1QT"T:1RT"TB@ 1UT"TC1VT"TD@@@@@@; @@б@г(ՠ%named1eT"TH1fT"TM@@ @@@;-@@г1 $unit1rT"TQ1sT"TU@@ @@@;:@@@@@;=@@@%@@;@- @@б-for_last_bodyб@г*!t1TWTk1TWTl@@ @@@;S@@г1/$unit1TWTp1TWTt@@ @@@;`@@@@@;c@@б,for_each_letб@г*!t1TvT1TvT@@ @@@;v@@г1R$unit1TvT1TvT@@ @@@; @@@@@; @@г1b$unit1TT1TT@@ @@@; @@0@@; 1TvT{ @@W9@@; 1TWT\ @@`@@;1T"T'@@@@@;@@@1T T @0 ( Like [map_lets], but just an iterator. 1SS1ST @@@@@@@1@@'@0)1@@@@@@*create_let2UU2UU!@б@г/j!t(Variable2UU$2UU,@ 2UU-2UU.@@@@@@;32 222 2 2 2 2 @A@A @@б@г)%named2+UU22,UU7@@ @@@;@@б@г+F!t2:UU;2;UU<@@ @@@; @@г+S!t2GUU@2HUUA@@ @@@;-@@@@@;0@@@%@@;3( @@@9@@;6A@@@2XUU@0 n Creates a [Let] expression. (This computes the free variables of the defining expression and the body.) 2eTT2fTU@@@@@@@2r@@!@02,@@@@@@U8map_defining_expr_of_let2|UU2}UU@б@г+r(let_expr2UU2UU@@ @@@;32v2u2u2v2v2v2v2v@n8@A@@б!fб@г* %named2UU2UU@@ @@@;@@г*%named2UU2UU@@ @@@;"@@@@@;%@@г+Š!t2UV2UV@@ @@@;2@@0@@;52UU @@@<@@;9? @@@2UU@0 w Apply the specified function [f] to the defining expression of the given [Let]-expression, returning a new [Let]. 2UCUC2UU@@@@@@@2@@@12@@@@@@X3With_free_variablesP2VV2VV@2@@БA+!tQ2VV2VV@А!a@;322222222@}D;@@;@A@A@G@B@@@3VV@@@@3@@A3VV3VV@@BA@;@A-A@G@B@@@ @@@ @@A@ @@333333333@@A  @7of_defining_expr_of_let3&VV3'VV@б@г,(let_expr31VV32VV@@ @@@;"33 333 3 3 3 3 @/? @A@@гC!t3@VV3AVV@г*%named3JVV3KVV@@ @@@;#@@@@@@;% @@@$@@;&!'@@@3ZVV@1, O(1) time. 3gVV3hVV@@@@@@@3t@@*@13.@@@@@@@.of_body_of_let3~W W3W W@б@г,t(let_expr3W W"3W W*@@ @@@;'33x3w3w3x3x3x3x3x@Yn8@A@@г!t3W W33W W4@г $expr3W W.3W W2@@ @@@;(@@@@@@;* @@@$@@;+!'@@@3W W @1鐠, O(1) time. 3VV3VW @@@@@@@3@@*@13@@@@@@@'of_expr3WW3WW@б@г E$expr3WW3WX@@ @@@;,333333333@Yn8@A@@г!t3WX 3WX @г ^$expr3WX3WX@@ @@@;-@@@@@@;/ @@@$@@;0!'@@@4 WW@2A Takes the time required to calculate the free variables of the given term (proportional to the size of the term, except that the calculation for [Let] is O(1)). 4W6W84WW@@@@@@@4$@@*@2Q3ސ@@@@@@@(of_named4.X X4/X X@б@г+%named49X X4:X X"@@ @@@;134(4'4'4(4(4(4(4(@Yn8@A@@гK!t4HX X,4IX X-@г+ %named4RX X&4SX X+@@ @@@;2@@@@@@;4 @@@$@@;5!'@@@4bX X@@4n@@@@' create_let_reusing_defining_expr4mXX4nXX@б@г1!t(Variable4|XX4}XX@ 4XX4XX@@@@@@;634p4o4o4p4p4p4p4p@I^(@A @@б@г!t4XX4XX@г, %named4XX4XX@@ @@@;7@@@@@@;9  @@б@г $expr4XX4XX@@ @@@;:/@@г !$expr4 XX4 XX@@ @@@;;<@@@@@;<?@@@&@@;=B- @@@H@@;>EP@@@4XX@3 T Takes the time required to calculate the free variables of the given [expr]. 4X/X14XzX@@@@@@@4@@!@34@@@@@@d7create_let_reusing_body4 YIYO4 YIYf@б@г2V!t(Variable5YgYn5YgYv@ 5YgYw5YgYx@@@@@@;?344444444@A@A @@б@г,%named5YyY5YyY@@ @@@;@@@б@г)!t5&YY5'YY@г $expr50YY51YY@@ @@@;A*@@@@@@;C/ @@г $expr5BYY5CYY@@ @@@;D<@@@@@;E?@@@4@@;FB7 @@@H@@;GEP@@@5S YIYK@3 U Takes the time required to calculate the free variables of the given [named]. 5` XX5a Y7YH@@@@@@@5m@@!@35'@@@@@@d7create_let_reusing_both5wYY5xYY@б@г2!t(Variable5YY5YY@ 5YY5YY@@@@@@;H35z5y5y5z5z5z5z5z@A@A @@б@г!t5YY5YY@г-%named5YY5YY@@ @@@;I@@@@@@;K  @@б@г!t5YZ5YZ@г($expr5YY5YY@@ @@@;L9@@@@@@;N> @@г:$expr5ZZ 5ZZ @@ @@@;OK@@@@@;PN@@@5@@;QQ< @@@W@@;RT_@@@5YY@4, O(1) time. 5YY5YY@@@@@@@6@@!@4.5@@@@@@s$expr6 ZBZH6 ZBZL@б@г!t6ZBZT6ZBZU@г$expr6 ZBZO6!ZBZS@@ @@@;S366666666@B@A@@@ @@@;U @@г7!t64ZBZ_65ZBZ`@г-%named6>ZBZY6?ZBZ^@@ @@@;V@@@@@@;X# @@@#@@;Y&,@@@6NZBZD@4 + The equivalent of the [Expr] constructor. 6[ZZ6\ZZA@@@@@@@6h@@*@46"@@@@@@E(contents6rZbZh6sZbZp@б@г!t6}ZbZv6~ZbZw@А!a@;_R@;Z36r6q6q6r6r6r6r6r@d>@A6ZbZs6ZbZu@@@ @@@;\ @@А!a 6ZbZ{6ZbZ}@@@ @@;]@@@6ZbZd@@6@@ @@.free_variables6 ZZ6 ZZ@б@г!t6 ZZ6 ZZ@@@@;`366666666@2M @A6 ZZ6 ZZ@@@ @@@;b @@г4$#Set!t(Variable6 ZZ6 ZZ@ 6 ZZ6 ZZ@@6 ZZ6 ZZ@ @@@@@;c(@@@&@@;d+) @@@6 ZZ @5, O(1) time. 6ZZ6ZZ@@@@@@@7@@@5.6@@@@@@J@ A@@Y@9@@C@#@.@@|@u4@@377777777@aw6@A377777777@@A7VV7!ZZ@@5V6㐠 v A module for the manipulation of terms where the recomputation of free variable sets is to be kept to a minimum. 7-VV7.VOV@@@@@@@70VV@@;create_function_declaration7:%[B[F7;%[B[a@б¶msг6$list7G&[b[z7H&[b[~@г&!t)Parameter7U&[b[n7V&[b[w@ 7Y&[b[x7Z&[b[y@@@@@@;e37I7H7H7I7I7I7I7I@Xx@lMA@E@@c@C @@ @@n)@ @@@5XW@WW@@@W@W@T@A/*@@@D+@@@;g)4A@@б$bodyг0!t7'[[7'[[@@ @@@;h:@@б$stubг7M$bool7([[7([[@@ @@@;iK@@б#dbgг4!t)Debuginfo7)[[7)[[@ 7)[[7)[[@@@@@@;je @@б&inlineг40inline_attribute&Lambda7*[[7*[[@ 7*[[7*[[@@@@@@;k @@б*specialiseг54specialise_attribute&Lambda7+[[7+[[@ 7+[[7+[[@@@@@@;l @@б,is_a_functorг7$bool8,[\8,[\@@ @@@;m@@б.closure_originг&!t.Closure_origin8-\\*8-\\8@ 8-\\98-\\:@@@@@@;nİ @@б$pollг5I.poll_attribute&Lambda83.\;\E84.\;\K@ 87.\;\L88.\;\Z@@@@@@;oް @@г/u4function_declaration8E/\[\`8F/\[\t@@ @@@;p@@'@@;q8N.\;\@ @@E1@@;r8R-\\ @@ZO@@;s8V,[\@@xd@@;t8Z+[[@@@@;u8^*[[@@@@;v8b)[[@@@@;w8f([[!@@@@;x 8j'[[%@@/@@;y8n&[b[g)@@@8q%[B[B,@6 w Create a function declaration. This calculates the free variables and symbols occurring in the specified [body]. 8~#ZZ8$[[A@@@@@@@8@@<@68E@@@@@@.;update_function_declaration 82\\82\\@б@г/Р4function_declaration83\\83\\@@ @@@;z388888888@Gq8@A@@б¶msг8$list84\]84\]@г'!t)Parameter84\]84\]@ 84\]84\]@@@@@@;{& @@@ @@@;}+@@б$bodyг1蠐!t85]]!85]]"@@ @@@;~<@@г04function_declaration86]#](86]#]<@@ @@@;I@@@@;L85]] @@K)@@;P84\\ @@@W@@;TZ@@@82\\@73 E Create a function declaration based on another function declaration 9 1\v\v9 1\v\@@@@@@@9@@#@7C8А@@@@@@s]>98]>]@@@@@@@9@@ @79R@@@@@@h (create_function_declarations_with_origin 9@^i^m9@^i^@б/is_classic_modeг9W$bool9A^^9A^^@@ @@@;399999999@:@A@@б$funsг7#Map!t(Variable9B^^9B^^@ 9B^^9B^^@@9B^^9B^^@ @г14function_declaration9B^^9B^^@@ @@@;/@@@)@@@;4 @@б6set_of_closures_originг)!t6Set_of_closures_origin9C^^9C^_@ 9C^_9C^_@@@@@@;N @@г1B5function_declarations: D__: D__-@@ @@@;[@@'@@;^:C^^ @@]2@@;b:B^^ @@ti@@;f:A^^@@@:@^i^i@8U P Create a set of function declarations with a given set of closures origin. :+>^^:,?^Z^h@@@@@@@:8@@$@8e9򐠠@@@@@@ #update_body_of_function_declaration :BG_f_j:CG_f_@б@г1}4function_declaration:MH__:NH__@@ @@@;3:<:;:;:<:<:<:<:<@8@A@@б$bodyгĠ$expr:`I__:aI__@@ @@@;@@г14function_declaration:mJ__:nJ__@@ @@@; @@@@;#:vI__ @@@*@@;'- @@@:|G_f_f@8 1 Change only the code of a function declaration. :F_/_/:F_/_e@@@@@@@:@@@8:P@@@@@@F &update_function_decl's_params_and_body :N```d:N```@б@г1۠4function_declaration:O``:O``@@ @@@;3::::::::@_t8@A@@б¶msг:$$list:P``:P``@г)!t)Parameter:P``:P``@ :P``:P``@@@@@@;& @@@ @@@;+@@б$bodyгK$expr:Q``:Q``@@ @@@;<@@г2$4function_declaration:R``:R``@@ @@@;I@@@@;L:Q`` @@K)@@;P;P`` @@@W@@;TZ@@@;N````@9> @ Change only the code and parameters of a function declaration. ;L__;L_`@@@@@@@;!@@#@9N:ې@@@@@@sld]d@@ @@@;a@@@)@@@;f @@б6direct_call_surrogatesг:#Map!t(Variable=[mdd=\mdd@ =_mdd=`mdd@@=dmdd=emdd@ @г:!t(Variable=smdd=tmdd@ =wmdd=xmdd@@@@@@; @@@2@@@;@@г4ؠ/set_of_closures=ndd=ndd@@ @@@;@@H@@;=mdd @@~S@@;=ld]db @@@@;=kd0d5@@@@;=jdd @@@=icc@;ِ r Create a set of closures. Checks are made to ensure that [free_vars] and [specialised_args] are reasonable. =gcscs=hcc@@@@@@@=@@(@;=v@@@@@@+used_params=reBeF=reBeQ@б@г54function_declaration=reBeT=reBeh@@ @@@;3========@ 8@A@@г;:#Set!t(Variable=reBel=reBet@ =reBeu=reBex@@=reBey=reBez@ @@@@@;!@@@'@@;$* @@@=reBeB @<4 _ Given a function declaration, find which of its parameters (if any) are used in the body. > pdd> qe%eA@@@@@@@>@@@"te|e>#te|e@@;@@'Is_expr7?@@@;@@>1uee>2uee@@>>@(Is_named5@@@;@@>?vee>@vee@@>L@@@A@@@@@>Cte|e|@@@@>O@@#  >Juee>Kuee@@г"!t>Tuee#@@)3>?>>>>>?>?>?>?>?@]:;@@@A@@@@@@@@@A)@@@@+@#''>_vee>`vee@ @г)%named>ivee*@@0+@@@@-@@A@)@@3>U>T>T>U>U>U>U>U@@A*-@,iter_general>uzfFfJ>vzfFfV@б(toplevelг>*$bool>{fWfe>{fWfi@@ @@@;3>q>p>p>q>q>q>q>q@2ke@A@@б@б@г7!t>|fjfp>|fjfq@@ @@@;@@г>9$unit>|fjfu>|fjfy@@ @@@; @@@@@;#@@б@б@г6&%named>}f{f>}f{f@@ @@@;4@@г>Z$unit>}f{f>}f{f@@ @@@;A@@@@@;D@@б@г+maybe_named>~ff>~ff@@ @@@;S@@г>y$unit>ff>ff@@ @@@;`@@@@@;c@@@$@@;f>}f{f @@@I@@;j>|fjfo@@|q@@;n>{fWf\@@@>zfFfF@=0 This function is designed for the internal use of [Flambda_iterators]. See that module for iterators to be used over Flambda terms. ?xee?yffE@@@@@@@?@@'@=@>͐@@@@@@%print?ff?ff@б@г=&Format)formatter?,ff?-ff@ ?0ff?1ff@@@@@@C3? ??? ? ? ? ? @A@A @@б@г8N!t?Bff?Cff@@ @@@C@@г>栐$unit?Off?Pff@@ @@@C@@@@@C!@@@'@@C$/ @@@?]ff@@?i@@@@*+print_named?hff?iff@б@г=&Format)formatter?wff?xff@ ?{ff?|ff@@@@@@C3?k?j?j?k?k?k?k?k@Lj(@A @@б@г6%named?ff?fg@@ @@@C@@г?1$unit?fg?fg @@ @@@C@@@@@C!@@@'@@C $/ @@@?ff@@?@@@@*-print_program?g g?g g@б@г>1&Format)formatter?g g ?g g&@ ?g g'?g g0@@@@@@C 3????????@Lj(@A @@б@гŠ'program?g g4?g g;@@ @@@C @@г?|$unit?g g??g gC@@ @@@C @@@@@C !@@@'@@C$/ @@@?g g @@?@@@@*+print_const?gEgI?gEgT@б@г>|&Format)formatter@ gEgW@gEg]@ @gEg^@gEgg@@@@@@C3@@@@@@@@@Lj(@A @@б@г>%const@#gEgk@$gEgp@@ @@@C@@г?Ǡ$unit@0gEgt@1gEgx@@ @@@C@@@@@C!@@@'@@C$/ @@@@>gEgE@@@J@@@@*=print_constant_defining_value@Igzg~@Jgzg@б@г>&Format)formatter@Xgg@Ygg@ @\gg@]gg@@@@@@C3@L@K@K@L@L@L@L@L@Lj(@A @@б@г7n7constant_defining_value@ngg@ogg@@ @@@C@@г@$unit@{gg@|gg@@ @@@C@@@@@C!@@@'@@C$/ @@@@gzgz@@@@@@@*:print_function_declaration@gg@gg@б@г?&Format)formatter@gg@gh@ @gh@gh@@@@@@C3@@@@@@@@@Lj(@A @@б@В@г>!t(Variable@hh@hh@ @hh@hh@@@@@@C @@@г84function_declaration@hh!@hh5@@ @@@C-@@@@@ @@C4! @@г@$unit@h6h;@h6h?@@ @@@CA@@@@@CD1@@@J@@CGR @@@@gg@@A@@@@M;print_function_declarations AhAhEAhAh`@б@г?&Format)formatterAhahfAhahl@ AhahmAhahv@@@@@@C 3AAAAAAAA@o(@A @@б@г8_5function_declarationsA'hwh|A(hwh@@ @@@C!@@г@ˠ$unitA4hhA5hh@@ @@@C"@@@@@C#!@@@'@@C$$/ @@@ABhAhA@@AN@@@@*5print_project_closureàAMhhANhh@б@г?&Format)formatterA\hhA]hh@ A`hhAahh@@@@@@C%3APAOAOAPAPAPAPAP@Lj(@A @@б@г;/project_closureArhhAshh@@ @@@C&@@гA$unitAhhAhh@@ @@@C'@@@@@C(!@@@'@@C)$/ @@@Ahh@@A@@@@* !print_move_within_set_of_closuresĠAhhAhi@б@г@&Format)formatterAiiAii@ AiiAii(@@@@@@C*3AAAAAAAA@Lj(@A @@б@г;;move_within_set_of_closuresAi)i.Ai)iI@@ @@@C+@@гAa$unitAiJiOAiJiS@@ @@@C,@@@@@C-!@@@'@@C.$/ @@@Ahh@@A@@@@*1print_project_varŠAiUiYAiUij@б@г@a&Format)formatterAikipAikiv@ AikiwAiki@@@@@@C/3AAAAAAAA@Lj(@A @@б@г< +project_varBiiB ii@@ @@@C0@@гA$unitBiiBii@@ @@@C1@@@@@C2!@@@'@@C3$/ @@@B#iUiU@@B/@@@@*5print_set_of_closuresƠB.iiB/ii@б@г@&Format)formatterB=iiB>ii@ BAiiBBii@@@@@@C43B1B0B0B1B1B1B1B1@Lj(@A @@б@г9/set_of_closuresBSiiBTii@@ @@@C5@@гA$unitB`iiBaii@@ @@@C6@@@@@C7!@@@'@@C8$/ @@@Bnii@@Bz@@@@*4print_specialised_toǠByiiBzij@б@г@&Format)formatterBjj Bjj@ BjjBjj@@@@@@C93B|B{B{B|B|B|B|B|@Lj(@A @@б@г3BBBBBBBB@Ca@A@@б@гA7)call_kindBj^jcBj^jl@@ @@@C?@@гB$boolBjmjrBjmjv@@ @@@C@@@@@@CA!@@@'@@CB$* @@@Bj;j;@@C@@@@*4equal_specialised_toɠCjxj|Cjxj@б@г<ޠ.specialised_toCjjCjj@@ @@@CC3CBBCCCCC@CX@A@@б@г<.specialised_toC"jjC#jj@@ @@@CD@@гBנ$boolC/jjC0jj@@ @@@CE@@@@@CF!@@@'@@CG$* @@@C=jxjx@@CI@@@@*-compare_constʠCHjjCIjj@б@гAA%constCSjjCTjj@@ @@@CH3CBCACACBCBCBCBCB@CX@A@@б@гAR%constCdjjCejj@@ @@@CI@@гC1#intCqjjCrjj@@ @@@CJ@@@@@CK!@@@'@@CL$* @@@Cjj@@C@@@@*3compare_project_varˠCjjCjk @б@г=+project_varCjkCjk@@ @@@CM3CCCCCCCC@CX@A@@б@г=+project_varCjkCjk*@@ @@@CN@@гCs#intCjk.Cjk1@@ @@@CO@@@@@CP!@@@'@@CQ$* @@@Cjj@@C@@@@* #compare_move_within_set_of_closures̠Ck3k7Ck3kZ@б@г>;move_within_set_of_closuresCk[k`Ck[k{@@ @@@CR3CCCCCCCC@CX@A@@б@г>;move_within_set_of_closuresCk|kCk|k@@ @@@CS@@гC#intCkkCkk@@ @@@CT@@@@@CU!@@@'@@CV$* @@@Dk3k3@@D@@@@*7compare_project_closure͠DkkDkk@б@г>/project_closureDkkDkk@@ @@@CW3DDDDDDDD@CX@A@@б@г>/project_closureD*kkD+kk@@ @@@CX@@гC#intD7kkD8kk@@ @@@CY@@@@@CZ!@@@'@@C[$* @@@DEkk@@DQ@@@@*@BBA@B>B8A@AAA@@b@\A@??A@>>A@>>A@>^>XA@>+>%A@=l=fA@;9PB@=O7BB@=A6FB@;5B@;4kB@;3QB@<0B@<'/ B@;r.>B@;^,B@,@,e@,@@A@{uA@jdA@@a@k@K@@`@Y @[@;@d@9@@@ y  e@@ ` '@  @ ~ @  @ ` $@  @ { @@y@@@A@=@U@N @@z@s1@*@|@u3@,@@X@Q@@@O@H@@@@3DDDDDDDD@@A@ H************************************************************************DA@@DA@L@ H DBMMDBM@ H OCaml DCDC@ H DDDD3@ H Pierre Chambart, OCamlPro DE44DE4@ H Mark Shinwell and Leo White, Jane Street Europe DFDF@ H DGDG@ H Copyright 2013--2016 OCamlPro SAS EHEHg@ H Copyright 2014--2016 Jane Street Group LLC EIhhE Ih@ H EJEJ@ H All rights reserved. This file is distributed under the terms of EKEKN@ H the GNU Lesser General Public License version 2.1, with the ELOOELO@ H special exception on linking described in the file LICENSE. E ME!M@ H E&NE'N5@ H************************************************************************E,O66E-O6@ G* Intermediate language used for tree-based analysis and optimization. C I* Whether the callee in a function application is known at compile time. C] * Simple constants. ("Structured constants" are rewritten to invocations of [Pmakeblock] so that they easily take part in optimizations.) Bꠠ 9* [Char] is kept separate from [Int] to improve printing B 8* The application of a function to a list of arguments. B Q CR-soon mshinwell: rename func -> callee, and lhs_of_application -> callee EAcEBd'@ V* Instructions from the source code as to whether the callee should be inlined. BQ Z* Instructions from the source code as to whether the callee should be specialised. B8 m* The update of a mutable variable. Mutable variables are distinct from immutable variables in Flambda. A*>* The invocation of a method. @~ 2* For details on these types, see projection.mli. ? 1* See [free_vars] and [specialised_args], below. >Ӡ CR-someday mshinwell: move to separate module and make [Identifiable]. (Or maybe nearly Identifiable; having a special map that enforces invariants might be good.) EYG  EZI  @8* The "outer variable". ? * The [projecting_from] value (see projection.mli) of any [projection] must be another free variable or specialised argument (depending on whether this record type is involved in [free_vars] or [specialised_args] respectively) in the same set of closures. As such, this field describes a relation of projections between either the [free_vars] or the [specialised_args]. > j* Flambda terms are partitioned in a pseudo-ANF manner; many terms are required to be [let]-bound. This in particular ensures there is always a variable name for an expression that may be lifted out (for example if it is found to be constant). Note: All bound variables in Flambda terms must be distinct. [Flambda_invariants] verifies this. = H* Restrictions on [Lambda.Lstringswitch] also apply to [String_switch]. = G* Values of type [named] will always be [let]-bound to a [Variable.t]. <̠ * During the lifting of [let] bindings to [program] constructions after closure conversion, we generate symbols and their corresponding definitions (which may or may not be constant), together with field accesses to such symbols. We would like it to be the case that such field accesses are simplified to the relevant component of the symbol concerned. (The rationale is to generate efficient code and share constants as expected: see e.g. tests/asmcomp/staticalloc.ml.) The components of the symbol would be identified by other symbols. This sort of access pattern is feasible because the top-level structure of symbols is statically allocated and fixed at compile time. It may seem that [Prim (Pfield, ...)] expressions could be used to perform the field accesses. However for simplicity, to avoid having to keep track of properties of individual fields of blocks, [Inconstant_idents] never deems a [Prim (Pfield, ...)] expression to be constant. This would in general prevent field accesses to symbols from being simplified in the way we would like, since [Lift_constants] would not assign new symbols (i.e. the things we would like to simplify to) to the various projections from the symbols in question. To circumvent this problem we use [Read_symbol_field] when generating projections from the top level of symbols. Owing to the properties of symbols described above, such expressions may be eligible for declaration as constant by [Inconstant_idents] (and thus themselves lifted to another symbol), without any further complication. [Read_symbol_field] may only be used when the definition of the symbol is in scope in the [program]. For external unresolved symbols, [Pfield] may still be used; it will be changed to [Read_symbol_field] by [Inline_and_simplify] when (and if) the symbol is imported. 94* ANF escape hatch. 9 Z CR-someday mshinwell: use [letcont]-style construct to remove e.g. [While] and [For]. EtbbEu@ CR-someday mshinwell: try to produce a tighter definition of a "switch" (and translate to that earlier) so that middle- and back-end code for these can be reduced. EzE{Up@ x CR-someday mshinwell: remove [Expr], but to do this easily would probably require a continuation-binding construct. EqqE@  CR-someday mshinwell: Since we lack expression identifiers on every term, we should probably introduce [Mutable_var] into [named] if we introduce more complicated analyses on these in the future. Alternatively, maybe consider removing mutable variables altogether. EE@ { CR-someday mshinwell: we could consider having these be keys into some kind of global cache, to reduce memory usage. EZ\E@ I* A cache of the free variables in the defining expression of the [let]. 81 d* A cache of the free variables of the body of the [let]. This is an important optimization. 8 * The representation of a set of function declarations (possibly mutually recursive). Such a set encapsulates the declarations themselves, information about their defining environment, and information used specifically for optimization. Before a function can be applied it must be "projected" from a set of closures to yield a "closure". This is done using [Project_closure] (see above). Given a closure, not only can it be applied, but information about its defining environment can be retrieved (using [Project_var], see above). At runtime, a [set_of_closures] corresponds to an OCaml value with tag [Closure_tag] (possibly with inline [Infix_tag](s)). As an optimization, an operation ([Move_within_set_of_closures]) is provided (see above) which enables one closure within a set to be located given another closure in the same set. This avoids keeping a pointer to the whole set of closures alive when compiling, for example, mutually-recursive functions. <נ a CR-soon mshinwell: consider renaming [free_vars]. Also, it's still really confusing which side of this map to use when. "Vars bound by the closure" is the domain. Another example of when this is confusing: let bound_vars_approx = Variable.Map.map (Env.find_approx env) set.free_vars in in [Build_export_info]. E$$E& &(@ CR-soon mshinwell: I'd like to arrange these maps so that it's impossible to put invalid projection information into them (in particular, so that we enforce that the relation stays within the domain of the map). E&)&+E&'@ * Mapping from all variables free in the body of the [function_decls] to variables in scope at the definition point of the [set_of_closures]. The domain of this map is sometimes known as the "variables bound by the closure". 6 b* Parameters whose corresponding arguments are known to always alias a particular value. These are the only parameters that may, during [Inline_and_simplify], have non-unknown approximations. An argument may only be specialised to a variable in the scope of the corresponding set of closures declaration. Usually, that variable itself also appears in the position of the specialised argument at all call sites of the function. However it may also be the case (for example in code generated as a result of [Augment_specialised_args]) that the various call sites of such a function have differing variables in the position of the specialised argument. This is permissible *so long as it is certain they all alias the same value*. Great care must be taken in transformations that result in this situation since there are no invariant checks for correctness. As an example, supposing all call sites of f are represented here: [let x = ... in let f a b c = ... in let y = ... in f x y 1; f x y 1] the specialised arguments of f can (but does not necessarily) contain the association [a] -> [x], but cannot contain [b] -> [y] because [f] is not in the scope of [y]. If f were the recursive function [let rec f a b c = f a 1 2 in], [a] -> [x] would still be a valid specialised argument because all recursive calls maintain the invariant. This information is used for optimization purposes, if such a binding is known, it is possible to specialise the body of the function according to its parameter. This is usually introduced when specialising a recursive function, for instance. [let rec map f = function | [] -> [] | h :: t -> f h :: map f t let map_succ l = let succ x = x + 1 in map succ l] [map] can be duplicated in [map_succ] to be specialised for the argument [f]. This will result in [let map_succ l = let succ x = x + 1 in let rec map f = function | [] -> [] | h :: t -> f h :: map f t in map succ l] with map having [f] -> [succ] in its [specialised_args] field. Specialised argument information for arguments that are used must never be erased. This ensures that specialised arguments whose approximations describe closures maintain those approximations, which is essential to transport the closure freshening information to the point of use (e.g. a [Project_var] from such an argument). 6 * If [direct_call_surrogates] maps [fun_var1] to [fun_var2] then direct calls to [fun_var1] should be redirected to [fun_var2]. This is used to reduce the overhead of transformations that introduce wrapper functions (which will be inlined at direct call sites, but will penalise indirect call sites). [direct_call_surrogates] may not be transitively closed. 6 T* Indicates whether this [function_declarations] was compiled with -Oclassic. 5 * An identifier (unique across all Flambda trees currently in memory) of the set of closures associated with this set of function declarations. 5 * An identifier of the original set of closures on which this set of function declarations is based. Used to prevent different specialisations of the same functions from being inlined/specialised within each other. 5f * The function(s) defined by the set of function declarations. The keys of this map are often referred to in the code as "fun_var"s. 5F U CR-soon mshinwell: inconsistent naming free_variables/free_vars here and above E08^8`E188@ * All variables free in the *body* of the function. For example, a variable that is bound as one of the function's parameters will still be included in this set. This field is present as an optimization. 4] * All symbols that occur in the function's body. (Symbols can never be bound in a function's body; the only thing that binds symbols is the [program] constructions below.) 4B #* A stub function is a generated function used to prepare arguments or return values to allow indirect calls to functions with a special calling convention. For instance indirect calls to tuplified functions must go through a stub. Stubs will be unconditionally inlined. 4+ +* Debug info for the function declaration. 4 .* Inlining requirements from the source code. 3 2* Specialising requirements from the source code. 3ࠠ >* Whether the function is known definitively to be a functor. 3ɠ6* Behaviour for polls 3 .* Equivalent to the similar type in [Lambda]. <0* Integer cases 20* Integer cases 1<* Number of tag block cases 1ڠ2* Tag block cases 1 !* Action to take if none matched 1 .* Equivalent to the similar type in [Lambda]. < ** Like a subset of [Flambda.named], except that instead of [Variable.t]s we have [Symbol.t]s, and everything is a constant (i.e. with a fixed value known at compile time). Values of this type describe constants that will be directly assigned to symbols in the object file (see below). <ࠠ |* A single constant. These are never "simple constants" (type [const]) but instead more complicated constructions. / y* A pre-allocated block full of constants (either simple constants or references to other constants, see below). /~ f* A closed (and thus constant) set of closures. (That is to say, [free_vars] must be empty.) /e z* Selection of one closure from a constant set of closures. Analogous to the equivalent operation on expressions. /D * A "program" is the contents of one compilation unit. It describes the various values that are assigned to symbols (and in some cases fields of such symbols) in the object file. As such, it is closely related to the compilation of toplevel modules.  <* Define the given symbol to have the given constant value. ؠ 7* As for [Let_symbol], but recursive. This is needed to treat examples like this, where a constant set of closures is lifted to toplevel: let rec f x = f x After lifting this produces (in pseudo-Flambda): Let_rec_symbol set_of_closures_symbol = (Set_of_closures { f x -> let applied_function = Symbol f_closure in Apply (applied_function, x) }) and f_closure = Project_closure (set_of_closures_symbol, f) Use of [Let_rec_symbol], by virtue of the special handling in [Inline_and_simplify.define_let_rec_symbol_approx], enables the approximation of the set of closures to be present in order to correctly simplify the [Project_closure] construction. (See [Inline_and_simplify.simplify_project_closure] for that part.)  * Define the given symbol as a constant block of the given size and tag; but with a possibly non-constant initializer. The initializer will be executed at most once (from the entry point of the compilation unit). x * Cause the given expression, which may have a side effect, to be executed. The resulting value is discarded. [Effect] constructions are never re-ordered. Z U* [End] accepts the root symbol: the only symbol that can never be eliminated. ? * Compute the free variables of a term. (This is O(1) for [Let]s). If [ignore_uses_as_callee], all free variables inside [Apply] expressions are ignored. Likewise [ignore_uses_in_project_var] for [Project_var] expressions.  4* Compute the free variables of a named expression.  :* Compute _all_ variables occurring inside an expression.  ?* Compute _all_ variables occurring inside a named expression.  * Used to avoid exceeding the stack limit when handling expressions with multiple consecutive nested [Let]-expressions. This saves rewriting large simplification functions in CPS. This function provides for the rewriting or elimination of expressions during the fold. ߠ L CR-someday mshinwell: consider making [filter_defining_expr] optional FR@RBF RR@ +* Like [fold_lets_option], but just a map.  )* Like [map_lets], but just an iterator. 9 o* Creates a [Let] expression. (This computes the free variables of the defining expression and the body.) Ơ x* Apply the specified function [f] to the defining expression of the given [Let]-expression, returning a new [Let]. Y w* A module for the manipulation of terms where the recomputation of free variable sets is to be kept to a minimum. -* O(1) time. ͠-* O(1) time. x * Takes the time required to calculate the free variables of the given term (proportional to the size of the term, except that the calculation for [Let] is O(1)). # U* Takes the time required to calculate the free variables of the given [expr]. b V* Takes the time required to calculate the free variables of the given [named]. ࠠ-* O(1) time. O ,* The equivalent of the [Expr] constructor. 렠-* O(1) time. U x* Create a function declaration. This calculates the free variables and symbols occurring in the specified [body].  Π F* Create a function declaration based on another function declaration  F K* Create a set of function declarations given the individual declarations.  Ǡ Q* Create a set of function declarations with a given set of closures origin.  * 2* Change only the code of a function declaration.  Ϡ A* Change only the code and parameters of a function declaration.  G C CR-soon mshinwell: rename this to match new update function above F^M``F_M``_@ [* Create a set of function declarations based on another set of function declarations.  Ѡ s* Create a set of closures. Checks are made to ensure that [free_vars] and [specialised_args] are reasonable.  `* Given a function declaration, find which of its parameters (if any) are used in the body. ` * This function is designed for the internal use of [Flambda_iterators]. See that module for iterators to be used over Flambda terms. g@-./boot/ocamlc)-nostdlib"-I&./boot*-use-prims2runtime/primitives"-g0-strict-sequence*-principal(-absname"-w8+a-4-9-40-41-42-44-45-48+-warn-error"+a*-bin-annot/-strict-formats"-I2middle_end/flambda"-I%utils"-I'parsing"-I&typing"-I(bytecomp"-I,file_formats"-I&lambda"-I*middle_end"-I2middle_end/closure"-I2middle_end/flambda"-I=middle_end/flambda/base_types"-I'asmcomp"-I&driver"-I(toplevel"-I%tools"-I'runtime"-I1otherlibs/dynlink"-I-otherlibs/str"-I4otherlibs/systhreads"-I.otherlibs/unix"-I8otherlibs/runtime_events"-cFF =/builds/workspace/precheck/flambda/false/label/ocaml-linux-32 >10/.-,+*)('&%$#"! @@0)LzR 53FFFFFFFF@F@@:0ЖݔTWŠ(Asttypes0>n{T8cئ5Build_path_prefix_map0z HkGs8CamlinternalFormatBasics0%FU(Q/Tu0CamlinternalLazy0&͂7 Pˆ:#01U1/Closure_element0YWZ̡Q.hV&D05:z[ކ40vˆtT{(}z*Cmi_format0c˯7͗ԩmݠ0Compilation_unit0 {p-Vg_*Data_types0I'Ue`wq]Ѡ)Debuginfo0PtJ=^w/#Env0zV L{YWIG0Idvu "*Format_doc0]mWϓ:Mݠ%Ident0">WA+9*X,Identifiable0 {d\FX'`7Internal_variable_names0HdeՄL ԩ&Lambda0z1x]&ZT,Linkage_name0EwKсڊs)Load_path0I@18 ~(Location0a7cK_H%9)Longident0s `7mɕc$Misc0ob]6>Vê>C 0~emPs;Ӑ0ҡ4d,00\݅}x.Type_immediacy0A^abOhՠ%Types0^Y~# )Unit_info0ڀh%(2Var_within_closure00SSJh6 (Variable0' Gr㠠(Warnings0mJɒkgr@::C:͕:pFXF@6]5$65ϰFqFV@/ǰ22G@0011@Fti4;3=@;˕;h@:A9@AJ?Q@DE@?2EEX@@@@@ M =A:?CC@=@@@@@=2<,@  |:ە:@ED@A?@h4ە4BޕB@==@FjE@@1@  ְFF@RA0>@@A>@;:@ǐ,B!@@@@1F1S@̐ > =9@ %m@;<DD@y@33J@>9=l@@@P@@