@@ -142,10 +142,21 @@ let collects_shapes ~shapes (p : Code.program) =
142142    map)
143143  else  StringMap. empty
144144
145+ let  all_functions  p  = 
146+   let  open  Code  in 
147+   fold_closures
148+     p
149+     (fun  name  _  _  _  acc  ->
150+       match  name with 
151+       |  Some  name  -> Var.Set. add name acc
152+       |  None  -> acc)
153+     Var.Set. empty
154+ 
145155let  effects_and_exact_calls 
146156    ~keep_flow_data  
147157    ~deadcode_sentinal  
148158    ~shapes  
159+     ~lambda_lift_all  
149160    (profile  : Profile.t )
150161    p  = 
151162  let  fast = 
@@ -166,11 +177,8 @@ let effects_and_exact_calls
166177    else  Deadcode. f pure_fun p
167178  in 
168179  let  p = 
169-     match  Config. (target () , effects () ) with 
170-     |  `JavaScript , `Disabled  ->
171-         (*  If effects are disabled, we lambda-lift aggressively. While not
172-            necessary, it results in a substantial gain in performance in some 
173-            programs in Javascript. *)  
180+     match  lambda_lift_all, Config. target () , Config. effects ()  with 
181+     |  true , `JavaScript , `Disabled  ->
174182        let  to_lift =  all_functions p in 
175183        let  p, _ =  Lambda_lifting_simple. f ~to_lift  p in 
176184        p
@@ -707,17 +715,7 @@ let link_and_pack ?(standalone = true) ?(wrap_with_fun = `Iife) ?(link = `No) p
707715  |>  pack ~wrap_with_fun  ~standalone 
708716  |>  check_js
709717
710- let  all_functions  p  = 
711-   let  open  Code  in 
712-   fold_closures
713-     p
714-     (fun  name  _  _  _  acc  ->
715-       match  name with 
716-       |  Some  name  -> Var.Set. add name acc
717-       |  None  -> acc)
718-     Var.Set. empty
719- 
720- let  optimize  ~shapes   ~profile   ~keep_flow_data   p  = 
718+ let  optimize  ~shapes   ~profile   ~keep_flow_data   ~lambda_lift_all   p  = 
721719  let  deadcode_sentinal = 
722720    (*  If deadcode is disabled, this field is just fresh variable *) 
723721    Code.Var. fresh_n " dummy" 
@@ -730,7 +728,12 @@ let optimize ~shapes ~profile ~keep_flow_data p =
730728       |  O2  -> o2
731729       |  O3  -> o3)
732730    +>  specialize_js_once_after
733-     +>  effects_and_exact_calls ~keep_flow_data  ~deadcode_sentinal  ~shapes  profile
731+     +>  effects_and_exact_calls
732+          ~keep_flow_data 
733+          ~deadcode_sentinal 
734+          ~shapes 
735+          ~lambda_lift_all 
736+          profile
734737    +>  map_fst5
735738         (match  Config. target () , Config. effects ()  with 
736739         |  `JavaScript , `Disabled  -> Generate_closure. f
@@ -750,15 +753,26 @@ let optimize ~shapes ~profile ~keep_flow_data p =
750753
751754let  optimize_for_wasm  ~shapes   ~profile   p  = 
752755  let  optimized_code, global_flow_data = 
753-     optimize ~shapes  ~profile  ~keep_flow_data: true  p
756+     optimize ~shapes  ~profile  ~keep_flow_data: true  ~lambda_lift_all: false   p
754757  in 
755758  ( optimized_code
756759  , match  global_flow_data with 
757760    |  Some  data  -> data
758761    |  None  -> Global_flow. f ~fast: false  optimized_code.program )
759762
760- let  full  ~standalone   ~wrap_with_fun   ~shapes   ~profile   ~link   ~source_map   ~formatter   p  = 
761-   let  optimized_code, _ =  optimize ~shapes  ~profile  ~keep_flow_data: false  p in 
763+ let  full 
764+     ~standalone  
765+     ~wrap_with_fun  
766+     ~shapes  
767+     ~profile  
768+     ~link  
769+     ~source_map  
770+     ~formatter  
771+     ~lambda_lift_all  
772+     p  = 
773+   let  optimized_code, _ = 
774+     optimize ~shapes  ~profile  ~keep_flow_data: false  ~lambda_lift_all  p
775+   in 
762776  let  exported_runtime =  not  standalone in 
763777  let  emit  formatter  = 
764778    generate ~exported_runtime  ~wrap_with_fun  ~warn_on_unhandled_effect: standalone
@@ -778,9 +792,26 @@ let full ~standalone ~wrap_with_fun ~shapes ~profile ~link ~source_map ~formatte
778792    shapes_v;
779793  emit formatter optimized_code, shapes_v
780794
781- let  full_no_source_map  ~formatter   ~shapes   ~standalone   ~wrap_with_fun   ~profile   ~link   p  = 
795+ let  full_no_source_map 
796+     ~formatter  
797+     ~shapes  
798+     ~standalone  
799+     ~wrap_with_fun  
800+     ~profile  
801+     ~link  
802+     ~lambda_lift_all  
803+     p  = 
782804  let  (_ : Source_map.info * _ ) = 
783-     full ~shapes  ~standalone  ~wrap_with_fun  ~profile  ~link  ~source_map: false  ~formatter  p
805+     full
806+       ~shapes 
807+       ~standalone 
808+       ~wrap_with_fun 
809+       ~profile 
810+       ~link 
811+       ~source_map: false 
812+       ~formatter 
813+       ~lambda_lift_all 
814+       p
784815  in 
785816  () 
786817
@@ -792,17 +823,36 @@ let f
792823    ~link  
793824    ~source_map  
794825    ~formatter  
826+     ~lambda_lift_all  
795827    p  = 
796-   full ~standalone  ~wrap_with_fun  ~shapes  ~profile  ~link  ~source_map  ~formatter  p
828+   full
829+     ~standalone 
830+     ~wrap_with_fun 
831+     ~shapes 
832+     ~profile 
833+     ~link 
834+     ~source_map 
835+     ~formatter 
836+     ~lambda_lift_all 
837+     p
797838
798839let  f' 
799840    ?(standalone  = true ) 
800841    ?(wrap_with_fun  = `Iife ) 
801842    ?(profile  = Profile. O1 ) 
843+     ?(lambda_lift_all  = false ) 
802844    ~link  
803845    formatter 
804846    p  = 
805-   full_no_source_map ~formatter  ~shapes: false  ~standalone  ~wrap_with_fun  ~profile  ~link  p
847+   full_no_source_map
848+     ~formatter 
849+     ~shapes: false 
850+     ~standalone 
851+     ~wrap_with_fun 
852+     ~profile 
853+     ~link 
854+     ~lambda_lift_all 
855+     p
806856
807857let  from_string  ~prims   ~debug   s  formatter  = 
808858  let  p =  Parse_bytecode. from_string ~prims  ~debug  s in 
@@ -813,4 +863,5 @@ let from_string ~prims ~debug s formatter =
813863    ~wrap_with_fun: `Anonymous 
814864    ~profile: O1 
815865    ~link: `No 
866+     ~lambda_lift_all: false 
816867    p
0 commit comments