Caml1999I037UBR<:63Simple_value_approx)boxed_intm;!a@@A%Int32@%int32N@@@@@@ *middle_end/flambda/simple_value_approx.mliXX@@"A@%Int64@%int64O@@@@@@YY@@6B@)Nativeint@*)nativeintM@@@@@@)Z*Z@@JC@@@A@@@@@@/Wxx@@A@O@@A@,value_stringn;@@(contents@@&optionL&stringQ@@@@@@I]J]@@jE@$size@@#intA@@@W^?AX^?L@@xF@@@A@@@@@[\\_MN@@@@|D@A@0unresolved_valueo;@@2Set_of_closures_id2Set_of_closures_id!t@@@@@sbhjtbh@@H@&Symbol(&Symbol!t@@@@@cc@@I@@@A@@@@@aPP@@@@G@A@2unknown_because_ofp;@@0Unresolved_value;:@@@@@ff@@K@%Other<@@gg@@L@@@A@@@@@e@@@@J@A@!tq;@@%descrF@@%descrr@@@vv@@V@#var_@@(Variable!t@@@@@@ww@@W@&symbol`@@@d!t@@@@@@@@@@@@@@@xx@@X@@@@@@@@@unny@@@@M@A@D;@@+Value_blocka#Tag!t@@@%arrayJi@@@@@@@@||@@:Y@)Value_intp@@@@@'}(}&@@HZ@*Value_charq$charB@@@@@7~')8~'=@@X[@+Value_floatr%floatD@@@@@@@@L>@M>]@@m\@/Value_boxed_intsa!a@@@@@@@@c^`d^@@]@5Value_set_of_closurest5value_set_of_closuresw@@@@@st@@^@-Value_closureu-value_closures@@@@@@@_@,Value_stringv\@@@@@@@`@1Value_float_arrayw1value_float_arrayy@@@@@0@@a@-Value_unknownx @@@@@131X@@b@,Value_bottomy@@Y[Yi@@c@,Value_externz)Export_id!t@@@@@jlj@@d@,Value_symbolW!t@@@@@@@e@0Value_unresolvedL@@@@@@@f@@@@@@@@@{@@@@ N@B@p;@@/set_of_closures@@@@@/@@g@*closure_id@@*Closure_id!t@@@ 02 0L@@*h@@@A@@@@@ MN@@@@.O@B@5function_declarationst;@@/is_classic_mode@@$boolE@@@!vx"v@@Bi@2set_of_closures_id@@!t@@@/0@@Pj@6set_of_closures_origin@@6Set_of_closures_origin!t@@@?@@@`k@$funs@@#Map!t4function_declarationv@@@@@@VW@@wl@@@@@@@@@ZPP[ @@@@{P@B@-function_bodyu;@@.free_variables@@#Set!t@@@°p@Bq@b@@m@,free_symbolsL@@#Set!t@@@cec@@n@$stubM@@m@@@@@o@#dbg\@@)Debuginfo!t@@@@@p@&inline@@&Lambda0inline_attribute@@@@@s@*specialise@@4specialise_attribute@@@@@t@,is_a_functor@@@@@ @@u@$body@@'Flambda!t@@@   @@v@$poll@@:.poll_attribute@@@!#!?@@w@@@@@@@@@""@A@@@@ Q@B@;@@.closure_origin@@.Closure_origin!t@@@ǰhjh@@x@¶ms@@$listK)Parameter!t@@@@@@ư@@4y@-function_body@@ߠ@@@@@@İ$%@@Ez@@@@@@@@@(CC)@@@@IR@B@;@@.function_decls @@$@@@ڰ89@@Y{@*bound_varsV@@2Var_within_closure#Map!t6@@@@@@ٰNO@@o|@)free_varsW@@#Map!t.specialised_to@@@@@@װef4@@}@0invariant_paramsa@@&Stdlib$Lazy!t#Map!t#Set!t@@@@@@@@@հ575o@@~@)recursiveb@@$$Lazy!t#Set!t@@@@@@Ұprp@@@$sizec@@<$Lazy!t#Map!t|k@@@@@@@@@@@@а@@@@0specialised_argsd@@#Map!t.specialised_to@@@@@@̰"$"]@@A@*freshening@@*Freshening+Project_var!t@@@ʰ@@ B@6direct_call_surrogates@@#Map!t!t@@@@@@ɰ@@$C@@@@@@@@@@@@@(S@B@:value_float_array_contentsx;@@(Contents @@@@@@@@') '>@@@D@2Unknown_or_mutable@@(?A)?U@@IE@@@A@@@@@,@@@@LT@B@;@@(contents@@-@@@ް;qs<q@@\F@$size@@@@@ݰGH@@hG@@@A@@@@@KWWL@@@@lU@B@%descrz@D@@@@@@@@@@@^_@@H@@&descrs{@g[@@@@@@@@o@@@@@@@@@{|@@I@@%print|@&Format)formatter@@@@@@@@@@@$unitF@@@@@@@@XXX@@J@@+print_descr}@<&Format)formatter@@@@@@@@@@@!@@@@@@@@@@K@@;print_value_set_of_closures~@[&Format)formatter@@@@@@f@@@@@@@@@@@@@@  @@L@@;print_function_declarations@z&Format)formatter@@@@@@@@@@@_@@@@@@@@   a j@@M@@@@@?@@@@####@@>R@@*value_char@@@@A@@B@@@C@@D@1##2##@@RS@@+value_float@@@@E@@F.@@@G@@H@E##F#$@@fT@@/value_any_float:@@@I@Q$$R$$&@@rU@@9value_mutable_float_array$size@@@J@@KP@@@L@@M@g$'$'h$'$T@@V@@;value_immutable_float_array@fd@@@N@@@O@@Ph@@@Q@@R@$U$U$U$@@W@@,value_string@;@@@S@@T@XV@@@U@@@V@@W@@@X@@Y@@Z@$$$$@@X@@/value_boxed_int@!i@]@@@[@@\@ @@^@@@_@@`@@a@$$$$@@Y@@+value_block@!t@@@b@@c@Š@@@d@@@e@@f@@@g@@h@@i@$$$%@@Z@@,value_extern@)!t@@@j@@k@@@l@@m@%%%%*@@[@@,value_symbol@!t@@@n@@o@@@p@@q@ %+%+ %+%K@@+\@@,value_bottom@@@r@%L%L%L%`@@7]@@0value_unresolved@@@@s@@t@@@u@@v@)%a%a*%a%@@J^@@-value_closure+closure_vart!t@@@w@@@x@@y3set_of_closures_var!t@@@z@@@{@@|6set_of_closures_symbol!!t@@@}@@@~@@@@@@@@@m!t@@@@@`@@@@@@@@@@@@@@w'#'#x ''@@_@@5value_set_of_closures3set_of_closures_varN!t@@@@@@@@@'@@@@@@@@@@@@@(c(c((@@`@@.make_const_int@V@@@@@@!t@@@@@@@@@@@@)M)M)M)v@@a@@/make_const_char@@@@@@@!t@@@@@@@@@@@@)w)w)w)@@b@@/make_const_bool@@@@@@@!!t@@@@@@@@@@@@))))@@c@@0make_const_float@@@@@@@A!t@@@@@@@@@@@@))))@@;d@@4make_const_boxed_int@2!i@@@@@@@ @@@i!t@@@@+@@@@@@@@@@B))C)*;@@ce@@4make_const_int_named@@@@@@@%named@@@@K@@@@@@@@b*=*=c*=*p@@f@@5make_const_char_named@>@@@@@@%named@@@@k@@@@@@@@*q*q*q*@@g@@5make_const_bool_named@t@@@@@@%named@@@ @@@@@@@@@ ** **@@h@@6make_const_float_named@j@@@@@@%named@@@Ƞ@@@@@@@@@!**!*+@@i@@:make_const_boxed_int_named@ڠ!i@@@@@@@ @@@%named@@@Р@@@@@@@@@@@"++"++]@@ j@@5augment_with_variable@@@@@@@6!t@@@@@@@@@@@@@ ',4,4 ',4,d@@ (k@@3augment_with_symbol@@@@@@@!t@@@@@ @@@@@@@@ $*,, %*,,@@ El@@9augment_with_symbol_field@@@@@@@!t@@@@@@@@@@@2@@@@@@@@@@ I--- J---S@@ jm@@3replace_description@B@@@@@@@@@@@L@@@@@@@@ c0-- d0--@@ n@@1augment_with_kind@\@@@@@@*value_kind@@@@@i@@@@@@@@ 3-- 3-.*@@ o@@8augment_kind_with_approx@y@@@@@@*value_kind@@@@@*value_kind@@@@@@@@ 6.k.k 6.k.@@ p@@/equal_boxed_int@ !a@@@@@@@ @@@ Ƞ!b@@@@@@@ @@@@@ @@ @@ @@ @@ @ 8.. 8..@@ q@@$meet4really_import_approx@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ <// <//@@ r@@%known@@@@@@@@@@@@ ?00 ?00@@ ,s@@&useful@ @@@@@ @@@!@@"@ B0h0h B0h0~@@ @t@@.all_not_useful@( @@@#@@@$@@%@@@&@@'@ 8E00 9E00@@ Yu@@0warn_on_mutation@ 1@@@(@@)-@@@*@@+@ LJ11 MJ11@@ mv@@6simplification_summary;@@,Nothing_done@@ [M11 \M11@@ |x@-Replaced_term@@ dN11 eN12@@ y@@@A@@@@@ hL11@@A@ w@A@5simplification_result;@@@A@!t@@@.@/@@@-@ p@@@,@@/@@@@ P22 P22S@@@@ z@A@;simplification_result_named;@@@A@%named@@@2@ @@@1@ @@@0@@3@@@@ Q2T2T Q2T2@@@@ {@A@(simplify@ @@@4@@5@!t@@@6@@7V@@@8@@9@@:@ V3p3p V3p3@@ |@@2simplify_using_env@ @@@;@@<1is_present_in_env@ !t@@@=@@>@@@?@@@@@A@!t@@@B@@C2@@@D@@E@@F@@G@ \44 `551@@ }@@.simplify_named@ @@@H@@I@;%named@@@J@@K@@@L@@M@@N@ b5353 b535y@@ 4~@@8simplify_named_using_env@ @@@O@@P1is_present_in_env@ e!t@@@Q@@R @@@S@@T@@U@m%named@@@V@@W2@@@X@@Y@@Z@@[@ Dd5{5{ Eh55@@ e@@=simplify_var_to_var_using_env@ =@@@\@@]1is_present_in_env@ !t@@@^@@_ I@@@`@@a@@b , !t@@@c@@@d@@e@@f@ sm66 tp77'@@ @@,simplify_var@ l@@@g@@h G@%named@@@j@ @@@i@@k@@@l@@m@ r7)7) r7)7[@@ @@0get_field_result;@@"Ok @@@n@@ u7u7w u7u7@@ @+Unreachable@@ v77 v77@@ @@@A@@@@@ t7]7]@@@@ @A@)get_field@ @@@o@@p+field_index {@@@q@@r6@@@s@@t@@u@ ~99 ~99;@@ @@8checked_approx_for_block;@@%Wrong@@ 9]9_ 9]9f@@ @"Ok !t@@@x  @@@v@@@w@@ 9g9i 9g9@@ @@@A@@@@@ 9=9=@@@@ @A@6check_approx_for_block@ @@@y@@z8@@@{@@|@ 99 9:@@ 4@@4approx_for_bound_var@ @@@}@@~@!t@@@@@ @@@@@@@@ 0:: 1:;@@ Q@@@@ @"Ok  !t@@@@@@ j@@@@@ >> >>@@ @@@A@@@@@ =u=u@@@@ @A@ check_approx_for_set_of_closures@ @@@@@[@@@@@@ ?? ??@@ @@:checked_approx_for_closure;@@%Wrong@@ ?? ?@@@ !@"Ok @@@ Ҡ J!t@@@@@@ ޠ !t@@@@@@ @@@@@ )@@ *@0@c@@ J@@@A@@@@@ -??@@@@ M@A@8check_approx_for_closure@ %@@@@@H@@@@@@ @AA AAA@@ a@@ .checked_approx_for_closure_allowing_unresolved;@@%Wrong@@ OBB PBB@@ p@*UnresolvedÐ @@@@@ \BB  ]BB@@@ }@'UnknownĐ@@ eBABC fBABL@@ @ #Unknown_because_of_unresolved_valueŐ @@@@@ rBMBO sBMB@@ @"OkƐ @@@ D !t@@@@@@ P !t@@@@@@ +@@@@@ BB BB@@ @@@A@@@@@ AA@@@@ @A@ ,check_approx_for_closure_allowing_unresolved@ @@@@@k@@@@@@ CxCx CC@@ @@6check_approx_for_float@ @@@@@  @@@@@@@@@ D)D) D)DW@@ @@7float_array_as_constant@ =@@@@@  ۠ @@@@@@@@@@@@ DD DD@@ @@7check_approx_for_string@ @@@@@  @@@@@@@@@E.E.E.E^@@#@@7switch_branch_selection;@@/Cannot_be_taken̐@@EEEE@@2@,Can_be_taken͐@@EEEE@@;@-Must_be_takenΐ@@#EE$EE@@D@@@A@@@@@'E`E`@@A@G@A@ %potentially_taken_const_switch_branch@ @@@@@@ @@@@@9@@@@@@@@BEECEFH@@c@@ %potentially_taken_block_switch_branch@ ;@@@@@@@@@@@@@@@@@@@]FIFI^FIF@@~@@.function_arity@ @@@@@@@@@@@qFFrFF@@@@@@5clear_function_bodies@ @@@@@ @@@@@@0II1IJ:@@Q@@@bJޠ3Simple_value_approx0 c[k%S\KѠ(Warnings0Ef{&(Variable0?l猵eY2Var_within_closure0``ݗXFR⠠)Unit_info0'T Χ@aR%Types0"|Vȷ`X .Type_immediacy00$ jbv\"k&#Tag0&b rٍ&Symbol03E?Y7(%Subst0=aqT/!p+-Stdlib__Uchar0=H^V9>ɠ+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⠠*Freshening0xW("-9wVԠ*Format_doc0uy@GmWUࠠ'Flambda0VJ͟)Export_id0CJ9DןRa7ݷ$E#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`1OC3Simple_value_approx-ocaml.warning *middle_end/flambda/simple_value_approx.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 Simple approximations to the runtime results of computations. This pass is designed for speed rather than accuracy; the performance is important since it is used heavily during inlining. SU9v@@@@@@A+)boxed_intAWxWx@А!a@|3@;@@{@A@A@G@B@@@WxxZ@@@@@@@AWx}Wx@@BA@;@A%Int32@+@@@}@@@XX@@A@%Int64@>!@@@@@@YY@@B@)Nativeint@Q@@@@@@@Z@@@$C@@@A@@@@@@E@A@B@#;;!X"X@/@@г=)boxed_int+X9@гA%int323X4X@@Ig@@@NhD@@F@#BB;Y@@гK)boxed_int_Z@гO)nativeintgZhZ@@W@@@\@@T@@A@@@U@A+,value_stringBu\v\@@;@@(contents@@ 9@@@@@@]]@@E@$size@@U@@@^?A^?L@@F@@@A@@@@@\_MN@@@@D@@#""] @@@Ш@г%&option]]@г*&string] ]@@23@E;@@@A@@@@@"@@@@A@@@< @@?@@ @6@#22-^?E@,@@Ш@г5#int^?H^?K@@=@@@@@@<@@A@8@@3@@A98@A+0unresolved_valueCaPUaPe@@;@@2Set_of_closures_id2Set_of_closures_id!t@@@)@@bhjbh@@H@&Symbol(&Symbol!t@@@@@cc@@ I@@@A@@@@@aPP@@@@G@@#(( bhl bh~@@г*2Set_of_closures_idbhbh@/bh-@.@@83@iI;@@@A@@@@@@@@@A 4@@@@6@#22%c&c@'@г4&Symbol1c2c@95c7@8@@B9@@@@;@@A@7@@3"!!"""""@@A8;@A+2unknown_because_of:DCeDe@@;@@0Unresolved_value;{@@@@@RfSf@@_K@%Other<@@[g\g@@hL@@@A@@@@@_e@@@@kJ@@#ffgf@@г0unresolved_valuepf@@$3[ZZ[[[[[@W5;@@@A@@@@@@@@@A$@@@@&@#""{g @@@@#@@A@@@3gffggggg@ @A #@A+!t=Eunsunt@@;@@%descrF@@%descr>E@@@Ұvv@@V@#var_@@(Variable!t@@@ @@@ Űww@@W@&symbol`@@@!t@@@ Ƞ@@@@ @@@ @@ @@@ ΰxx@@X@@@@@@@@@unny@)ocaml.doc k A value of type [t] corresponds to an "approximation" of the result of a computation in the program being compiled. That is to say, it represents what knowledge we have about such a result at compile time. The simplification pass exploits this information to partially evaluate computations. At a high level, an approximation for a value [v] has three parts: - the "description" (for example, "the constant integer 42"); - an optional variable; - an optional symbol or symbol field. If the variable (resp. symbol) is present then that variable (resp. symbol) may be used to obtain the value [v]. The exact semantics of the variable and symbol fields follows. Approximations are deduced at particular points in an expression tree, but may subsequently be propagated to other locations. At the point at which an approximation is built for some value [v], we can construct a set of variables (call the set [S]) that are known to alias the same value [v]. Each member of [S] will have the same or a more precise [descr] field in its approximation relative to the approximation for [v]. (An increase in precision may currently be introduced for pattern matches.) If [S] is non-empty then it is guaranteed that there is a unique member of [S] that was declared in a scope further out ("earlier") than all other members of [S]. If such a member exists then it is recorded in the [var] field. Otherwise [var] is [None]. Analogous to the construction of the set [S], we can construct a set [T] consisting of all symbols that are known to alias the value whose approximation is being constructed. If [T] is non-empty then the [symbol] field is set to some member of [T]; it does not matter which one. (There is no notion of scope for symbols.) Note about mutable blocks: Mutable blocks are always represented by [Value_unknown] or [Value_bottom]. Any other approximation could leave the door open to a miscompilation. Such bad scenarios are most likely a user using [Obj.magic] or [Obj.set_field] in an inappropriate situation. Such a situation might be: [let x = (1, 1) in Obj.set_field (Obj.repr x) 0 (Obj.repr 2); assert(fst x = 2)] The user would probably expect the assertion to be true, but the compiler could in fact propagate the value of [x] across the [Obj.set_field]. Insisting that mutable blocks have [Value_unknown] or [Value_bottom] approximations certainly won't always prevent this kind of error, but should help catch many of them. It is possible that there may be some false positives, with correct but unreachable code causing this check to fail. However the likelihood of this seems sufficiently low, especially compared to the advantages gained by performing the check, that we include it. An example of a pattern that might trigger a false positive is: [type a = { a : int } type b = { mutable b : int } type _ t = | A : a t | B : b t let f (type x) (v:x t) (r:x) = match v with | A -> r.a | B -> r.b <- 2; 3 let v = let r = ref A in r := A; (* Some pattern that the compiler can't understand *) f !r { a = 1 }] When inlining [f], the B branch is unreachable, yet the compiler cannot prove it and must therefore keep it. itkm@@@@@@@@@M@@#ZZSv@R@@Ш@г]%descrvv@@e3@|;@@@@@@@@@1.@@o;@@@@@@@@@{@@@@N@-value_closure?E;@@@A@@@@@ MN@@@@O@5function_declarations@E;@@@@@@@@@PP @@@@"P@-function_bodyAE;@@@@@@@@@""@A@@@@*Q@4function_declarationBE;@@@@@@@@@%CC&@@@@2R@5value_set_of_closuresCE;@@@@@@@@@-.@@@@:S@:value_float_array_contentsDE;@@@A@@@@@56?U@@@@BT@1value_float_arrayEE;@@@A@@@@@=WW>@@@@JU@@ANM@@@@N@@#Gw@@@Ш@г&optionPwQw@г(Variable[w\w@_w`w@@@m@@@n @@@@ q@@#jx@@@Ш@г&optionsxtx@В@г&Symbolxx@ưxx@@@@@@гɠ&optionxx@гΠ#intxx@@@@@ @@@ @@@x.@@@@ @@@@@Ӡf@@@@@@+{{@@;@@+Value_blocka#Tag!t@@@ %3I@@@ &@@@ (@@||@@Y@)Value_intp@@@ )@@}}&@@Z@*Value_charq@@@ *@@~')~'=@@[@+Value_floatr:@@@ +@@@ -@@>@>]@@ \@/Value_boxed_intsK!a@ 2F@ .@@@ 0F@ 3@@@@ 5^`^@@)]@5Value_set_of_closurest@@@ 6@@*+@@7^@-Value_closureu.@@@ 7@@89@@E_@,Value_stringv@@@ 8@@FG@@S`@1Value_float_arrayw@@@ 9@@TU0@@aa@-Value_unknownx!@@@ :@@b13c1X@@ob@,Value_bottomy@@kY[lYi@@xc@,Value_externz)Export_id!t@@@ @@}jl~j@@d@,Value_symbol!t@@@ @@@@e@0Value_unresolved@@@ @@@@f@@@@@@@@@@@@@#||@@г頡#Tag||@||@@@@@г%array| @г!t| | @@Ұ@@@Ӱ@@@@@#}}@@г#int}#@@@@@@@#~'+~'5@@г$char~'9@@@@@@@#>B>M@@г&option>W@г%float>Q>V@@ @@@  @@@@@#^b^q@@г)boxed_int^w^@А !^t^v@@@$@@А!a )^ ^@@@г %descr(^ @@4 @@@#  ./@@г 5value_set_of_closures8@@D@@@@@#  >?@@г-value_closureH@@T@@@@@#NO@@г,value_stringX@@d@@@@@#^ _@ @г1value_float_arrayh@@t@@@@@#n15o1B@ @г2unknown_because_ofx1F@@@@@@@#~Y]@@@@@#jnjz@@г)Export_idj~j@j@@@"@@@@@#@@г&Symbol@ @@@' @@@@"@#@@г 0unresolved_value@@'Ȱ@@@@$@@@@@+@@;@@/set_of_closures@@I@@@ /@@g@*closure_id@@*Closure_id!t@@@ 0020L@@h@@@A@@@@@@@@@#*@@@Ш@г !t-.@@(@@+@@ @'@###0<@@@Ш@г&*Closure_id0?0I@+0J 0K@@@5@@8@@ 1@0@@A@@+PTPi@@;@@/is_classic_mode@@@@@ 3vx v@@,i@2set_of_closures_id@@C!t@@@ 6-.@@:j@6set_of_closures_origin@@6Set_of_closures_origin!t@@@ =>@@Jk@$funs@@#Map!t/@@@@@@ְRS@@_l@@@@@@@@@A@@@>@#@@;Zv@:@@Ш@гC$boolcvdv@@Kp@@N@@ 4s@J@#FF?l@>@@Ш@гI2Set_of_closures_idwx@P{|@@@X@@[@@ 7@U@#QQH@G@@Ш@гT6Set_of_closures_origin@Y@@@c@@f@@ @^@#ZZL@K@@Ш@г](Variable@e@@i@ @гl4function_declaration@@t˰@@@}̰ @@@@@s@@@@@+"&"3@@;@@.free_variables@@/#Set!t@@@r@B@b@@m@,free_symbolsL@@#Set!t@@@cec@@n@$stubM@@@@@@@o@#dbg\@@)Debuginfo!t@@@@@p@&inline@@&Lambda0inline_attribute@@@d@@"s@*specialise@@4specialise_attribute@@@g#$@@0t@,is_a_functor@@@@@j/0 @@@@@:@@@@G=@@@@@@+ 6CG 7C[@@;@@.closure_origin@@.Closure_origin!t@@@(2 Ghj Hh@@ Tx@¶ms@@)Parameter!t@@@(@@@( \ ]@@ iy@-function_body@@R@@@(@@@( m n@@ zz@@@@@@@@@L@@@I@#77. uhx@-@@Ш@г:.Closure_origin h{ h@? h h@@@I@@L@@(3@D@#@@2 @1@@Ш@гC$list  @гH)Parameter  @M  @@@W@@@\ @@_@@(@R@#NND @C@@Ш@гQ&option  @гV-function_body  @@^а@@@cѰ @@f@@(@]@@@@@+  @@;@@.function_decls @@@@@(  @@ {@*bound_varsV@@2Var_within_closure#Map!tj@@@-y@@@-{  @@ |@)free_varsW@@W#Map!t.specialised_to@@@-~@@@-  4@@ }@0invariant_paramsa@@n$Lazy!tu#Map!t}#Set!t@@@-@@@-@@@-ڰ )57 *5o@@ 6~@)recursiveb@@$Lazy!t#Set!t@@@-@@@-߰ Apr Bp@@ N@$sizec@@$Lazy!t#Map!t  "@@@-@@@-@@@-@@@- c d@ Z For functions that are very likely to be inlined, the size of the function's body.  q r!@@@@@@@ ~@@0specialised_argsd@@#Map!tJ.specialised_to@@@-@@@- "$ "]@@ A@*freshening@@*Freshening+Project_var!t@@@/  @@ B@6direct_call_surrogates@@#Map!t!t@@@3@@@3İ  @@ C@@@@@@@@@@@@@# @@@Ш@г砐5function_declarations  @@ϰ@@@@(@@# @@@Ш@г2Var_within_closure  @  @@  @ @г!t  @@@@@  @@@@-|@@#  @@@Ш@г(Variable % -@ . 1@@  2 3@ @г'Flambda  @  $@@@)@@@'* @@*@@--@@# &5G@@@Ш@г 05h 15l@ 45m 55n@@г"(Variable B5Y C5a@* F5b G5e@@. K5f L5g@ @г1(Variable Y5J Z5R@9 ]5S ^5V@@= b5W c5X@ @@Gp @@@Pq@@@Xr3@@[@@-u@B@#>>- np{@,@@Ш@гAC xp yp@F |p }p@@гI(Variable p~ p@Q p p@@U p p@ @@_ @@@g@@j@@-@Z@#VV; @,@@Ш@гY[  @^  @@гa(Variable  @i  @@m  @ @гp&option  @гu#int  @@}@@@ @@@@@@/@@@@-@|  zy@yy@@@y@y@#uue "4@d@@Ш@гx(Variable "N "V@ "W "Z@@ "[ "\@ @г'Flambda "7 ">@ "? "M@@@!@@@" @@@@-%@@# @@@Ш@г*Freshening + ,@ / 0@@ 4 5@ @@B @@@@/E@@# >@@@Ш@г*Closure_id K L@ O P@@ T U@ @г*Closure_id ` a@ d e@@@r@@@s @@@@3v@@@@@?@+== o  p$@@;@@(Contents @@@3@@@3@@ ') '>@@ D@2Unknown_or_mutable@@ ?AW@@ E@@@A@@@@@Z@@@W@# '+ '3@@г%array '9@г"!t '7 '8@@*@@@/%@@@@'@### ?Cx@!@@@$@@A@{@+yy W[ Wl@@;@@(contents@@@@@3ʰ qs q@@ F@$size@@ @@@3Ͱ  @@ G@@@A@@@@@@@@@# q{@@@Ш@г:value_float_array_contents q~ q@@$@@'@@3@#@# @@@Ш@г"#int  @@*@@-@@3@)@@A@@@3        @@A $@%descrɠ  @б@г !t  @@ @@@Q3        @ cI N  T c  @A@@г %descr  !@@ @@@Q@@@@@Q@@Q" @@@ - @ Z 4 Extraction of the description of approximation(s).  : ;@@@@@@@ GH@@@ j @@@@@@;&descrsʠ Q R@б@г $list \  ]@г ޠ!t f  g @@ @@@Q3 U T T U U U U U@^sB@A@@@ @@@Q @@г ՠ$list z {@г %descr  @@ @@@Q@@@@@@Q# @@@%@@Q @@Q(.@@@ @@ I@@@@.%printp X\ Xa@б@г &Format)formatter Xd Xj@  Xk Xt@@@@@@[3        @Po(@A @@б@г >!t Xx Xy@@ @@@[@@г a$unit X} X@@ @@@[@@@@@[@@[# @@@+@@[ @@[(3@@@ XX@  3 Pretty-printing of approximations to a formatter.   W@@@@@@@ J@@"@ " @@@@@@G+print_descrq  @б@г l&Format)formatter@ @@@@@@[3        @iA@A @@б@г %descr./@@ @@@[@@г ɠ$unit;<@@ @@@[@@@@@[@@[# @@@+@@[ @@[(3@@@M@@YK@@@@.;print_value_set_of_closuresrXY@б@г &Format)formattergh@ kl@@@@@@[3[ZZ[[[[[@Pn(@A @@б@г Q5value_set_of_closures}~ @@ @@@[@@г$unit    @@ @@@[@@@@@[@@[# @@@+@@[ @@[(3@@@@@L@@@@.;print_function_declarationss    0@б@г &Format)formatter 1 5 1 ;@  1 < 1 E@@@@@@[3@Pn(@A @@б@г 5function_declarations F K F `@@ @@@[@@гg$unit a f a j@@ @@@[@@@@@[@@[# @@@+@@[ @@[(3@@@  @@M@@@@.!!@ A!!B!!@@F!!G!!@ @@@@@[@@@;@@@\'@@@J@@@\°G@@б)recursiveг$Lazy!tf!"g!"@ j!"k!"@@г #Set!t(Variable}!"~!" @ !"!"@@!"!"@ @@@@@\@@@2@@@\'@@б0specialised_argsг #Map!t(Variable""H""P@ ""Q""T@@""U""V@ @г|.specialised_to'Flambda""1""8@ ""9""G@@@@@@\3 @@@2@@@\8@@б*fresheningгB+Project_var!t*Freshening"W"g"W"q@ "W"r"W"}@@"W"~"W"@ @@@@@\ [@@б6direct_call_surrogatesг #Map!t*Closure_id""""@ """"@@ "" ""@ @г :!t*Closure_id""""@ "" ""@@@@@@\  @@@2@@@\ @@г 5value_set_of_closures2""3""@@ @@@\ @@H@@\@@\="" @@qV@@\ @@\C"W"\@@@@\ @@\I"" @@@@\ @@\O!!@@L@@\ @@\U!!#@@[@@\ @@\ư[!!)@@@@\ @@\̰a![!`/@@@@\ @@\Ұg!1!65@@@j!!8@@vO@@:@@ *update_freshening_of_value_set_of_closuresvu""v"#@б@г T5value_set_of_closures## ##@@ @@@\3onnooooo@ @A@@б*fresheningг+Project_var!t*Freshening# #0# #:@ # #;# #F@@# #G# #H@ @@@@@\%@@г 5value_set_of_closures#I#N#I#c@@ @@@\ 2@@0@@\!@@\"7# #% @@@@@@\# @@\$=C@@@""@@P@@@@C-value_unknownw####@б@г2unknown_because_of####@@ @@@\%3@\q@A@@гb!t####@@ @@@\&@@@@@\'@@\( @@@## @$ ' Basic construction of approximations. #e#e#e#@@@@@@@Q@@@4ʐ@@@@@@3)value_intx####@б@г栐#int&##'##@@ @@@\)3@La8@A@@г!t5##6##@@ @@@\*@@@@@\+@@\, @@@B## @@NR@@@@*value_charyM##N##@б@г$charX##Y##@@ @@@\-3GFFGGGGG@3H@A@@гߠ!tg##h##@@ @@@\.@@@@@\/@@\0 @@@t## @@S@@@@+value_floatz###$@б@г/%float#$#$ @@ @@@\13yxxyyyyy@3H@A@@г!t#$ #$@@ @@@\2@@@@@\3@@\4 @@@## @@T@@@@/value_any_float{$$$$"@г2!t$$%$$&@@ @@@\53@1F@A@@@$$ @@U@@ @@9value_mutable_float_array|$'$+$'$D@б$sizeг#int$'$L$'$O@@ @@@\63@#6!@A@@гc!t$'$S$'$T@@ @@@\7@@ @@\8@@\9$'$G @@@$'$'@@V@@@@;value_immutable_float_array}$U$Y$U$t@б@гu%array$U$y$U$~@г!t$U$w$U$x@@ @@@\:3@>U)@A@@@ @@@\< @@г!t-$U$.$U$@@ @@@\=@@@@@\>@@\? @@@:$U$U @@FW@@@@,value_string~E$$F$$@б@г#intP$$Q$$@@ @@@\@3?>>?????@8W@A@@б@г&optiona$$b$$@г&stringk$$l$$@@ @@@\A@@@@@@\C  @@г!t}$$~$$@@ @@@\D-@@@@@\E@@\F2 @@@:@@\G @@\H7=@@@$$@@X@@@@=/value_boxed_int$$$$@б@г᠐)boxed_int$$$$@А!i@\RF@\I3@\q%@A$$$$@@@ @@@\K @@б@А!i$$$$@@гA!t$$$$@@ @@@\L@@@(@@\M@@\N# @@@#@@\O @@\P(&@@@$$@@Y@@@@.+value_block$$$$@б@г-!t#Tag$$$$@ $$$$@@@@@@\S3@Pk(@A @@б@гq%array $$ $%@г!t$$$$@@ @@@\T@@@@@@\V  @@г!t'$%($%@@ @@@\W-@@@@@\X@@\Y2 @@@:@@\Z @@\[7B@@@9$$@@EZ@@@@=,value_externD%% E%%@б@г!t)Export_idS%%T%%#@ W%%$X%%%@@@@@@\\3GFFGGGGG@_}(@A @@гߠ!tg%%)h%%*@@ @@@\]@@@@@\^@@\_ @@@t%% @@[@@@@,value_symbol%+%/%+%;@б@г!t&Symbol%+%>%+%D@ %+%E%+%F@@@@@@\`3@<Z(@A @@г!t%+%J%+%K@@ @@@\a@@@@@\b@@\c @@@%+%+ @@\@@@@,value_bottom%L%P%L%\@г;!t%L%_%L%`@@ @@@\d3@1O@A@@@%L%L @@]@@ @@0value_unresolved%a%e%a%u@б@г 0unresolved_value%a%x%a%@@ @@@\e3@!4@A@@гj!t%a%%a%@@ @@@\f@@@@@\g@@\h @@@%a%a @@ ^@@@@-value_closure '#'' '#'4@б+closure_varгn!t(Variable'5'G'5'O@ '5'P '5'Q@@@@@@\i3@>S*@A @@б3set_of_closures_varг!t(Variable7 'R'l8 'R't@ ; 'R'u< 'R'v@@@@@@\j @@б6set_of_closures_symbolгQ!t&SymbolQ 'w'R 'w'@ U 'w'V 'w'@@@@@@\k6 @@б@г95value_set_of_closurese ''f ''@@ @@@\lE@@б@г!t*Closure_idx ''y ''@ | ''} ''@@@@@@\m] @@г!t '' ''@@ @@@\nj@@@@@\o@@\po @@@2@@\q @@\rt5@@XJ@@@\t@@\u@@\v~ 'w'|@@} n@@@\x@@\y@@\z 'R'W$@@@@@\|@@\}@@\~'5':.@@ @'#'#1@萠  Construct a closure approximation given the approximation of the corresponding set of closures and the closure ID of the closure to be projected from such set. [closure_var] and/or [set_of_closures_var] may be specified to augment the approximation with variables that may be used to access the closure value itself, so long as they are in scope at the proposed point of use. %%&'"@@@@@@@_@@A@@@@@@@5value_set_of_closures(c(g(c(|@б3set_of_closures_varгC!t(Variable(}((}(@ (}((}(@@@@@@\3@C@A @@б@гڠ5value_set_of_closures((((@@ @@@\@@г!t((((@@ @@@\@@@@@\@@\# @@=.@@@\@@\ @@\,'(}(@@ @*(c(c@W Construct a set of closures approximation. [set_of_closures_var] is as for the parameter of the same name in [value_closure], above. 7''8("(b@@@@@@@D`@@'@g@@@@@@L.make_const_intN)M)QO)M)_@б@г#intY)M)bZ)M)e@@ @@@\3HGGHHHHH@e8@A@@В@г/!t'Flambdap)M)iq)M)p@ t)M)qu)M)r@@@@@@\ @@@г!t)M)u)M)v@@ @@@\+@@@@@ @@\2! @@@:@@\ @@\7=@@@)M)M@Ő Take the given constant and produce an appropriate approximation for it together with an Flambda expression representing it. (())L@@@@@@@a@@$@k@@@@@@V/make_const_char)w){)w)@б@г~$char)w))w)@@ @@@\3@o8@A@@В@г!t'Flambda)w))w)@ )w))w)@@@@@@\ @@@гj!t)w))w)@@ @@@\+@@@@@ @@\2! @@@:@@\ @@\7=@@@)w)w@@b@@@@=/make_const_bool))))@б@г$bool))))@@ @@@\3        @Vk@A@@В@г!t'Flambda3))4))@ 7))8))@@@@@@\ @@@г!tG))H))@@ @@@\+@@@@@ @@\2! @@@:@@\ @@\7=@@@[))@@gc@@@@=0make_const_floatf))g))@б@г%floatq))r))@@ @@@\3`__`````@Vk@A@@В@гG!t'Flambda))))@ ))))@@@@@@\ @@@г!t))))@@ @@@\+@@@@@ @@\2! @@@:@@\ @@\7=@@@))@@d@@@@=4make_const_boxed_int)*)*@б@г)boxed_int)*)*$@А!i@\F@\3@\q%@A)*)*@@@ @@@\ @@б@А!i)*()**@@В@г!t'Flambda)*.)*5@ )*6)*7@@@@@@\+ @@@г~!t)*:)*;@@ @@@\:@@@@@ @@\A! @@@K@@\ @@\F7@@@F@@\ @@\KI@@@))@@+e@@@@Q4make_const_int_named**=*A+*=*U@б@г#int5*=*X6*=*[@@ @@@\3$##$$$$$@j@A@@В@г %named'FlambdaL*=*_M*=*f@ P*=*gQ*=*l@@@@@@\ @@@гؠ!t`*=*oa*=*p@@ @@@\+@@@@@ @@\2! @@@:@@\ @@\7=@@@t*=*=@@f@@@@=5make_const_char_named*q*u*q*@б@гA$char*q**q*@@ @@@\3yxxyyyyy@Vk@A@@В@г`%named'Flambda*q**q*@ *q**q*@@@@@@\ @@@г-!t*q**q*@@ @@@\+@@@@@ @@\2! @@@:@@\ @@\7=@@@*q*q@@g@@@@=5make_const_bool_named ** **@б@г~$bool ** **@@ @@@\3@Vk@A@@В@г%named'Flambda ** **@  ** **@@@@@@\ @@@г!t  **  **@@ @@@\+@@@@@ @@\2! @@@:@@\ @@\7=@@@ **@@*h@@@@=6make_const_float_named)!***!**@б@г٠%float4!**5!**@@ @@@\3#""#####@Vk@A@@В@г %named'FlambdaK!*+L!*+ @ O!*+ P!*+@@@@@@\ @@@гנ!t_!*+`!*+@@ @@@\+@@@@@ @@\2! @@@:@@\ @@\7=@@@s!**@@i@@@@=:make_const_boxed_int_named~"++"++3@б@гŠ)boxed_int"++9"++B@А!i@\F@\3~}}~~~~~@\q%@A"++6"++8@@@ @@@\ @@б@А!i"++F"++H@@В@гt%named'Flambda"++L"++S@ "++T"++Y@@@@@@\+ @@@гA!t"++\"++]@@ @@@\:@@@@@ @@\A! @@@K@@\ @@\F7@@@F@@\ @@\KI@@@"++@@j@@@@Q5augment_with_variable',4,8',4,M@б@гp!t',4,P',4,Q@@ @@@\3@j@A@@б@г`!t(Variable ',4,U',4,]@ ',4,^',4,_@@@@@@\ @@г!t',4,c ',4,d@@ @@@\'@@@@@\@@\, @@@4@@\ @@\17@@@1',4,4@^ Augment an approximation with a given variable (see comment above). If the approximation was already augmented with a variable, the one passed to this function replaces it within the approximation. >$+_+_?&+,3@@@@@@@Kk@@"@n@@@@@@P3augment_with_symbolU*,,V*,,@б@гؠ!t`*,,a*,,@@ @@@\3ONNOOOOO@i~8@A@@б@гu!t&Symbolu*,,v*,,@ y*,,z*,,@@@@@@\ @@г!t*,,*,,@@ @@@\'@@@@@\@@\, @@@4@@\ @@\17@@@*,,@Ɛ ; Like [augment_with_variable], but for symbol information. ),f,f),f,@@@@@@@l@@"@l@@@@@@P9augment_with_symbol_field------7@б@г@!t---:---;@@ @@@\3@i~8@A@@б@г!t&Symbol---?---E@ ---F---G@@@@@@\ @@б@г#int---K---N@@ @@@\)@@гv!t---R---S@@ @@@\6@@@@@\@@\; @@@)@@\ @@\@1@@@H@@\ @@\EK@@@---@B ? Like [augment_with_symbol], but for symbol field information. ",,,#,,-@@@@@@@/m@@'@R萠@@@@@@d3replace_description90--:0--@б@г!tD0--E0--@@ @@@\332233333@}8@A@@б@г%descrU0--V0--@@ @@@\@@гڠ!tb0--c0--@@ @@@\@@@@@\@@\# @@@+@@\ @@\(.@@@t0--@ 2 Replace the description within an approximation. /-U-U/-U-@@@@@@@n@@"@G@@@@@@G1augment_with_kind3--3-. @б@г!t3-.3-.@@ @@@\3@`u8@A@@б@г*value_kind&Lambda3-.3-.@ 3-.3-.%@@@@@@\ @@гB!t3-.)3-.*@@ @@@\'@@@@@\@@\, @@@4@@\ @@\17@@@3--@ 9 Improve the description by taking the kind into account 2--2--@@@@@@@o@@"@@@@@@@P8augment_kind_with_approx6.k.o6.k.@б@г!t 6.k. 6.k.@@ @@@\3@i~8@A@@б@г *value_kind&Lambda 6.k.!6.k.@ $6.k.%6.k.@@@@@@\ @@г*value_kind&Lambda66.k.76.k.@ :6.k.;6.k.@@@@@@\0 @@@@@\@@\5& @@@=@@\ @@\:@@@@M6.k.k@z 9 Improve the kind by taking the description into account Z5.,.,[5.,.j@@@@@@@gp@@#@ @@@@@@Y/equal_boxed_intq8..r8..@б@г)boxed_int|8..}8..@А!a@] F@\3qppqqqqq@x>@A8..8..@@@ @@@\ @@б@А!a8..8..@@б@гޠ)boxed_int8..8..@А!b@]F@]&8..8..@@@ @@@]-@@б@А!b38..8..@@гc$bool8..8..@@ @@@]B@@@&@@]@@]G @@@#@@] @@]L&@@@V@@] @@] QB@@@Q@@]  @@] VT@@@8..@@q@@@@\$meet<//<//@б4really_import_approxб@гr!t<//<//@@ @@@]3@y#@A@@г!t <// <//@@ @@@]@@@@@]@@] @@б@г!t<//<//@@ @@@]#@@б@г!t,<//-<//@@ @@@]2@@г!t9<//:<//@@ @@@]?@@@@@]@@]D @@@)@@] @@]I,@@\>@@] @@]NN<//@@@Q<//@@]r@@@@U%known\?00 ]?00@б@гߠ!tg?00h?00@@ @@@]3VUUVVVVV@n@A@@г$boolv?00w?00@@ @@@]@@@@@]@@]  @@@?00 @ < An approximation is "known" iff it is not [Value_unknown]. >//>/0@@@@@@@s@@@V@@@@@@3&usefulB0h0lB0h0r@б@г*!tB0h0uB0h0v@@ @@@]!3@La8@A@@г`$boolB0h0zB0h0~@@ @@@]"@@@@@]#@@]$ @@@B0h0h @ D An approximation is "useful" iff it is neither unknown nor bottom. A00A00g@@@@@@@t@@@ @@@@@@3.all_not_usefulE00E00@б@гX$listE00E00@г!tE00E00@@ @@@]%3@VkB@A@@@ @@@]' @@г$boolE00E00@@ @@@](@@@@@])@@]* @@@(E00 @U I Whether all approximations in the given list do *not* satisfy [useful]. 5D006D00@@@@@@@Bu@@@e@@@@@@80warn_on_mutationLJ11MJ11@б@гϠ!tWJ11XJ11@@ @@@]+3FEEFFFFF@Qp8@A@@г$boolfJ11gJ11@@ @@@],@@@@@]-@@]. @@@sJ11 @ Whether to warn on attempts to mutate a value. It must have been resolved (it cannot be [Value_extern] or [Value_symbol]). (See comment above for further explanation.) G00I1f1@@@@@@@v@@@F@@@@@@3A+6simplification_summaryFL11L11@@;@@,Nothing_done@@M11M11@@x@-Replaced_term@@N11N12@@y@@@A@@@@@L11@@A@w@@#M11@@@@@#N12@@@@@@A@@@3@cxO@A@A+5simplification_resultGP22P22*@@;@@@A@!t@@@]6@J@@@]7@`@@@]8@@]9@@@@P22P22S@@@@z@@@AВ@г'FlambdaP22-P224@"P225P226@@@*3@Alf:;@@@AB@@@]D@]5@@@@$@@@!@A@@@г16simplification_summaryP229P22O@@9@@@г6!tP22R7@@=!8@@@P"*9@@;@@3        @"@A<;@A+;simplification_result_namedH+Q2T2Y,Q2T2t@@;@@aA@%named@@@]I@@@@]J@@@@]K@@]L@@@@FQ2T2TGQ2T2@@@@S{@@@AВ@г'FlambdaVQ2T2wWQ2T2~@"ZQ2T2[Q2T2@@@*3GFFGGGGG@a9;@@@AA@@@]W@]H@@@@$@@@!@A@@@г16simplification_summaryrQ2T2sQ2T2@@9@@@г6!t}Q2T27@@=!8@@@P"*9@@;@@3jiijjjjj@"@A<;@(simplifyV3p3tV3p3|@б@г !tV3p3V3p3@@ @@@][3@=uo@A@@б@гi!t'FlambdaV3p3V3p3@ V3p3V3p3@@@@@@]\ @@г5simplification_resultV3p3V3p3@@ @@@]]'@@@@@]^@@]_, @@@4@@]` @@]a17@@@V3p3p@ Given an expression and its approximation, attempt to simplify the expression to a constant (with associated approximation), taking into account whether the expression has any side effects. S22U343o@@@@@@@|@@"@ @@@@@@P2simplify_using_env\44\44@б@гu!t]44]44@@ @@@]b3@i~8@A@@б1is_present_in_envб@гi!t(Variable ^44 ^44@  ^44 ^44@@@@@@]c @@гǠ$bool (^45 )^45@@ @@@]d+@@@@@]e@@]f0 @@б@г!t'Flambda @_55  A_55@  D_55 E_55@@@@@@]gH @@г5simplification_result R`55 S`551@@ @@@]hU@@@@@]i@@]jZ @@X3@@]k @@]l_ b^44@@@h@@]m @@]nek@@@ j\44@  As for [simplify], but also enables us to simplify based on equalities between variables. The caller must provide a function that tells us whether, if we simplify to a given variable, the value of that variable will be accessible in the current environment.  wX33 x[44@@@@@@@ }@@(@ =@@@@@@.simplify_named b5357 b535E@б@г!t b535H b535I@@ @@@]o3        @8@A@@б@гm%named'Flambda b535M b535T@  b535U b535Z@@@@@@]p @@г;simplification_result_named b535^ b535y@@ @@@]q'@@@@@]r@@]s, @@@4@@]t @@]u17@@@ b5353@@ ~@@@@78simplify_named_using_env d5{5 d5{5@б@г`!t e55 e55@@ @@@]v3        @Pe@A@@б1is_present_in_envб@гT!t(Variable!f55!f55@ !f55!f55@@@@@@]w @@г $bool!f55!f55@@ @@@]x+@@@@@]y@@]z0 @@б@г%named'Flambda!+g55!,g55@ !/g55!0g55@@@@@@]{H @@г;simplification_result_named!=h55!>h55@@ @@@]|U@@@@@]}@@]~Z @@X3@@] @@]_!Mf55@@@h@@] @@]ek@@@!Ud5{5{@@!a@@@@k=simplify_var_to_var_using_env!`m66!am66@б@г㠐!t!kn66!ln66@@ @@@]3!Z!Y!Y!Z!Z!Z!Z!Z@@A@@б1is_present_in_envб@г!t(Variable!o66!o67@ !o67!o67@@@@@@] @@г!5$bool!o67 !o67@@ @@@]+@@@@@]@@]0 @@г 栐&option!p77!!p77'@г !t(Variable!p77!p77@ !p77!p77 @@@@@@]P @@@ @@@]U@@S.@@] @@]Z!o66#@@@c@@] @@]`f(@@@!m66+@ If the given approximation identifies another variable and [is_present_in_env] deems it to be in scope, return that variable (wrapped in a [Some]), otherwise return [None]. !j66!l66@@@@@@@!@@;@!@@@@@@,simplify_var!r7)7-!r7)79@б@гz!t"r7)7<"r7)7=@@ @@@]3!!!!!!!!@8@A@@г!O&option"r7)7U"r7)7[@В@г%named'Flambda"#r7)7B"$r7)7I@ "'r7)7J"(r7)7O@@@@@@]& @@@г!t"7r7)7R"8r7)7S@@ @@@]5@@@@@ @@]<! @@@: @@@]A"Ir7)7A8@@@J@@] @@]GM=@@@"Qr7)7)@@@"]@@B@@MA+0get_field_resultI"]t7]7b"^t7]7r@@;@@"Ok@@@]@@"lu7u7w"mu7u7@@"y@+Unreachable@@"uv77"vv77@@"@@@A@@@@@"yt7]7]@@@@"@@#"u7u7y"u7u7{@@г!t"u7u7@@$3"u"t"t"u"u"u"u"u@?5;@@@A@@@@@@@@@A$@@@@&@#"""v77 @@@@#@@A@@@3""""""""@ @A #@)get_field"~99"~99@б@г$!t"~99"~99@@ @@@]3""""""""@&ZT@A@@б+field_indexг"#int"~99$"~99'@@ @@@]@@гo0get_field_result"~99+"~99;@@ @@@] @@@@]@@]%"~99 @@@.@@] @@]+1@@@"~99@ k Given the approximation [t] of a value, expected to correspond to a block (in the [Pmakeblock] sense of the word), and a field index then return an appropriate approximation for that field of the block (or [Unreachable] if the code with the approximation [t] is unreachable). N.B. Not all cases of unreachable code are returned as [Unreachable]. "x77"}99@@@@@@@"@@#@"@@@@@@JA+8checked_approx_for_blockJ#9=9B#9=9Z@@;@@%Wrong@@#9]9_#9]9f@@#@"OkZ!t@@@]"@@@]@@@]@@#(9g9i#)9g9@@#5@@@A@@@@@#,9=9=@@@@#8@@#''#39]9a%@$@@@(@#$$#99g9k#:9g9m@@г&#Tag#E9g9q#F9g9t@-#I9g9u#J9g9v@@@53#6#5#5#6#6#6#6#6@rO;@@@A@@@@@&@@@$@A @@г5%array#Y9g9{1@г9!t#a9g9y#b9g9z@@A@@@F<@@@@>@@A@:@@3#O#N#N#O#O#O#O#O@@A;>@6check_approx_for_block#o99#p99@б@г!t#z99#{99@@ @@@]3#i#h#h#i#i#i#i#i@3{@A@@г8checked_approx_for_block#99#9:@@ @@@]@@@@@]@@] @@@#99 @Ð T Try to prove that a value with the given approximation may be used as a block. #99#99@@@@@@@#@@@#i@@@@@@34approx_for_bound_var#::#::@б@г5value_set_of_closures#::#::@@ @@@]3########@La8@A@@б@г!t2Var_within_closure#::#:;@ #:;#:;@@@@@@] @@г d!t#:;#:;@@ @@@]'@@@@@]@@], @@@4@@] @@]17@@@#::@ + Find the approximation for a bound variable in a set-of-closures approximation. A fatal error is produced if the variable is not bound in the given approximation. $ ::$ ::@@@@@@@$@@"@ ;#ѐ@@@@@@P@@A@:@@3$$$$$$$$@@A;>@ 'strict_check_approx_for_set_of_closures$==%===@б@г!!t% =>=C% =>=D@@ @@@]3$$$$$$$$@*{@A@@г )strict_checked_approx_for_set_of_closures%=E=J%=E=s@@ @@@]@@@@@]@@] @@@%&== @@%2@@@@A+ "checked_approx_for_set_of_closuresL%2=u=z%3=u=@@;@@%Wrong@@%<==%===@@%I@*Unresolved"s@@@]@@%J==%K==@@%W@'Unknown@@%S==%T==@@%`@ #Unknown_because_of_unresolved_value"@@@]@@%a==%b=>@@%n@"Ok$!!t@@@]@@@]!Q@@@]@@%{>>%|>>@@%@@@A@@@@@%=u=u@@@@%@@#LL%==J@I@@@M@#II%==%==@B@гK0unresolved_value%==L@@R3%%%%%%%%@vl;@@@A@@@@@@@@@AR@@@@T@#PP%==N@M@@@Q@#MM%==%==@F@гO0unresolved_value%=>P@@VQ@@@@S@#OO%>>%>>@<@гQ&option%>>%>>@гV(Variable%>>%>>@]%>>%>>@@@e<@@@j= @@г`5value_set_of_closures%>>a@@gFb@@@@d@@A@`@@3%%%%%%%%@F@Aad@ check_approx_for_set_of_closures%??%??@б@г"k!t%??%??@@ @@@]3%%%%%%%%@a@A@@гР "checked_approx_for_set_of_closures&??&??@@ @@@]@@@@@]@@] @@@&?? @"< Try to prove that a value with the given approximation may be used as a set of closures. Values coming from external compilation units with unresolved approximations are permitted. &>>&?X?@@@@@@@&)@@@"L%␠@@@@@@3A+:checked_approx_for_closureM&4??&5??@@;@@%Wrong@@&>??&??@@@&K@"Ok"B@@@]%"!t@@@]@@@]%#g!t@@@]@@@]"?@@@]@@&i@@&j@0@c@@&v@@@A@@@@@&m??@@@@&y@@#88&t??6@5@@@9@#55&z@@&{@@ @@г7-value_closure&@@&@@@@?3&p&o&o&p&p&p&p&p@|Y;@@@A@@@@@@@@@A@@гA&option&@@)&@@/@гF(Variable&@@&@@&@M&@@'&@@(@@@U@@@Z  @@гP&option&@0@E&@0@K@гU&Symbol&@0@<&@0@B@\&@0@C&@0@D@@@d:@@@i; @@г_5value_set_of_closures&@0@N`@@fDa@@@@c@@A@_@@3&&&&&&&&@D@A`c@8check_approx_for_closure&AA&AA@б@г#X!t&AA&AA@@ @@@^3&&&&&&&&@_@A@@г:checked_approx_for_closure&AA&AA@@ @@@^@@@@@^@@^ @@@&AA @#) Try to prove that a value with the given approximation may be used as a closure. Values coming from external compilation units with unresolved approximations are not permitted. ' @e@e' @A%@@@@@@@'@@@#9&ϐ@@@@@@3A+ .checked_approx_for_closure_allowing_unresolvedN'!AA'"AB@@;@@%Wrong@@'+BB',BB@@'8@*UnresolvedÐ$b@@@^@@'9BB ':BB@@@'F@'UnknownĐ@@'BBABC'CBABL@@'O@ #Unknown_because_of_unresolved_valueŐ$y@@@^@@'PBMBO'QBMB@@']@"OkƐ#T@@@^&#!t@@@^@@@^&$y!t@@@^@@@^#Q@@@^@@'{BB'|BB@@'@@@A@@@@@'AA@@@@'@@#]]'BB[@Z@@@^@#ZZ'BB"'BB,@S@г\0unresolved_value'BB0]@@c3''''''''@};@@@A@@@@@@@@@Ac@@@@e@#aa'BABE_@^@@@b@#^^'BMBQ'BMBt@W@г`0unresolved_value'BMBxa@@gb@@@@d@#``'BB'BB@<@гb-value_closure'BB'BB@@j,@@гg&option'BB'BB@гl(Variable'BB'BB@s'BB'BB@@@{F@@@G @@гv&option'BB'BB@г{&Symbol'BB'BB@'BB'BB@@@a@@@b @@г5value_set_of_closures(BB@@k@@@@@@A@@@3''''''''@k@A@ ,check_approx_for_closure_allowing_unresolvedǠ( CxC|(CxC@б@г$!t(CC(CC@@ @@@^63((((((((@@A@@г .checked_approx_for_closure_allowing_unresolved('CC((CC@@ @@@^7@@@@@^8@@^9 @@@(4CxCx @$a As for [check_approx_for_closure], but values coming from external compilation units with unresolved approximations are permitted. (ABB(BC1Cw@@@@@@@(N@@@$q(@@@@@@36check_approx_for_floatȠ(XD)D-(YD)DC@б@г$۠!t(cD)DF(dD)DG@@ @@@^:3(R(Q(Q(R(R(R(R(R@La8@A@@г'&option(rD)DQ(sD)DW@г(!%float(|D)DK(}D)DP@@ @@@^;@@@@@@^= @@@&@@^> @@^?#)@@@(D)D)@$ > Returns the value if it can be proved to be a constant float (CC(CD(@@@@@@@(@@,@$(a@@@@@@B7float_array_as_constantɠ(DD(DD@б@г$1value_float_array(DD(DD@@ @@@^@3((((((((@[p8@A@@г( &option(DD(DD@г(1$list(DD(DD@г(%float(DD(DD@@ @@@^A#@@@@@@^C( @@@&@@@^E-#@@@5@@^F @@^G28(@@@(DD+@%$ D Returns the value if it can be proved to be a constant float array )DYDY)DYD@@@@@@@)@@;@%4(ʐ@@@@@@Q7check_approx_for_stringʠ)E.E2)E.EI@б@г%!t)&E.EL)'E.EM@@ @@@^H3))))))))@j8@A@@г(s&option)5E.EX)6E.E^@г(&string)?E.EQ)@E.EW@@ @@@^I@@@@@@^K @@@&@@^L @@^M#)@@@)QE.E.@%~ ? Returns the value if it can be proved to be a constant string )^DD)_DE-@@@@@@@)k@@,@%)$@@@@@@BA+7switch_branch_selectionO)vE`Ee)wE`E|@@;@@/Cannot_be_taken̐@@)EE)EE@@)@,Can_be_taken͐@@)EE)EE@@)@-Must_be_takenΐ@@)EE)EE@@)@@@A@@@@@)E`E`@@A@)@@#)EE@@@@ @#)EE@@@@@#)EE@@@@@@A@@@3))))))))@^@A@ %potentially_taken_const_switch_branchϠ)EE)EF"@б@г&9!t)EF%)EF&@@ @@@^T3))))))))@VP@A@@б@г)#int)EF*)EF-@@ @@@^U@@гi7switch_branch_selection)EF1)EFH@@ @@@^V@@@@@^W@@^X# @@@+@@^Y @@^Z(.@@@)EE@& < Check that the branch is compatible with the approximation )EE)EE@@@@@@@* @@"@&.)Đ@@@@@@G %potentially_taken_block_switch_branchР*FIFM*FIFr@б@г&!t* FIFu*!FIFv@@ @@@^[3********@`u8@A@@б@г)#int*1FIFz*2FIF}@@ @@@^\@@гȠ7switch_branch_selection*>FIF*?FIF@@ @@@^]@@@@@^^@@^_# @@@+@@^` @@^a(.@@@*PFIFI@@*\@@@@..function_arityѠ*[FF*\FF@б@г&B4function_declaration*fFF*gFF@@ @@@^b3*U*T*T*U*U*U*U*U@G\@A@@г*5#int*uFF*vFF@@ @@@^c@@@@@^d@@^e @@@*FF @@*@@@@!t6Set_of_closures_origin+}H+HM+~H+Hc@ +H+Hd+H+He@@@@@@^ug @@@@@^v@@^wl& @@г'5function_declarations+HgHl+HgH@@ @@@^xy@@@@@^y@@^z~+H+H0 @@@Q@@^{ @@^|+GG@@@@@^} @@^~@@@+GG@@+@@@@ update_function_declaration_bodyԠ+HH+HH@б@г'4function_declaration+HH+HH@@ @@@^3++++++++@@A@@б@б@г#!t'Flambda+HH+HH@ +HH+HH@@@@@@^ @@г#!t'Flambda+HH+HH@ +HH+HH@@@@@@^2 @@@@@^@@^7& @@г'㠐4function_declaration,HH,HH@@ @@@^D@@@@@^@@^I,HH @@@R@@^ @@^OU@@@,HH@@,&@@@@U0make_closure_map,%IzI~,&IzI@б@г)G#Map!t2Set_of_closures_id,8II,9II@ ,<II,=II@@,AII,BII@ @г(85function_declarations,LII,MII@@ @@@b3,;,:,:,;,;,;,;,;@;@A@@@+ @@@b @@г%#Map!t*Closure_id,hII,iII@ ,lII,mII@@,qII,rII@ @г(h5function_declarations,|II,}II@@ @@@b0@@@)@@@b5 @@@7@@b @@b:@@@@,IzIz@( v Creates a map from closure IDs to function declarations by iterating over all sets of closures in the given map. ,HH,ILIy@@@@@@@,@@-@(,a@@@@@@Y5clear_function_bodies,II,IJ @б@г(5function_declarations,IJ ,IJ!@@ @@@b3,,,,,,,,@r8@A@@г(5function_declarations,IJ%,IJ:@@ @@@b@@@@@b@@b @@@,II @@,@@@@@+*A@*o*iA@* *A@))A@)b)\A@)U(3B@(&&B@(%B@(%$B@(#B@(##B@( B@( AB@@f@_@@f@_@@@E@>@@@l@eP@I@@@A@:@@s@lW@P'@ m@M@@t(@!@@{@@o@h@@\@U@@/@@l@L@l@e@@@d,@ @A@A@3-A@  @ p @  @  @  @ s @  A@  @ l fA@  @  t@ T @A@{R@JDA@m@LFA@@c]A@yP@0@@q9@A@@}@@9@ @@~@w @@@3--------@@A@ H************************************************************************-A@@-A@L@ H -BMM-BM@ H OCaml -C-C@ H -D-D3@ H Pierre Chambart, OCamlPro -E44-E4@ H Mark Shinwell and Leo White, Jane Street Europe -F-F@ H -G-G@ H Copyright 2013--2016 OCamlPro SAS -H-Hg@ H Copyright 2014--2016 Jane Street Group LLC -Ihh-Ih@ H -J-J@ H All rights reserved. This file is distributed under the terms of -K-KN@ H the GNU Lesser General Public License version 2.1, with the -LOO-LO@ H special exception on linking described in the file LICENSE. -M-M@ H -N-N5@ H************************************************************************-O66-O6@ * Simple approximations to the runtime results of computations. This pass is designed for speed rather than accuracy; the performance is important since it is used heavily during inlining. ,A> [None] if unknown or mutable -]-]>@ l* A value of type [t] corresponds to an "approximation" of the result of a computation in the program being compiled. That is to say, it represents what knowledge we have about such a result at compile time. The simplification pass exploits this information to partially evaluate computations. At a high level, an approximation for a value [v] has three parts: - the "description" (for example, "the constant integer 42"); - an optional variable; - an optional symbol or symbol field. If the variable (resp. symbol) is present then that variable (resp. symbol) may be used to obtain the value [v]. The exact semantics of the variable and symbol fields follows. Approximations are deduced at particular points in an expression tree, but may subsequently be propagated to other locations. At the point at which an approximation is built for some value [v], we can construct a set of variables (call the set [S]) that are known to alias the same value [v]. Each member of [S] will have the same or a more precise [descr] field in its approximation relative to the approximation for [v]. (An increase in precision may currently be introduced for pattern matches.) If [S] is non-empty then it is guaranteed that there is a unique member of [S] that was declared in a scope further out ("earlier") than all other members of [S]. If such a member exists then it is recorded in the [var] field. Otherwise [var] is [None]. Analogous to the construction of the set [S], we can construct a set [T] consisting of all symbols that are known to alias the value whose approximation is being constructed. If [T] is non-empty then the [symbol] field is set to some member of [T]; it does not matter which one. (There is no notion of scope for symbols.) Note about mutable blocks: Mutable blocks are always represented by [Value_unknown] or [Value_bottom]. Any other approximation could leave the door open to a miscompilation. Such bad scenarios are most likely a user using [Obj.magic] or [Obj.set_field] in an inappropriate situation. Such a situation might be: [let x = (1, 1) in Obj.set_field (Obj.repr x) 0 (Obj.repr 2); assert(fst x = 2)] The user would probably expect the assertion to be true, but the compiler could in fact propagate the value of [x] across the [Obj.set_field]. Insisting that mutable blocks have [Value_unknown] or [Value_bottom] approximations certainly won't always prevent this kind of error, but should help catch many of them. It is possible that there may be some false positives, with correct but unreachable code causing this check to fail. However the likelihood of this seems sufficiently low, especially compared to the advantages gained by performing the check, that we include it. An example of a pattern that might trigger a false positive is: [type a = { a : int } type b = { mutable b : int } type _ t = | A : a t | B : b t let f (type x) (v:x t) (r:x) = match v with | A -> r.a | B -> r.b <- 2; 3 let v = let r = ref A in r := A; (* Some pattern that the compiler can't understand *) f !r { a = 1 }] When inlining [f], the B branch is unreachable, yet the compiler cannot prove it and must therefore keep it. *! ) No description was found for this value ..@ } CR-soon mshinwell: add support for the approximations of the results, so we can do all of the tricky higher-order cases. . . %W@ ( when [is_classic_mode] is [false], functions in [function_declarations] are guaranteed to have function bodies (ie: [function_declaration.function_body] will be of the [Some] variant). When it [is_classic_mode] is [true], however, no guarantees about the function_bodies are given. .XX.@ [* For functions that are very likely to be inlined, the size of the function's body. # ; Any freshening that has been applied to [function_decls]. .^`.^@ 5* Extraction of the description of approximation(s).  砠 4* Pretty-printing of approximations to a formatter.  2 (* Basic construction of approximations. # * Construct a closure approximation given the approximation of the corresponding set of closures and the closure ID of the closure to be projected from such set. [closure_var] and/or [set_of_closures_var] may be specified to augment the approximation with variables that may be used to access the closure value itself, so long as they are in scope at the proposed point of use. b * Construct a set of closures approximation. [set_of_closures_var] is as for the parameter of the same name in [value_closure], above.  * Take the given constant and produce an appropriate approximation for it together with an Flambda expression representing it.  * Augment an approximation with a given variable (see comment above). If the approximation was already augmented with a variable, the one passed to this function replaces it within the approximation.  <* Like [augment_with_variable], but for symbol information.  @* Like [augment_with_symbol], but for symbol field information.  3* Replace the description within an approximation.  :* Improve the description by taking the kind into account V :* Improve the kind by taking the description into account 蠠 CR-soon mshinwell for pchambart: Add comment describing semantics. (Maybe we should move the comment from the .ml file into here.) .E:...F;/M/@ =* An approximation is "known" iff it is not [Value_unknown].  E* An approximation is "useful" iff it is neither unknown nor bottom. s J* Whether all approximations in the given list do *not* satisfy [useful].  * Whether to warn on attempts to mutate a value. It must have been resolved (it cannot be [Value_extern] or [Value_symbol]). (See comment above for further explanation.) Ԡ * Given an expression and its approximation, attempt to simplify the expression to a constant (with associated approximation), taking into account whether the expression has any side effects. | * As for [simplify], but also enables us to simplify based on equalities between variables. The caller must provide a function that tells us whether, if we simplify to a given variable, the value of that variable will be accessible in the current environment.  㠠 * If the given approximation identifies another variable and [is_present_in_env] deems it to be in scope, return that variable (wrapped in a [Some]), otherwise return [None].  } l* Given the approximation [t] of a value, expected to correspond to a block (in the [Pmakeblock] sense of the word), and a field index then return an appropriate approximation for that field of the block (or [Unreachable] if the code with the approximation [t] is unreachable). N.B. Not all cases of unreachable code are returned as [Unreachable].  t U* Try to prove that a value with the given approximation may be used as a block.  * Find the approximation for a bound variable in a set-of-closures approximation. A fatal error is produced if the variable is not bound in the given approximation.  [ "* Given a set-of-closures approximation and a closure ID, apply any freshening specified by the approximation to the closure ID, and return the resulting ID. Causes a fatal error if the resulting closure ID does not correspond to any function declaration in the approximation.  s In the [Ok] case, there may not be a variable associated with the set of closures; it might be out of scope. .l>>.m>b>@ * Try to prove that a value with the given approximation may be used as a set of closures. Values coming from external compilation units with unresolved approximations are permitted. V * Try to prove that a value with the given approximation may be used as a closure. Values coming from external compilation units with unresolved approximations are not permitted. l s CR-someday mshinwell: naming is inconsistent: this is as "strict" as "strict_check_approx_for_set_of_closures" .xA&A&.yAkA@ * As for [check_approx_for_closure], but values coming from external compilation units with unresolved approximations are permitted. = ?* Returns the value if it can be proved to be a constant float 栠 E* Returns the value if it can be proved to be a constant float array  @* Returns the value if it can be proved to be a constant string ) =* Check that the branch is compatible with the approximation  [* Create a set of function declarations based on another set of function declarations.  w* Creates a map from closure IDs to function declarations by iterating over all sets of closures in the given map. @-./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"-c.ʐ. F/home/ci/builds/workspace/main/flambda/false/label/ocaml-ubuntu-latest >10/.-,+*)('&%$#"! @@0BbP1DJy}3........@.@@/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 B2(0CJ9DןRa7ݷ$E&'0VJ͟*Format_doc0uy@GmWUࠠ#0xW("-9wVԠ%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 xj56,0LbO`ܩ&M( 0!YA _XO %Shape0 M``ll/0 c[k%S\KѠ0Static_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+,א03E?Y7(*^0&b rٍ.Type_immediacy00$ jbv\"k&%Types0"|Vȷ`X )Unit_info0'T Χ@aR2Var_within_closure0``ݗXFR⠠(Variable0?l猵eY(Warnings0Ef{&@0 c[k%S\KA%@  O  ʰ*)*)߰,ے,@wΰ,0)@@@ΐ@@@ @@Ԑ%Ky,,@!!@@   ْ m@Ԑ,+@ ߐ A,@() (ǰ--@ړưv+{*@(T'@4Ȑ@.X. @@##@-ޒ..r.B@ / @@Ր.*)@@--@@`,F#@۰";"+m*@ M ư&f%o@@& $+(*@Or'*&@  ̰ p &Õ%@6@,)@+*@@@((:--@@@))Y@@Q(r'+6*5@ݐ ݐ%@D*@OA+*@((p@@@$@$6@̐@@@;,ƒ,@$ #@@ѐ! 3 @@@ Ǔ !a!@)@@(@++@ $ S@@  a,'@@@@('@;r$`$D&e%((`@##Z@&&@!}+*@.t.b@&e$@aS*&*@6)̕)@  Z  [@"%"p@Ր.Rl@@&f$@@@@@  ѐ>.".R@J/O/k@  ѐ"@  )(C@@P@ ғ @@@@@o@@  "  F,+@-a-@@''@{)D(@+*@ ϒ #z**p@-$.i.R@@,+--@3(#Ȑ$@  @  ư*6)@y̰}@(V@'*&@ҐP . j-ڕ-@'&)R(@ܐ '//^@vǰ$C$@@L(''@@@)t-\'@@P@@