Caml1999I037„•¦¾ø,¦— .Lift_constants ° .lift_constantsZÐÀÁ@ÀªÀ³¡’'Flambda'program@@õá@ø@õá@ùÀÁ'backendÀªÀ› ¡’,Backend_intf!S@õá@ú@õá@ûÀ³¡'program@@õá@ü@õá@ý@õá@þ@°À %middle_end/flambda/lift_constants.mli~ › ›ÀA è ü@@±+@@@@„•¦¾¦Têü  .Lift_constants0Ÿrn¤ð _½tûo~  (Warnings0¹‘¡ûÓÉÎþEëf¹{²&Š  (Variable0?ÄÞÕæl猵ÇeY  2Var_within_closure0Œ``Ý—ÓXFì³R–ÿâ  )Unit_info0'Á¸›T•ø ¶Î§@aÂR  %Types0€"˜Í|VÈ·`ØX ù  .Type_immediacy00$ôÍ jÌbv\"õkö&  #Tag0‹&›Óbé… “ÊrÙ¹  &Symbol03ÉæE´?Yßö¦7÷‘(  %Subst0—’í=aëqT£/!p+  -Stdlib__Uchar0þ´=‹ÌH^®V9‚˜>ÌÉ  +Stdlib__Sys0öb÷'8ï=OðþIn  .Stdlib__String0 w_‡OA4D"Q~¾õ~  +Stdlib__Set0ø¯Ü”@Z8XäWåaŽa2  +Stdlib__Seq0 ?¯…¨72#š£[O  .Stdlib__Result0pŽ~ !Ô¥Â/”/²‚ö  +Stdlib__Map0*4ɇÂ2ù  .Stdlib__Domain0'Í¿‚Žo\¦0m’š¬.K  .Stdlib__Digest0#z25§ÆªÂ¶I*…  .Stdlib__Buffer0,å¦I÷ú[?¹Ä÷—z  &Stdlib0t0µVoS%{<‰F¡:  0Static_exception0JÕm¹yrqÜ’x-¸º8Éž  3Simple_value_approx0¼ Ãc[kð%»S\KÑ  %Shape0• À³M„´Î``ll§  6Set_of_closures_origin0!Y‹AÊë _’éXO¼   2Set_of_closures_id0L‰Èb£O`àÜ©&°öðM  *Projection02h‹ÂS xíj56  )Primitive0õÛdU˜=úÑ\IÆ/ø}  $Path0¸Ðk.tåb ûÃGêmá  )Parsetree0v Ýo[p÷…¯îÓY Y  )Parameter0zk^fË2mËÝy£ˆ£1Ù9  +Outcometree0B³u©Gê^)=¾ú 9c  'Numbers0 qàÞ·Heüš‡ù³–  0Mutable_variable0ÈC«ÁQâá·§£$òÜ´‰  $Misc0Ž€Bâõú¾åpg]?[q…  )Longident0ØwP qÍ;°œ±É¡  (Location0–ÈnBÉŠÄOn?§ö7~Ø  )Load_path0Å,jÚ ¡ö" ¡–nn7Ý  ,Linkage_name0t–м†ÔˆïK¨1G«  &Lambda0®xÏ_eódT Õ-uq  7Internal_variable_names0TbÁg€Ñ¹•äG+L›  ,Identifiable0ä]¡/­§*N »Ì ‡  %Ident0>®Ðƒ²Ðz€V)±j¢â  *Freshening0xWŸþ(¥"-9wõV¥öÔ  *Format_doc0¯æuy@½…GmWðUà  'Flambda0“¤æVåJíŒÎëÍŸª  )Export_id0ÕCJ9DןRaý7Ý·$E  #Env0¬–áS—½  ÖïBµ™2  )Debuginfo0_‹·Œí |Po†oÓGq  *Data_types0v\ò«É3Ï,¦S€ví¿hø  0Compilation_unit0òöD£lˆ ]wN  *Cmi_format0ŸÀø±®µ¡`M¾{?w}@  .Closure_origin0!Hðaðvl³·¨Ú5"_  *Closure_id0 (—ïú‚?ª$ŽŽÏñ  /Closure_element0¢ Ç”‰¡¿f#M†ö  2Clambda_primitives0ïØ|&»” Á%ZIÇz  0CamlinternalLazy0é ÈzYØ#¾â #4²ñ#-  8CamlinternalFormatBasics0“…Ä|.e1R¾$½ŠÕ|o  5Build_path_prefix_map0DGl…Ê}Ã%Yÿ5µLhi  ,Backend_intf0žó‹š•LúQé:X^rà#  (Asttypes0ÁeT$B¹b‚RMü Ädc  /Allocated_const0—­/v«V˜ëÇŸøxšš@„•¦¾ @@Caml1999T037„•¦¾.QA ÖC.Lift_constants’° °ž° -ocaml.warning°À %middle_end/flambda/lift_constants.mliQ„ˆÀQ„•@   À‘ ²2+a-4-9-30-40-41-42°À Q„—ÀQ„©@@°ÀQ„–ÀQ„ª@°@@@@@°ÀQ„„ÀQ„«@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@ n Y@ @ @@@@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@@A ° 5!4!@’£)Not_foundZ#O@@@A& ° =)<)@’£-Out_of_memoryW#W@@@A. ° E1D1@’£.Stack_overflow^#_@@@A6 ° M9L9@’£.Sys_blocked_io_#g@@@A> ° UATA@’£)Sys_error[#o@ j@@AG ° ^J]J@’£:Undefined_recursive_modulea#x@ À’  @w  @s  @u@õá@h@@AX ° o[n[@’£:Continuation_already_takenb#‰@@@A` ° wcvc@’’&Stdlib@A°•”@ °ž° *ocaml.textn   À‘ ² ç The aim of this pass is to assign symbols to values known to be constant (in other words, whose values we know at compile time), with appropriate sharing of constants, and replace the occurrences of the constants with their corresponding symbols. This pass uses the results of two other passes, [Inconstant_idents] and [Alias_analysis]. The relationship between these two deserves some attention. [Inconstant_idents] is a "backwards" analysis that propagates implications about inconstantness of variables and set of closures IDs. [Alias_analysis] is a "forwards" analysis that is analogous to the propagation of [Simple_value_approx.t] values during [Inline_and_simplify]. It gives us information about relationships between values but not actually about their constantness. Combining these two into a single pass has been attempted previously, but was not thought to be successful; this experiment could be repeated in the future. (If "constant" is considered as "top" and "inconstant" is considered as "bottom", then [Alias_analysis] corresponds to a least fixed point and [Inconstant_idents] corresponds to a greatest fixed point.) At a high level, this pass operates as follows. Symbols are assigned to variables known to be constant and their defining expressions examined. Based on the results of [Alias_analysis], we simplify the destructive elements within the defining expressions (specifically, projection of fields from blocks), to eventually yield [Flambda.constant_defining_value]s that are entirely constructive. These will be bound to symbols in the resulting program. Another approach to this pass could be to only use the results of [Inconstant_idents] and then repeatedly lift constants and run [Inline_and_simplify] until a fixpoint. It was thought more robust to instead use [Alias_analysis], where the fixpointing involves a less complicated function. We still run [Inline_and_simplify] once after this pass since the lifting of constants may enable more functions to become closed; the simplification pass provides an easy way of cleaning up (e.g. making sure [free_vars] maps in sets of closures are correct). °À¹S­­Àº| — ™@@@@@@¥ °ð .lift_constantsW °ÀÃ~ › ŸÀÄ~ › ­@б@г¡’'Flambda'program ¡ 'Flambda°ÀÔ ® ³ÀÕ ® º@  °ÀØ ® »ÀÙ ® Â@°@@À³@@õá@ QȰ @@б'backendЙ°¡’,Backend_intf!S@ ¡ ,Backend_intf°Àñ@ à ØÀò@ à ä@  °Àõ@ à åÀö@ à æ@°@À› @õá@ Rå°Àü@ à ÐÀý@ à ç@@г¡7'program ¡ 'Flambda°À A è íÀ A è ô@  °À A è õÀA è ü@°@@À³@@õá@ Sý° @@ÀÁ5Àª @õá@ T@õá@ U°À@ Ã È @@ÀÁ@ÀªC@õá@ V @õá@ W°K@@Ð@°À!~ › ›@@±-@@@°@@@ °g@@3@°i @A@   H************************************************************************°À,A@@À-A@L@   H °À2BMMÀ3BM™@   H OCaml °À8CššÀ9Cšæ@   H °À>DççÀ?Dç3@   H Pierre Chambart, OCamlPro °ÀDE44ÀEE4€@   H Mark Shinwell and Leo White, Jane Street Europe °ÀJFÀKFÍ@   H °ÀPGÎÎÀQGÎ@   H Copyright 2013--2016 OCamlPro SAS °ÀVHÀWHg@   H Copyright 2014--2016 Jane Street Group LLC °À\IhhÀ]Ih´@   H °ÀbJµµÀcJµ@   H All rights reserved. This file is distributed under the terms of °ÀhKÀiKN@   H the GNU Lesser General Public License version 2.1, with the °ÀnLOOÀoLO›@   H special exception on linking described in the file LICENSE. °ÀtMœœÀuMœè@   H °ÀzNééÀ{Né5@   H************************************************************************°À€O66ÀO6‚@   è* The aim of this pass is to assign symbols to values known to be constant (in other words, whose values we know at compile time), with appropriate sharing of constants, and replace the occurrences of the constants with their corresponding symbols. This pass uses the results of two other passes, [Inconstant_idents] and [Alias_analysis]. The relationship between these two deserves some attention. [Inconstant_idents] is a "backwards" analysis that propagates implications about inconstantness of variables and set of closures IDs. [Alias_analysis] is a "forwards" analysis that is analogous to the propagation of [Simple_value_approx.t] values during [Inline_and_simplify]. It gives us information about relationships between values but not actually about their constantness. Combining these two into a single pass has been attempted previously, but was not thought to be successful; this experiment could be repeated in the future. (If "constant" is considered as "top" and "inconstant" is considered as "bottom", then [Alias_analysis] corresponds to a least fixed point and [Inconstant_idents] corresponds to a greatest fixed point.) At a high level, this pass operates as follows. Symbols are assigned to variables known to be constant and their defining expressions examined. Based on the results of [Alias_analysis], we simplify the destructive elements within the defining expressions (specifically, projection of fields from blocks), to eventually yield [Flambda.constant_defining_value]s that are entirely constructive. These will be bound to symbols in the resulting program. Another approach to this pass could be to only use the results of [Inconstant_idents] and then repeatedly lift constants and run [Inline_and_simplify] until a fixpoint. It was thought more robust to instead use [Alias_analysis], where the fixpointing involves a less complicated function. We still run [Inline_and_simplify] once after this pass since the lifting of constants may enable more functions to become closed; the simplification pass provides an easy way of cleaning up (e.g. making sure [free_vars] maps in sets of closures are correct). Í@ó-./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ÀÁ 9/builds/workspace/main/flambda/false/label/ocaml-linux-32    > 1 0 / . - , + * ) ( ' & % $ # " !     @@0;ëÛg[Š˜^8 ’DÒ3ÈÇÇÈÈÈÈÈ@Æ@@  /Allocated_const0—­/v«V˜ëÇŸøxšš  (Asttypes0ÁeT$B¹b‚RMü Ädc  ü0žó‹š•LúQé:X^rà#  5Build_path_prefix_map0DGl…Ê}Ã%Yÿ5µLhi  8CamlinternalFormatBasics0“…Ä|.e1R¾$½ŠÕ|o  0CamlinternalLazy0é ÈzYØ#¾â #4²ñ#-  2Clambda_primitives0ïØ|&»” Á%ZIÇz  /Closure_element0¢ Ç”‰¡¿f#M†ö  *Closure_id0 (—ïú‚?ª$ŽŽÏñ  .Closure_origin0!Hðaðvl³·¨Ú5"_  *Cmi_format0ŸÀø±®µ¡`M¾{?w}@  0Compilation_unit0òöD£lˆ ]wN  *Data_types0v\ò«É3Ï,¦S€ví¿hø  )Debuginfo0_‹·Œí |Po†oÓGq  #Env0¬–áS—½  ÖïBµ™2  )Export_id0ÕCJ9DןRaý7Ý·$E  ^0“¤æVåJíŒÎëÍŸª  *Format_doc0¯æuy@½…GmWðUà  *Freshening0xWŸþ(¥"-9wõV¥öÔ  %Ident0>®Ðƒ²Ðz€V)±j¢â  ,Identifiable0ä]¡/­§*N »Ì ‡  7Internal_variable_names0TbÁg€Ñ¹•äG+L›  &Lambda0®xÏ_eódT Õ-uq  \0Ÿrn¤ð _½tûo~  ,Linkage_name0t–м†ÔˆïK¨1G«  )Load_path0Å,jÚ ¡ö" ¡–nn7Ý  (Location0–ÈnBÉŠÄOn?§ö7~Ø  )Longident0ØwP qÍ;°œ±É¡  $Misc0Ž€Bâõú¾åpg]?[q…  0Mutable_variable0ÈC«ÁQâá·§£$òÜ´‰  'Numbers0 qàÞ·Heüš‡ù³–  +Outcometree0B³u©Gê^)=¾ú 9c  )Parameter0zk^fË2mËÝy£ˆ£1Ù9  )Parsetree0v Ýo[p÷…¯îÓY Y  $Path0¸Ðk.tåb ûÃGêmá  )Primitive0õÛdU˜=úÑ\IÆ/ø}  *Projection02h‹ÂS xíj56  2Set_of_closures_id0L‰Èb£O`àÜ©&°öðM  6Set_of_closures_origin0!Y‹AÊë _’éXO¼   %Shape0• À³M„´Î``ll§  3Simple_value_approx0¼ Ãc[kð%»S\KÑ  0Static_exception0JÕm¹yrqÜ’x-¸º8Éž  &Stdlib0t0µVoS%{<‰F¡:  .Stdlib__Buffer0,å¦I÷ú[?¹Ä÷—z  .Stdlib__Digest0#z25§ÆªÂ¶I*…  .Stdlib__Domain0'Í¿‚Žo\¦0m’š¬.K  .Stdlib__Either0ÿH­D¥ë ˆ’Š?|é>  .Stdlib__Format00¿ƒFËÔñCÃlòWÇ  /Stdlib__Hashtbl0²š±§(L%èŠbØøÕÔ  -Stdlib__Int640q=Êcú‚Æ×T?üQš1Ë  ,Stdlib__Lazy0ô$¸Àøå©ä1ùmlà  .Stdlib__Lexing0^Êmñ|©•Þð·e–¯´  +Stdlib__Map0*4ɇÂ2ùÌÉ  %Subst0—’í=aëqT£/!p+  &Symbol03ÉæE´?Yßö¦7÷‘(  #Tag0‹&›Óbé… “ÊrÙ¹  .Type_immediacy00$ôÍ jÌbv\"õkö&  %Types0€"˜Í|VÈ·`ØX ù  )Unit_info0'Á¸›T•ø ¶Î§@aÂR  2Var_within_closure0Œ``Ý—ÓXFì³R–ÿâ  (Variable0?ÄÞÕæl猵ÇeY  (Warnings0¹‘¡ûÓÉÎþEëf¹{²&Š@0Ÿrn¤ð _½tûo~AÀAC@@@@@@@@°x@@@@@@@@@P@@