Caml1999I031 f U*Freshening!t8@@@A@@@@@ !middle_end/flambda/freshening.mliV''V'-@@@@ @A@%subst8@@@A@@@@@@@W..W.<@@@@AA@%empty @@@@[[@@%B@(is_empty@@@@$boolE@@@@@@/]0]@@9C@(activate@/@@@2@@@@@@@bAb@@JD@ !empty_preserving_activation_state@@@@@C@@@@@@QfRf6@@[E@,add_variable@Q@@@@(Variable!t@@@ !t@@@h@@@@@@@@@@vqwq@@F@.add_variables'@v@@@@$listI+!t@@@@@@9!t@@@@@@@@@@@@@@@@u 1 1x ` x@@G@-add_variables@@@@@/[!t@@@!a@@@@@@Eq!t@@@@@@@@@@@@@@@@@@|    5@@H@4add_mutable_variable@@@@@0Mutable_variable!t@@@ !t@@@@@@@@@@@@@B n nB n @@ I@4add_static_exception@@@@@0Static_exception!t@@@ !t@@@@@@@@@@@@@(E  )E  L@@2J@.apply_variable@(@@@@!t@@@!t@@@@@@@@DI  EI  @@NK@6apply_mutable_variable@D@@@@f!t@@@l!t@@@@@@@@`L K KaL K @@jL@6apply_static_exception@`@@@@]!t@@@c!t@@@@@@@@|O  }O  '@@M@ $rewrite_recursive_calls_with_symbols@|@@@@'Flambda5function_declarations@@@3make_closure_symbol@*Closure_id!t@@@&Symbol!t@@@@@5function_declarations@@@@@@@@@@W11[@@N@Ӡ+Project_var@!t8@@@A@@@@@rLNrLT@@@@OA@%empty@@@k@uu@@P@'compose'earlier@@@l%later@@@m@@@n@@o@@p@xx@@Q@0apply_closure_id@)@@@q@\!t@@@rb!t@@@s@@t@@u@7@@ R@8apply_var_within_closure@E@@@v@2Var_within_closure!t@@@w!t@@@x@@y@@z@ ~!@@*S@%print@&Stdlib&Format)formatter@@@{@o@@@|$unitF@@@}@@~@@@@A @@JT@@@D_^^E @NU@@ "apply_function_decls_and_free_vars@D@@@@#Map!t.specialised_to@@@Π!a@@@@@@@5function_declarations@@@7only_freshen_parametersN@@@#Map!t.specialised_to@@@נ*@@@@@٠5function_declarations@@@ՠ@@@Ԡ!t@@@@@@@@@@@@@@CCFY@@V@0does_not_freshen@@@@@-V!t@@@@@@@@@@@@@@[[[@@W@%print@&Format)formatter@@@@@@@@@@@@@@@@@X@;freshen_projection_relation@#Map!td.specialised_to@@@@@@*freshening@@@2closure_fresheninge!t@@@#Map!t.specialised_to@@@@@@@@@@@@@BB@@ Y@*Su}Ck-Stdlib__Uchar0*Ujmyc6]]W.Stdlib__String0I3UK# +Stdlib__Set0.z9FX+Stdlib__Seq05"g1<)b+Stdlib__Map0kZ,ҷ'V.Stdlib__Lexing01'jh,-k4,Stdlib__Lazy0C 4 "$p1tU-Stdlib__Int640X|Gj|}%/Stdlib__Hashtbl04$*uկdD.Stdlib__Format0{hXsHW#ȼ.Stdlib__Either0&]XF.Stdlib__Digest0aI]2t*x4%".Stdlib__Buffer0K ɦb+Z8)#KH"&Stdlib0yӶ~*0Static_exception0 ]8bVwPH%Shape0H[DTċwToe@Q6Set_of_closures_origin0M0-+s-zXĩݠ2Set_of_closures_id0!7䭔(o*Projection00 rgi.1eҠ)Primitive0յ_9|br$Path0L%SsN|#Ɣj)Parsetree0`ⰧkRE)Parameter0‘sEB $^+Outcometree0gCtr8@A@@@[ @X P The freshening that does nothing. This is the unique inactive freshening. Y>>Z@@@@@@@B@@(is_empty]]@б@г!t]]@@ @@@0@.A,@A@@г$bool]]@@ @@@@@@@@@@@] @@ C@ @@(activateb b@б@г!tbb@@ @@@0@1F@A@@г!t"b#b@@ @@@@@@@@@@@-b @Ő Activate the freshening. Without activation, operations to request freshenings have no effect (cf. the documentation below for [add_variable]). As such, the inactive renaming is unique. 9_:aE@@@@@@@FD@@% !empty_preserving_activation_stateEf Ff-@б@г점!tPf0Qf1@@ @@@0A@@AAAAA@>S,@A@@г!t_f5`f6@@ @@@@@@@@@@@jf @ c Given the inactive freshening, return the same; otherwise, return an empty active freshening. vdwe@@@@@@@E@@%,add_variable)qq@б@г)!tqq@@ @@@0~}}~~~~~@>S,@A@@б@г(Variable!t(Variableqq@@@@@i@@Вг!t(Variableqq@@ @@@j)@@г`!tqq@@ @@@k7@@@@@l< @@@,@@m?/ @@@E@@nBH@@@q@o f [add_variable t var] If [t] is active: It returns a fresh variable [new_var] and adds [var] -> [new_var] to the freshening. If a renaming [other_var] -> [var] or [symbol] -> [var] was already present in [t], it will also add [other_var] -> [new_var] and [symbol] -> [new_var]. If [t] is inactive, this is the identity. h88p@@@@@@@F@"@U.add_variables'*u 1 5u 1 C@б@г!tv D Iv D J@@ @@@o0@n,@A@@б@г$list w K [ w K _@гw!t(Variablew K Pw K Z@@ @@@p@@@@@@r# @@Вг$list-x ` p.x ` t@г!t(Variable:x ` e;x ` o@@ @@@s@@@@@@@uE @@г預!tMx ` wNx ` x@@ @@@vS@@@@@wX @@@<@@x[C @@@a@@y^d@@@`u 1 1@ Q Like [add_variable], but for multiple variables, each freshened separately. lsmt  0@@@@@@@yG@"@q-add_variables+x|  y|  @б@г!t}  }  @@ @@@z0tssttttt@,@A@@б@г$list~  ~  @Вг!t(Variable~  ~  @@ @@@{!@@А!a@C@|+~  ~  @@@ @@}2@@@.@@@7~  ,@@ВгL$list  -  1@Вг:!t(Variable    &@@ @@@X@@А!a7]  )  +@@@>@@d@@@)@@@i  '@@г!t  4  5@@ @@@x@@@@@} @@@M@@I @@@@@@@@|  @ a Like [add_variables'], but passes through the second component of the input list unchanged. z z z{  @@@@@@@'H@"@4add_mutable_variable@&B n r'B n @б@г͠!t1B n 2B n @@ @@@0"!!"""""@,@A@@б@г0Mutable_variable!t0Mutable_variableGB n HB n @@@@@@@Вг!t0Mutable_variableZB n [B n @@ @@@)@@г!thB n iB n @@ @@@7@@@@@< @@@,@@?/ @@@E@@ BH@@@{B n n@ 1 Like [add_variable], but for mutable variables. A 7 7A 7 m@@@@@@@I@"@U4add_static_exceptionME  E  @б@г:!tE  E  @@ @@@!0@n,@A@@б@г0Static_exception!t0Static_exceptionE  E  2@@@@@\@@Вг!t0Static_exceptionE  6E  H@@ @@@])@@гq!tE  KE  L@@ @@@^7@@@@@_< @@@,@@`?/ @@@E@@aBH@@@E  @ > As for [add_variable], but for static exception identifiers. D  D  @@@@@@@J@"@U.apply_variableNI  I  @б@г!t I   I  @@ @@@b0@n,@A@@б@г~!t(VariableI   I  @@ @@@c@@г!t(Variable/I  0I  @@ @@@d$@@@@@e'@@@-@@f*0 @@@=I  @Ր [apply_variable t var] applies the freshening [t] to [var]. If no renaming is specified in [t] for [var] it is returned unchanged. IG N NJH  @@@@@@@VK@@=6apply_mutable_variableOUL K OVL K e@б@г!t`L K haL K i@@ @@@g0QPPQQQQQ@Vk,@A@@б@г/!t0Mutable_variabletL K muL K @@ @@@h@@г?!t0Mutable_variableL K L K @@ @@@i$@@@@@j'@@@-@@k*0 @@@L K K@* 5 As for [apply_variable], but for mutable variables. K  K  J@@@@@@@L@@=6apply_static_exceptionPO  O  @б@гQ!tO  O  @@ @@@l0@Vk,@A@@б@г!t0Static_exceptionO  O  @@ @@@m@@г'!t0Static_exceptionO  O  '@@ @@@n$@@@@@o'@@@-@@p*0 @@@O  @ @ As for [apply_variable], but for static exception identifiers. N  N  @@@@@@@M@@= $rewrite_recursive_calls_with_symbolsW15W1Y@б@г!t XZ_ XZ`@@ @@@q0@Vk,@A@@б@г'Flambda5function_declarations'Flambda Yaf!Ya@@@@@ J@@б3make_closure_symbolб@г*Closure_id!t*Closure_id8Z9Z@@@@@ .@@г&Symbol!t&SymbolJZKZ@@@@@ !@@@@@@ "C@@г?5function_declarations'Flambda][^[@@ @@@ #S@@=@@ $VfZ @@@G@@ %ZJ @@@`@@ &]c@@@oW11@  Replace recursive accesses to the closures in the set through [Symbol] by the corresponding [Var]. This is used to recover the recursive call when importing code from another compilation unit. If the renaming is inactive, this is the identity. {Q ) )|V.0@@@@@@@N@!@p+Project_vartC_^e_^p@@БA(!tDrLSrLT@@8@@@A@@@@@rLN@3  A table used for freshening of identifiers in [Project_closure] and [Move_within_set_of_closures] ("ids of closures"); and [Project_var] ("bound vars of closures") expressions. This information is propagated bottom up and populated when inlining a function containing a closure declaration. For instance, [let f x = let g y = ... x ... in ... g.x ... (Project_var x) ... g 1 ... (Apply (Project_closure g ...)) ] If f is inlined, g is renamed. The approximation of g will carry this table such that later the access to the field x of g and selection of g in the closure can be substituted. `wyqFK@@@@@@@@@O@@A@@0@?@A@%emptyuu@г'!tuu@@ @@@ '0@2,@A@@@u @@P@ @@'composexx@б'earlierгI!txx@@ @@@ (0@#6!@A@@б%laterг\!txx@@ @@@ )@@гi!txx@@ @@@ * @@@@ +# x @@5*@@ ,' x @@@x@ ! Composition of two freshenings. ww@@@@@@@)Q@@;0apply_closure_id()@б@г!t34@@ @@@ -0$##$$$$$@Tk,@A@@б@г!t*Closure_idGH'@@ @@@ .@@г!!t*Closure_idW+X7@@ @@@ /$@@@@@ 0'@@@-@@ 1*0 @@@e@  Freshen a closure ID based on the given renaming. The same ID is returned if the renaming does not affect it. If dealing with approximations, you probably want to use [Simple_value_approx.freshen_and_check_closure_id] instead of this function. qzr@@@@@@@~R@@=8apply_var_within_closureϠ}~~~@б@г!t@@ @@@ 20yxxyyyyy@Vk,@A@@б@г2Var_within_closure!t2Var_within_closure@@@@@ @@г!t2Var_within_closure@@ @@@ &@@@@@ )@@@/@@ ,2 @@@~@T = Like [apply_closure_id], but for variables within closures. 9;9}@@@@@@@S@@?%prints@б@г&Format)formatter@@ @@@0@[p/@A@@б@г\!t@@ @@@@@гE$unit @@ @@@@@@@@!@@@'@@$* @@@@@T@@@*@zA@dO@H @@a@M@@0      @7O@A0        @v@A"_^s# @@@%_^^@@ "apply_function_decls_and_free_vars/CG0Ci@б@г֠!t:jo;jp@@ @@@0+**+++++@@A@@z;@'@@C@@@+ZU@A@@б@г#Map!t(Variable`qaq@ВгR.specialised_to'Flambdapqwqq@@ @@@6@@А!a@E@@qq@@@ @@G@@@4@@@Lqv,@@б@г{5function_declarations'Flambda@@ @@@_@@б7only_freshen_parametersгe$bool@@ @@@p@@Вг#Map!t(Variable @Вг.specialised_to'Flambda@@ @@@@@А!a` @@@g@@@@@/@@@'@@г5function_declarations'Flambda =@@ @@@@@г!t >D >E@@ @@@ǰ@@г!t+Project_var FL FY@@ @@@ذ@@@9' @@߰8 @@u @@ "@@@@@@@@@@@@@@@@@@ .CC@@ :V@@@0does_not_freshen 9[_ :[o@б@гࠐ!t D[r E[s@@ @@@0 5 4 4 5 5 5 5 5@  @A@@б@г֠$list U[ V[@г!t(Variable b[w c[@@ @@@@@@@@@# @@г /$bool t[ u[@@ @@@0@@@@@3@@@9@@6< @@@ [[@@ W@@@<%print  @б@гO&Format)formatter  @@ @@@0        @Xm"@A@@б@гH!t  @@ @@@@@г$unit  @@ @@@@@@@@!@@@'@@$* @@@ @@ X@@@*;freshen_projection_relation BF Ba@б@г@#Map!t(Variable b~ b@г.specialised_to'Flambda bg b}@@ @@@0        @Vn2@A@@@" @@@ @@б*fresheningг!t  @@ @@@@@б2closure_fresheningг!t+Project_var  @@ @@@,@@г#Map!t(Variable / 0@г.specialised_to'Flambda < =@@ @@@L@@@ @@@Q @@9+@@T J@@NC@@X N@@@Y@@\b"@@@ TBB%@쐠 P N.B. This does not freshen the domain of the supplied map, only the range.  ` a@@@@@@@ mY@4@o@@г;#Map!t(Variable | |@Вг.specialised_to'Flambda | |@@ @@@a@@А!a_f | |@@@f@@m@@@/@@@r |'@@I;@@v V[+@@^S@@z DI/@@@j@@~f2@@@ 5@@ Z@7@@@  A@  A@ s ^@ J #@ @@O@;@@@F@2@@M@9@@@@@ @@x@q@0@@0 - , , - - - - -@2@A@ H************************************************************************ GA@@ HA@L@ H  MBMM NBM@ H OCaml  SC TC@ H  YD ZD3@ H Pierre Chambart, OCamlPro  _E44 `E4@ H Mark Shinwell and Leo White, Jane Street Europe  eF fF@ H  kG lG@ H Copyright 2013--2016 OCamlPro SAS  qH rHg@ H Copyright 2014--2016 Jane Street Group LLC  wIhh xIh@ 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@ %* Freshening of various identifiers.  H J* A table used for freshening variables and static exception identifiers.  . Q* The freshening that does nothing. This is the unique inactive freshening.  ۠ * Activate the freshening. Without activation, operations to request freshenings have no effect (cf. the documentation below for [add_variable]). As such, the inactive renaming is unique.  q d* Given the inactive freshening, return the same; otherwise, return an empty active freshening.  7 g* [add_variable t var] If [t] is active: It returns a fresh variable [new_var] and adds [var] -> [new_var] to the freshening. If a renaming [other_var] -> [var] or [symbol] -> [var] was already present in [t], it will also add [other_var] -> [new_var] and [symbol] -> [new_var]. If [t] is inactive, this is the identity. ͠ R* Like [add_variable], but for multiple variables, each freshened separately. G b* Like [add_variables'], but passes through the second component of the input list unchanged.  2* Like [add_variable], but for mutable variables. 2 ?* As for [add_variable], but for static exception identifiers. Ƞ * [apply_variable t var] applies the freshening [t] to [var]. If no renaming is specified in [t] for [var] it is returned unchanged. v 6* As for [apply_variable], but for mutable variables. $ A* As for [apply_variable], but for static exception identifiers. Ҡ * Replace recursive accesses to the closures in the set through [Symbol] by the corresponding [Var]. This is used to recover the recursive call when importing code from another compilation unit. If the renaming is inactive, this is the identity. M } CR-soon mshinwell for mshinwell: maybe inaccurate module name, it freshens closure IDs as well. Check use points though  ] ^*]@ * A table used for freshening of identifiers in [Project_closure] and [Move_within_set_of_closures] ("ids of closures"); and [Project_var] ("bound vars of closures") expressions. This information is propagated bottom up and populated when inlining a function containing a closure declaration. For instance, [let f x = let g y = ... x ... in ... g.x ... (Project_var x) ... g 1 ... (Apply (Project_closure g ...)) ] If f is inlined, g is renamed. The approximation of g will carry this table such that later the access to the field x of g and selection of g in the closure can be substituted. * # The freshening that does nothing.  tVX tV@ "* Composition of two freshenings.  * Freshen a closure ID based on the given renaming. The same ID is returned if the renaming does not affect it. If dealing with approximations, you probably want to use [Simple_value_approx.freshen_and_check_closure_id] instead of this function. l >* Like [apply_closure_id], but for variables within closures.  . CR-soon mshinwell for mshinwell: add comment   B@ Q* N.B. This does not freshen the domain of the supplied map, only the range.  , CR-someday mshinwell: consider fixing that   A@@-./boot/ocamlc"-g)-nostdlib"-I$boot*-use-prims2runtime/primitives0-strict-sequence*-principal(-absname"-w>+a-4-9-40-41-42-44-45-48-66-70+-warn-error"+a*-bin-annot,-safe-string/-strict-formats"-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"-c   3/home/barsac/ci/builds/workspace/step-by-step-build - @0$Olg940        @ @@/Allocated_const08UYwBkc6@.(Asttypes0'$O~75Build_path_prefix_map0xөvĠ8CamlinternalFormatBasics0cEXy*Su}Ck&Symbol0SW9粩i#Tag0.ΒN1BK@:), .Type_immediacy0dV^25b)̓ԆSj%Types0lm?ƈ2Var_within_closure0GMUu_%T[ 0+d2 ޲ՠ(Warnings0zdͦkUe$@01]6 ¡A[@@$# V U@1@GF@@ED      @ # "@@@  @lklk@GF@@@ N M@    @@P@