Skip to content

Commit b5f45ea

Browse files
authored
Move functions from Apply_cont_rewrite into EB (ocaml#353)
1 parent 2240f8e commit b5f45ea

File tree

6 files changed

+144
-132
lines changed

6 files changed

+144
-132
lines changed

middle_end/flambda/simplify/basic/apply_cont_rewrite.ml

Lines changed: 5 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@
1414
(* *)
1515
(**************************************************************************)
1616

17-
[@@@ocaml.warning "+a-4-30-40-41-42"]
18-
19-
open! Flambda
17+
[@@@ocaml.warning "+a-30-40-41-42"]
2018

2119
module EA = Continuation_extra_params_and_args.Extra_arg
2220
module KP = Kinded_parameter
@@ -92,12 +90,14 @@ let create ~original_params ~used_params ~extra_params ~extra_args
9290
extra_args;
9391
}
9492

95-
let extra_params t = t.used_extra_params
93+
let original_params t = t.original_params
94+
let used_params t = t.used_params
95+
let used_extra_params t = t.used_extra_params
9696

9797
let extra_args t id =
9898
match Id.Map.find id t.extra_args with
9999
| exception Not_found ->
100-
if List.length (extra_params t) <> 0 then begin
100+
if List.length (used_extra_params t) <> 0 then begin
101101
Misc.fatal_errorf "This [Apply_cont_rewrite] does not have any@ \
102102
extra arguments for use ID %a, but it has@ >= 1 extra parameter:@ %a"
103103
Id.print id
@@ -106,101 +106,5 @@ let extra_args t id =
106106
[]
107107
| extra_args -> extra_args
108108

109-
type rewrite_use_result =
110-
| Apply_cont of Apply_cont.t
111-
| Expr of (
112-
apply_cont_to_expr:(Apply_cont.t -> (Expr.t * Cost_metrics.t * Name_occurrences.t))
113-
-> Expr.t * Cost_metrics.t * Name_occurrences.t)
114-
115-
let no_rewrite apply_cont = Apply_cont apply_cont
116-
117-
let rewrite_use t id apply_cont : rewrite_use_result =
118-
let args = Apply_cont.args apply_cont in
119-
if List.compare_lengths args t.original_params <> 0 then begin
120-
Misc.fatal_errorf "Arguments to this [Apply_cont]@ (%a)@ do not match@ \
121-
[original_params] (%a):@ %a"
122-
Apply_cont.print apply_cont
123-
KP.List.print t.original_params
124-
Simple.List.print args
125-
end;
126-
let original_params_with_args = List.combine t.original_params args in
127-
let args =
128-
List.filter_map (fun (original_param, arg) ->
129-
if KP.Set.mem original_param t.used_params then Some arg
130-
else None)
131-
original_params_with_args
132-
in
133-
let extra_args_list = extra_args t id in
134-
let extra_args_rev, extra_lets =
135-
List.fold_left
136-
(fun (extra_args_rev, extra_lets)
137-
(arg : Continuation_extra_params_and_args.Extra_arg.t) ->
138-
match arg with
139-
| Already_in_scope simple -> simple :: extra_args_rev, extra_lets
140-
| New_let_binding (temp, prim) ->
141-
let extra_args_rev = Simple.var temp :: extra_args_rev in
142-
let extra_lets =
143-
(Var_in_binding_pos.create temp Name_mode.normal,
144-
Cost_metrics.prim prim,
145-
Named.create_prim prim Debuginfo.none)
146-
:: extra_lets
147-
in
148-
extra_args_rev, extra_lets)
149-
([], [])
150-
extra_args_list
151-
in
152-
let args = args @ List.rev extra_args_rev in
153-
let apply_cont =
154-
Apply_cont.update_args apply_cont ~args
155-
in
156-
match extra_lets with
157-
| [] -> Apply_cont apply_cont
158-
| _::_ ->
159-
let build_expr ~apply_cont_to_expr =
160-
let body, cost_metrics_of_body, free_names_of_body = apply_cont_to_expr apply_cont in
161-
Expr.bind_no_simplification ~bindings:extra_lets ~body ~cost_metrics_of_body ~free_names_of_body
162-
in
163-
Expr build_expr
164-
165-
(* CR mshinwell: tidy up.
166-
Also remove confusion between "extra args" as added by e.g. unboxing and
167-
"extra args" as in [Exn_continuation]. *)
168-
let rewrite_exn_continuation t id exn_cont =
169-
let exn_cont_arity = Exn_continuation.arity exn_cont in
170-
let original_params_arity = KP.List.arity_with_subkinds t.original_params in
171-
if not (Flambda_arity.With_subkinds.equal exn_cont_arity
172-
original_params_arity)
173-
then begin
174-
Misc.fatal_errorf "Arity of exception continuation %a does not \
175-
match@ [original_params] (%a)"
176-
Exn_continuation.print exn_cont
177-
KP.List.print t.original_params
178-
end;
179-
assert (List.length exn_cont_arity >= 1);
180-
let pre_existing_extra_params_with_args =
181-
List.combine (List.tl t.original_params)
182-
(Exn_continuation.extra_args exn_cont)
183-
in
184-
let extra_args0 =
185-
List.filter_map (fun (pre_existing_extra_param, arg) ->
186-
if KP.Set.mem pre_existing_extra_param t.used_params then Some arg
187-
else None)
188-
pre_existing_extra_params_with_args
189-
in
190-
let extra_args1 =
191-
let extra_args_list = extra_args t id in
192-
assert (List.compare_lengths t.used_extra_params extra_args_list = 0);
193-
List.map2
194-
(fun param (arg : Continuation_extra_params_and_args.Extra_arg.t) ->
195-
match arg with
196-
| Already_in_scope simple -> simple, KP.kind param
197-
| New_let_binding _ ->
198-
Misc.fatal_error "[New_let_binding] not expected here")
199-
t.used_extra_params extra_args_list
200-
in
201-
let extra_args = extra_args0 @ extra_args1 in
202-
Exn_continuation.create ~exn_handler:(Exn_continuation.exn_handler exn_cont)
203-
~extra_args
204-
205109
let original_params_arity t =
206110
KP.List.arity_with_subkinds t.original_params

