@@ -142,10 +142,21 @@ let collects_shapes ~shapes (p : Code.program) =
142
142
map)
143
143
else StringMap. empty
144
144
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
+
145
155
let effects_and_exact_calls
146
156
~keep_flow_data
147
157
~deadcode_sentinal
148
158
~shapes
159
+ ~lambda_lift_all
149
160
(profile : Profile.t )
150
161
p =
151
162
let fast =
@@ -166,11 +177,8 @@ let effects_and_exact_calls
166
177
else Deadcode. f pure_fun p
167
178
in
168
179
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 ->
174
182
let to_lift = all_functions p in
175
183
let p, _ = Lambda_lifting_simple. f ~to_lift p in
176
184
p
@@ -707,17 +715,7 @@ let link_and_pack ?(standalone = true) ?(wrap_with_fun = `Iife) ?(link = `No) p
707
715
|> pack ~wrap_with_fun ~standalone
708
716
|> check_js
709
717
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 =
721
719
let deadcode_sentinal =
722
720
(* If deadcode is disabled, this field is just fresh variable *)
723
721
Code.Var. fresh_n " dummy"
@@ -730,7 +728,7 @@ let optimize ~shapes ~profile ~keep_flow_data p =
730
728
| O2 -> o2
731
729
| O3 -> o3)
732
730
+> 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
734
732
+> map_fst5
735
733
(match Config. target () , Config. effects () with
736
734
| `JavaScript , `Disabled -> Generate_closure. f
@@ -750,15 +748,15 @@ let optimize ~shapes ~profile ~keep_flow_data p =
750
748
751
749
let optimize_for_wasm ~shapes ~profile p =
752
750
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
754
752
in
755
753
( optimized_code
756
754
, match global_flow_data with
757
755
| Some data -> data
758
756
| None -> Global_flow. f ~fast: false optimized_code.program )
759
757
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
762
760
let exported_runtime = not standalone in
763
761
let emit formatter =
764
762
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
778
776
shapes_v;
779
777
emit formatter optimized_code, shapes_v
780
778
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 =
782
780
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
784
782
in
785
783
()
786
784
@@ -792,17 +790,19 @@ let f
792
790
~link
793
791
~source_map
794
792
~formatter
793
+ ~lambda_lift_all
795
794
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
797
796
798
797
let f'
799
798
?(standalone = true )
800
799
?(wrap_with_fun = `Iife )
801
800
?(profile = Profile. O1 )
801
+ ?(lambda_lift_all = false )
802
802
~link
803
803
formatter
804
804
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
806
806
807
807
let from_string ~prims ~debug s formatter =
808
808
let p = Parse_bytecode. from_string ~prims ~debug s in
@@ -813,4 +813,5 @@ let from_string ~prims ~debug s formatter =
813
813
~wrap_with_fun: `Anonymous
814
814
~profile: O1
815
815
~link: `No
816
+ ~lambda_lift_all: false
816
817
p
0 commit comments