@@ -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