package ocaml-base-compiler
Official release 4.09.0
Install
Dune Dependency
Authors
Maintainers
Sources
4.09.0.tar.gz
sha256=a7bc044167e7d09f8e3ea84b88ec9d81392908ecdac861d3d5015e5f0fc496a3
md5=76ac39570fc88b16fda2a94db7cd5cf3
doc/ocamloptcomp/Unbox_specialised_args/index.html
Module Unbox_specialised_args
When approximations of specialised arguments indicate that they are closures or blocks, add more specialised arguments corresponding to the projections from such blocks (with definitions of such projections lifted out), such that the original specialised arguments may later be eliminated.
This in particular enables elimination of closure allocations in examples such as:
let rec map f = function | -> | a::l -> let r = f a in r :: map f l
let g x = map (fun y -> x + y) 1; 2; 3; 4
Here, the specialised version of map
initially has a specialised argument f
; and upon inlining there will be a projection of x
from the closure of f
. This pass adds a new specialised argument to carry that projection, at which point the closure of f
is redundant.
val rewrite_set_of_closures :
env:Inline_and_simplify_aux.Env.t ->
duplicate_function:
(env:Inline_and_simplify_aux.Env.t ->
set_of_closures:Flambda.set_of_closures ->
fun_var:Variable.t ->
new_fun_var:Variable.t ->
Flambda.function_declaration * Flambda.specialised_to Variable.Map.t) ->
set_of_closures:Flambda.set_of_closures ->
(Flambda.expr * Inlining_cost.Benefit.t) option
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>