middle_end/flambda/simplify/basic/apply_cont_rewrite.mli

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@
1616

1717
(** Rewrites applied to [Apply_cont] expressions in order to reflect
1818
changes in continuation arities consequential to addition or removal of
19-
parameters. *)
19+
parameters.
20+
The rewrites are actually applied via [Expr_builder]. *)
2021

21-
[@@@ocaml.warning "+a-4-30-40-41-42"]
22-
23-
open! Flambda
22+
[@@@ocaml.warning "+a-30-40-41-42"]
2423

2524
type t
2625

@@ -35,32 +34,16 @@ val create
3534
-> used_extra_params:Kinded_parameter.Set.t
3635
-> t
3736

38-
val extra_params : t -> Kinded_parameter.t list
39-
40-
val extra_args
41-
: t
42-
-> Apply_cont_rewrite_id.t
43-
-> Continuation_extra_params_and_args.Extra_arg.t list
37+
val original_params : t -> Kinded_parameter.t list
4438

45-
type rewrite_use_result = private
46-
| Apply_cont of Apply_cont.t
47-
| Expr of (
48-
apply_cont_to_expr:(Apply_cont.t -> (Expr.t * Cost_metrics.t * Name_occurrences.t))
49-
-> Expr.t * Cost_metrics.t * Name_occurrences.t)
39+
val used_params : t -> Kinded_parameter.Set.t
5040

51-
val no_rewrite : Apply_cont.t -> rewrite_use_result
41+
val used_extra_params : t -> Kinded_parameter.t list
5242

53-
val rewrite_use
54-
: t
55-
-> Apply_cont_rewrite_id.t
56-
-> Apply_cont.t
57-
-> rewrite_use_result
58-
59-
val rewrite_exn_continuation
43+
val extra_args
6044
: t
6145
-> Apply_cont_rewrite_id.t
62-
-> Exn_continuation.t
63-
-> Exn_continuation.t
46+
-> Continuation_extra_params_and_args.Extra_arg.t list
6447

6548
val original_params_arity : t -> Flambda_arity.With_subkinds.t
6649

middle_end/flambda/simplify/expr_builder.ml

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,111 @@ let create_switch uacc ~scrutinee ~arms =
539539
Expr.create_switch switch,
540540
UA.cost_metrics_add ~added:(Cost_metrics.switch switch) uacc
541541

