Module Flambda2_simplify.Expr_builder
Functions for rebuilding expressions that are used during simplification. Unlike the basic creation functions in Expr these functions do things such as keeping track of free names and avoiding generation of unused bindings. They also elide construction of the terms themselves if required, e.g. during speculative inlining.
Some expressions are rebuilt directly using the functions in Rebuilt_expr rather than using this module.
val create_let_binding :
Flambda2_simplify.Upwards_acc.t ->
Flambda2_bound_identifiers.Bound_pattern.t ->
Flambda2_terms.Flambda.Import.Named.t ->
free_names_of_defining_expr:Flambda2_nominal.Name_occurrences.t ->
body:Flambda2_simplify.Rebuilt_expr.t ->
cost_metrics_of_defining_expr:Flambda2_terms.Cost_metrics.t ->
Flambda2_simplify.Rebuilt_expr.t * Flambda2_simplify.Upwards_acc.ttype binding_to_place = | Keep_binding of {let_bound : Flambda2_bound_identifiers.Bound_pattern.t;simplified_defining_expr : Flambda2_simplify.Simplified_named.t;original_defining_expr : Flambda2_terms.Flambda.Import.Named.t option;
}| Delete_binding of {original_defining_expr : Flambda2_terms.Flambda.Import.Named.t option;
}
val make_new_let_bindings :
Flambda2_simplify.Upwards_acc.t ->
bindings_outermost_first:Flambda2_simplify.Expr_builder.binding_to_place list ->
body:Flambda2_simplify.Rebuilt_expr.t ->
Flambda2_simplify.Rebuilt_expr.t * Flambda2_simplify.Upwards_acc.tCreate Let binding(s) around a given body. (The type of this function prevents it from being used to create "let symbol" bindings; use the other functions in this module instead.) Bindings will be elided if they are unused.
The name_occurrences in the provided uacc must contain exactly the free names of the body.
val create_let_symbols :
Flambda2_simplify.Upwards_acc.t ->
Flambda2_simplify.Lifted_constant.t ->
body:Flambda2_simplify.Rebuilt_expr.t ->
Flambda2_simplify.Rebuilt_expr.t * Flambda2_simplify.Upwards_acc.tCreate the "let symbol" binding(s) around a given body necessary to define the given lifted constant.
Value slots are removed if they are not used according to the given uacc. (Such uacc must have seen all uses in the whole compilation unit.)
The name_occurrences in the provided uacc must contain exactly the free names of the body.
val place_lifted_constants :
Flambda2_simplify.Upwards_acc.t ->
lifted_constants_from_defining_expr:Flambda2_simplify.Lifted_constant_state.t ->
lifted_constants_from_body:Flambda2_simplify.Lifted_constant_state.t ->
put_bindings_around_body:
(Flambda2_simplify.Upwards_acc.t ->
body:Flambda2_simplify.Rebuilt_expr.t ->
Flambda2_simplify.Rebuilt_expr.t * Flambda2_simplify.Upwards_acc.t) ->
body:Flambda2_simplify.Rebuilt_expr.t ->
Flambda2_simplify.Rebuilt_expr.t * Flambda2_simplify.Upwards_acc.tPlace lifted constants arising from a let-expr (coming from both the defining_expr and the body).
val create_switch :
Flambda2_simplify.Upwards_acc.t ->
condition_dbg:Debuginfo.t ->
scrutinee:Flambda2_term_basics.Simple.t ->
arms:
Flambda2_terms.Flambda.Import.Apply_cont.t
Flambda2_numbers.Target_ocaml_int.Map.t ->
Flambda2_simplify.Rebuilt_expr.t * Flambda2_simplify.Upwards_acc.tCreate a Switch expression, save that zero-arm switches are converted to Invalid, and one-arm switches to Apply_cont.
type new_let_cont = {cont : Flambda2_identifiers.Continuation.t;handler : Flambda2_simplify.Rebuilt_expr.Continuation_handler.t;free_names_of_handler : Flambda2_nominal.Name_occurrences.t;cost_metrics_of_handler : Flambda2_terms.Cost_metrics.t;
}val bind_let_conts :
Flambda2_simplify.Upwards_acc.t ->
body:Flambda2_simplify.Rebuilt_expr.t ->
Flambda2_simplify.Expr_builder.new_let_cont list ->
Flambda2_simplify.Upwards_acc.t * Flambda2_simplify.Rebuilt_expr.tval rebuild_invalid :
Flambda2_simplify.Upwards_acc.t ->
Flambda2_terms.Flambda.Invalid.t ->
after_rebuild:
(Flambda2_simplify.Rebuilt_expr.t ->
Flambda2_simplify.Upwards_acc.t ->
Flambda2_simplify.Rebuilt_expr.t * Flambda2_simplify.Upwards_acc.t) ->
Flambda2_simplify.Rebuilt_expr.t * Flambda2_simplify.Upwards_acc.tHandling of the rewriting of continuation use sites.
type rewrite_apply_cont_result = private | Invalid of {}| Apply_cont of Flambda2_terms.Flambda.Import.Apply_cont.t| Expr of apply_cont_to_expr: (Flambda2_terms.Flambda.Import.Apply_cont.t -> Flambda2_simplify.Rebuilt_expr.t * Flambda2_terms.Cost_metrics.t * Flambda2_nominal.Name_occurrences.t) -> Flambda2_simplify.Rebuilt_expr.t * Flambda2_terms.Cost_metrics.t * Flambda2_nominal.Name_occurrences.t
type rewrite_switch_arm_result = private | Invalid of {}| Apply_cont of Flambda2_terms.Flambda.Import.Apply_cont.t| New_wrapper of Flambda2_simplify.Expr_builder.new_let_cont
val no_rewrite_apply_cont :
Flambda2_simplify.Upwards_env.t ->
Flambda2_terms.Flambda.Import.Apply_cont.t ->
Flambda2_simplify.Expr_builder.rewrite_apply_cont_resultval rewrite_switch_arm :
Flambda2_simplify.Upwards_acc.t ->
Flambda2_terms.Flambda.Import.Apply_cont.t ->
use_id:Flambda2_identifiers.Apply_cont_rewrite_id.t ->
[ `Unarized ] Flambda2_kinds.Flambda_arity.t ->
Flambda2_simplify.Expr_builder.rewrite_switch_arm_resultval rewrite_fixed_arity_apply :
Flambda2_simplify.Upwards_acc.t ->
use_id:Flambda2_identifiers.Apply_cont_rewrite_id.t option ->
[ `Unarized ] Flambda2_kinds.Flambda_arity.t ->
Flambda2_terms.Flambda.Import.Apply.t ->
Flambda2_simplify.Upwards_acc.t * Flambda2_simplify.Rebuilt_expr.tval rewrite_exn_continuation :
Flambda2_simplify.Apply_cont_rewrite.t ->
Flambda2_identifiers.Apply_cont_rewrite_id.t ->
Flambda2_terms.Exn_continuation.t ->
Flambda2_terms.Exn_continuation.t