ocaml/middle_end/inlining_cost.mli

142 lines
4.7 KiB
OCaml

(**************************************************************************)
(* *)
(* OCaml *)
(* *)
(* Pierre Chambart, OCamlPro *)
(* Mark Shinwell and Leo White, Jane Street Europe *)
(* *)
(* Copyright 2013--2016 OCamlPro SAS *)
(* Copyright 2014--2016 Jane Street Group LLC *)
(* *)
(* All rights reserved. This file is distributed under the terms of *)
(* the GNU Lesser General Public License version 2.1, with the *)
(* special exception on linking described in the file LICENSE. *)
(* *)
(**************************************************************************)
[@@@ocaml.warning "+a-4-9-30-40-41-42"]
(** Measurement of the cost (including cost in space) of Flambda terms
in the context of inlining. *)
module Threshold : sig
(** The maximum size, in some abstract measure of space cost, that an
Flambda expression may be in order to be inlined. *)
type t =
| Never_inline
| Can_inline_if_no_larger_than of int
val add : t -> t -> t
val sub : t -> t -> t
val min : t -> t -> t
end
(* Determine whether the given Flambda expression has a sufficiently low space
cost so as to fit under the given [inlining_threshold]. The [bonus] is
added to the threshold before evaluation. *)
val can_inline
: Flambda.t
-> Threshold.t
-> bonus:int
-> bool
(* CR-soon mshinwell for pchambart: I think the name of this function might be
misleading. It should probably reflect the functionality it provides,
not the use to which it is put in another module. *)
(* As for [can_inline], but returns the decision as an inlining threshold.
If [Never_inline] is returned, the expression was too large for the
input [inlining_threshold]. Otherwise, [Can_inline_if_no_larger_than] is
returned, with the constructor argument being the measured estimated size
of the expression. *)
val can_try_inlining
: Flambda.t
-> Threshold.t
-> number_of_arguments:int
-> size_from_approximation:int option
-> Threshold.t
module Benefit : sig
(* A model of the benefit we gain by removing a particular combination
of operations. Such removals are typically performed by inlining (for
example, [remove_call]) and simplification (for example, [remove_alloc])
passes. *)
type t
val zero : t
val (+) : t -> t -> t
val max : round:int -> t -> t -> t
val remove_call : t -> t
(* CR-soon mshinwell: [remove_alloc] should take the size of the block
(to account for removal of initializing writes). *)
val remove_alloc : t -> t
val remove_prim : t -> t
val remove_prims : t -> int -> t
val remove_branch : t -> t
val direct_call_of_indirect : t -> t
val requested_inline : t -> size_of:Flambda.t -> t
val remove_code : Flambda.t -> t -> t
val remove_code_named : Flambda.named -> t -> t
val remove_projection : Projection.t -> t -> t
val add_code : Flambda.t -> t -> t
val add_code_named : Flambda.named -> t -> t
val add_projection : Projection.t -> t -> t
val print : Format.formatter -> t -> unit
end
module Whether_sufficient_benefit : sig
(* Evaluation of the benefit of removing certain operations against an
inlining threshold. *)
type t
val create
: original:Flambda.t
-> toplevel:bool
-> branch_depth:int
-> Flambda.t
-> benefit:Benefit.t
-> lifting:bool
-> round:int
-> t
val create_estimate
: original_size:int
-> toplevel:bool
-> branch_depth: int
-> new_size:int
-> benefit:Benefit.t
-> lifting:bool
-> round:int
-> t
val evaluate : t -> bool
val to_string : t -> string
val print_description : subfunctions:bool -> Format.formatter -> t -> unit
end
val scale_inline_threshold_by : int
val default_toplevel_multiplier : int
val direct_call_size : int
(** If a function body exceeds this size, we can make a fast decision not
to inline it (see [Inlining_decision]). *)
val maximum_interesting_size_of_function_body : int -> int
(** Measure the given expression to determine whether its size is at or
below the given threshold. [None] is returned if it is too big; otherwise
[Some] is returned with the measured size. *)
val lambda_smaller' : Flambda.expr -> than:int -> int option
val lambda_size : Flambda.expr -> int