542+
type rewrite_use_result =
543+
| Apply_cont of Apply_cont.t
544+
| Expr of (
545+
apply_cont_to_expr:(Apply_cont.t
546+
-> (Expr.t * Cost_metrics.t * Name_occurrences.t))
547+
-> Expr.t * Cost_metrics.t * Name_occurrences.t)
548+
549+
let no_rewrite apply_cont = Apply_cont apply_cont
550+
551+
let rewrite_use rewrite id apply_cont : rewrite_use_result =
552+
let args = Apply_cont.args apply_cont in
553+
let original_params = Apply_cont_rewrite.original_params rewrite in
554+
if List.compare_lengths args original_params <> 0 then begin
555+
Misc.fatal_errorf "Arguments to this [Apply_cont]@ (%a)@ do not match@ \
556+
[original_params] (%a):@ %a"
557+
Apply_cont.print apply_cont
558+
KP.List.print original_params
559+
Simple.List.print args
560+
end;
561+
let original_params_with_args = List.combine original_params args in
562+
let args =
563+
let used_params = Apply_cont_rewrite.used_params rewrite in
564+
List.filter_map (fun (original_param, arg) ->
565+
if KP.Set.mem original_param used_params then Some arg
566+
else None)
567+
original_params_with_args
568+
in
569+
let extra_args_list = Apply_cont_rewrite.extra_args rewrite id in
570+
let extra_args_rev, extra_lets =
571+
List.fold_left
572+
(fun (extra_args_rev, extra_lets)
573+
(arg : Continuation_extra_params_and_args.Extra_arg.t) ->
574+
match arg with
575+
| Already_in_scope simple -> simple :: extra_args_rev, extra_lets
576+
| New_let_binding (temp, prim) ->
577+
let extra_args_rev = Simple.var temp :: extra_args_rev in
578+
let extra_lets =
579+
(Var_in_binding_pos.create temp Name_mode.normal,
580+
Cost_metrics.prim prim,
581+
Named.create_prim prim Debuginfo.none)
582+
:: extra_lets
583+
in
584+
extra_args_rev, extra_lets)
585+
([], [])
586+
extra_args_list
587+
in
588+
let args = args @ List.rev extra_args_rev in
589+
let apply_cont =
590+
Apply_cont.update_args apply_cont ~args
591+
in
592+
match extra_lets with
593+
| [] -> Apply_cont apply_cont
594+
| _::_ ->
595+
let build_expr ~apply_cont_to_expr =
596+
let body, cost_metrics_of_body, free_names_of_body =
597+
apply_cont_to_expr apply_cont
598+
in
599+
Expr.bind_no_simplification ~bindings:extra_lets ~body
600+
~cost_metrics_of_body ~free_names_of_body
601+
in
602+
Expr build_expr
603+
604+
(* CR mshinwell: tidy up.
605+
Also remove confusion between "extra args" as added by e.g. unboxing and
606+
"extra args" as in [Exn_continuation]. *)
607+
let rewrite_exn_continuation rewrite id exn_cont =
608+
let exn_cont_arity = Exn_continuation.arity exn_cont in
609+
let original_params = Apply_cont_rewrite.original_params rewrite in
610+
let original_params_arity = KP.List.arity_with_subkinds original_params in
611+
if not (Flambda_arity.With_subkinds.equal exn_cont_arity
612+
original_params_arity)
613+
then begin
614+
Misc.fatal_errorf "Arity of exception continuation %a does not \
615+
match@ [original_params] (%a)"
616+
Exn_continuation.print exn_cont
617+
KP.List.print original_params
618+
end;
619+
assert (List.length exn_cont_arity >= 1);
620+
let pre_existing_extra_params_with_args =
621+
List.combine (List.tl original_params)
622+
(Exn_continuation.extra_args exn_cont)
623+
in
624+
let extra_args0 =
625+
let used_params = Apply_cont_rewrite.used_params rewrite in
626+
List.filter_map (fun (pre_existing_extra_param, arg) ->
627+
if KP.Set.mem pre_existing_extra_param used_params then Some arg
628+
else None)
629+
pre_existing_extra_params_with_args
630+
in
631+
let extra_args1 =
632+
let extra_args_list = Apply_cont_rewrite.extra_args rewrite id in
633+
let used_extra_params = Apply_cont_rewrite.used_extra_params rewrite in
634+
assert (List.compare_lengths used_extra_params extra_args_list = 0);
635+
List.map2
636+
(fun param (arg : Continuation_extra_params_and_args.Extra_arg.t) ->
637+
match arg with
638+
| Already_in_scope simple -> simple, KP.kind param
639+
| New_let_binding _ ->
640+
Misc.fatal_error "[New_let_binding] not expected here")
641+
used_extra_params extra_args_list
642+
in
643+
let extra_args = extra_args0 @ extra_args1 in
644+
Exn_continuation.create ~exn_handler:(Exn_continuation.exn_handler exn_cont)
645+
~extra_args
646+
542647
type add_wrapper_for_fixed_arity_continuation0_result =
543648
| This_continuation of Continuation.t
544649
| Apply_cont of Apply_cont.t
@@ -597,7 +702,7 @@ let add_wrapper_for_fixed_arity_continuation0 uacc cont_or_apply_cont
597702
that binds [kinded_params]. *)
598703
let args = List.map KP.simple kinded_params in
599704
let apply_cont = Apply_cont.create cont ~args ~dbg:Debuginfo.none in
600-
begin match Apply_cont_rewrite.rewrite_use rewrite use_id apply_cont with
705+
begin match rewrite_use rewrite use_id apply_cont with
601706
| Apply_cont apply_cont ->
602707
new_wrapper (Expr.create_apply_cont apply_cont)
603708
~free_names:(Known (Apply_cont.free_names apply_cont))
@@ -613,7 +718,7 @@ let add_wrapper_for_fixed_arity_continuation0 uacc cont_or_apply_cont
613718
end
614719
| Apply_cont apply_cont ->
615720
let apply_cont = Apply_cont.update_continuation apply_cont cont in
616-
match Apply_cont_rewrite.rewrite_use rewrite use_id apply_cont with
721+
match rewrite_use rewrite use_id apply_cont with
617722
| Apply_cont apply_cont -> Apply_cont apply_cont
618723
| Expr build_expr ->
619724
let expr, cost_metrics, free_names =

