@@ -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,7 @@ 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 ~keep_flow_data ~deadcode_sentinal ~shapes ~lambda_lift_all profile
734732 +> map_fst5
735733 (match Config. target () , Config. effects () with
736734 | `JavaScript , `Disabled -> Generate_closure. f
@@ -750,15 +748,15 @@ let optimize ~shapes ~profile ~keep_flow_data p =
750748
751749let optimize_for_wasm ~shapes ~profile p =
752750 let optimized_code, global_flow_data =
753- optimize ~shapes ~profile ~keep_flow_data: true p
751+ optimize ~shapes ~profile ~keep_flow_data: true ~lambda_lift_all: false p
754752 in
755753 ( optimized_code
756754 , match global_flow_data with
757755 | Some data -> data
758756 | None -> Global_flow. f ~fast: false optimized_code.program )
759757
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
758+ let full ~standalone ~wrap_with_fun ~shapes ~profile ~link ~source_map ~formatter ~ lambda_lift_all p =
759+ let optimized_code, _ = optimize ~shapes ~profile ~keep_flow_data: false ~lambda_lift_all p in
762760 let exported_runtime = not standalone in
763761 let emit formatter =
764762 generate ~exported_runtime ~wrap_with_fun ~warn_on_unhandled_effect: standalone
@@ -778,9 +776,9 @@ let full ~standalone ~wrap_with_fun ~shapes ~profile ~link ~source_map ~formatte
778776 shapes_v;
779777 emit formatter optimized_code, shapes_v
780778
781- let full_no_source_map ~formatter ~shapes ~standalone ~wrap_with_fun ~profile ~link p =
779+ let full_no_source_map ~formatter ~shapes ~standalone ~wrap_with_fun ~profile ~link ~ lambda_lift_all p =
782780 let (_ : Source_map.info * _ ) =
783- full ~shapes ~standalone ~wrap_with_fun ~profile ~link ~source_map: false ~formatter p
781+ full ~shapes ~standalone ~wrap_with_fun ~profile ~link ~source_map: false ~formatter ~lambda_lift_all p
784782 in
785783 ()
786784
@@ -792,17 +790,19 @@ let f
792790 ~link
793791 ~source_map
794792 ~formatter
793+ ~lambda_lift_all
795794 p =
796- full ~standalone ~wrap_with_fun ~shapes ~profile ~link ~source_map ~formatter p
795+ full ~standalone ~wrap_with_fun ~shapes ~profile ~link ~source_map ~formatter ~lambda_lift_all p
797796
798797let f'
799798 ?(standalone = true )
800799 ?(wrap_with_fun = `Iife )
801800 ?(profile = Profile. O1 )
801+ ?(lambda_lift_all = false )
802802 ~link
803803 formatter
804804 p =
805- full_no_source_map ~formatter ~shapes: false ~standalone ~wrap_with_fun ~profile ~link p
805+ full_no_source_map ~formatter ~shapes: false ~standalone ~wrap_with_fun ~profile ~link ~lambda_lift_all p
806806
807807let from_string ~prims ~debug s formatter =
808808 let p = Parse_bytecode. from_string ~prims ~debug s in
@@ -813,4 +813,5 @@ let from_string ~prims ~debug s formatter =
813813 ~wrap_with_fun: `Anonymous
814814 ~profile: O1
815815 ~link: `No
816+ ~lambda_lift_all: false
816817 p
0 commit comments