@@ -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+
542647type 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 =
0 commit comments