middle_end/flambda/simplify/expr_builder.mli

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,24 @@ val add_wrapper_for_fixed_arity_apply
9393
-> Flambda_arity.With_subkinds.t
9494
-> Apply_expr.t
9595
-> Expr.t * Upwards_acc.t
96+
97+
type rewrite_use_result = private
98+
| Apply_cont of Apply_cont.t
99+
| Expr of (
100+
apply_cont_to_expr:(Apply_cont.t
101+
-> (Expr.t * Cost_metrics.t * Name_occurrences.t))
102+
-> Expr.t * Cost_metrics.t * Name_occurrences.t)
103+
104+
val no_rewrite : Apply_cont.t -> rewrite_use_result
105+
106+
val rewrite_use
107+
: Apply_cont_rewrite.t
108+
-> Apply_cont_rewrite_id.t
109+
-> Apply_cont.t
110+
-> rewrite_use_result
111+
112+
val rewrite_exn_continuation
113+
: Apply_cont_rewrite.t
114+
-> Apply_cont_rewrite_id.t
115+
-> Exn_continuation.t
116+
-> Exn_continuation.t

middle_end/flambda/simplify/simplify_apply_cont_expr.ml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,8 @@ let rebuild_apply_cont apply_cont ~args ~rewrite_id uacc ~after_rebuild =
8282
else AC.clear_trap_action apply_cont
8383
in
8484
match rewrite with
85-
| None -> Apply_cont_rewrite.no_rewrite apply_cont
86-
| Some rewrite ->
87-
Apply_cont_rewrite.rewrite_use rewrite rewrite_id apply_cont
85+
| None -> EB.no_rewrite apply_cont
86+
| Some rewrite -> EB.rewrite_use rewrite rewrite_id apply_cont
8887
in
8988
match rewrite_use_result with
9089
| Apply_cont apply_cont ->

middle_end/flambda/simplify/simplify_common.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ let update_exn_continuation_extra_args uacc ~exn_cont_use_id apply =
7070
| None -> apply
7171
| Some rewrite ->
7272
Apply.with_exn_continuation apply
73-
(Apply_cont_rewrite.rewrite_exn_continuation rewrite exn_cont_use_id
73+
(EB.rewrite_exn_continuation rewrite exn_cont_use_id
7474
(Apply.exn_continuation apply))
7575

7676
(* generate the projection of the i-th field of a n-tuple *)

0 commit comments

Comments
 (0)