Skip to content

Commit 8d02e85

Browse files
authored
Refactor unboxing decision code (#394)
1 parent 4fe741d commit 8d02e85

39 files changed

+2370
-1173
lines changed

.depend

Lines changed: 181 additions & 30 deletions
Large diffs are not rendered by default.

.github/workflows/test-list

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
tests/extension-constructor
2727
tests/flambda
2828
tests/flambda-specialization
29+
tests/flambda-unboxing
2930
# tests/float-unboxing FAIL (FIXME) 'float_subst_boxed_number.ml' see flambdatest/mlexamples/float_unboxing.ml for a simplified error example
3031
tests/fma
3132
tests/formats-transition

compilerlibs/Makefile.compilerlibs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,12 @@ MIDDLE_END_FLAMBDA_SIMPLIFY=\
330330
middle_end/flambda/simplify/simplify_simple.cmo \
331331
middle_end/flambda/simplify/simplify_import.cmo \
332332
middle_end/flambda/simplify/basic/simplify_named_result.cmo \
333+
middle_end/flambda/unboxing/unboxing_types.cmo \
334+
middle_end/flambda/unboxing/unboxers.cmo \
335+
middle_end/flambda/unboxing/build_unboxing_denv.cmo \
336+
middle_end/flambda/unboxing/is_unboxing_beneficial.cmo \
337+
middle_end/flambda/unboxing/optimistic_unboxing_decision.cmo \
338+
middle_end/flambda/unboxing/unboxing_epa.cmo \
333339
middle_end/flambda/unboxing/unbox_continuation_params.cmo \
334340
middle_end/flambda/lifting/sort_lifted_constants.cmo \
335341
middle_end/flambda/lifting/reification.cmo \

driver/main_args.ml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,11 @@ let mk_flambda_expert_max_block_size_for_projections f =
10151015
this value"
10161016
;;
10171017

1018+
let mk_flambda_expert_max_unboxing_depth f =
1019+
"-flambda-expert-max-unboxing-depth", Arg.Int f,
1020+
" Do not unbox types deeper that this value"
1021+
;;
1022+
10181023
let mk_flambda_debug_permute_every_name f =
10191024
"-flambda-debug-permute-every-name", Arg.Unit f,
10201025
" Permute every name to check permutation works"
@@ -1277,6 +1282,7 @@ module type Optcommon_options = sig
12771282
val _no_flambda_expert_phantom_lets : unit -> unit
12781283
val _flambda_expert_max_inlining_depth : int -> unit
12791284
val _flambda_expert_max_block_size_for_projections : int -> unit
1285+
val _flambda_expert_max_unboxing_depth : int -> unit
12801286
val _flambda_debug_permute_every_name : unit -> unit
12811287
val _no_flambda_debug_permute_every_name : unit -> unit
12821288
val _flambda_debug_concrete_types_only_on_canonicals : unit -> unit
@@ -1647,6 +1653,8 @@ struct
16471653
F._flambda_expert_max_inlining_depth;
16481654
mk_flambda_expert_max_block_size_for_projections
16491655
F._flambda_expert_max_block_size_for_projections;
1656+
mk_flambda_expert_max_unboxing_depth
1657+
F._flambda_expert_max_unboxing_depth;
16501658
mk_flambda_debug_permute_every_name
16511659
F._flambda_debug_permute_every_name;
16521660
mk_no_flambda_debug_permute_every_name
@@ -1814,6 +1822,8 @@ module Make_opttop_options (F : Opttop_options) = struct
18141822
F._flambda_expert_max_inlining_depth;
18151823
mk_flambda_expert_max_block_size_for_projections
18161824
F._flambda_expert_max_block_size_for_projections;
1825+
mk_flambda_expert_max_unboxing_depth
1826+
F._flambda_expert_max_unboxing_depth;
18171827
mk_flambda_debug_permute_every_name
18181828
F._flambda_debug_permute_every_name;
18191829
mk_no_flambda_debug_permute_every_name
@@ -2141,6 +2151,8 @@ module Default = struct
21412151
Flambda.Expert.max_inlining_depth := depth
21422152
let _flambda_expert_max_block_size_for_projections size =
21432153
Flambda.Expert.max_block_size_for_projections := Some size
2154+
let _flambda_expert_max_unboxing_depth depth =
2155+
Flambda.Expert.max_unboxing_depth := depth
21442156
let _flambda_debug_permute_every_name =
21452157
set Flambda.Debug.permute_every_name
21462158
let _no_flambda_debug_permute_every_name =

driver/main_args.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ module type Optcommon_options = sig
247247
val _no_flambda_expert_phantom_lets : unit -> unit
248248
val _flambda_expert_max_inlining_depth : int -> unit
249249
val _flambda_expert_max_block_size_for_projections : int -> unit
250+
val _flambda_expert_max_unboxing_depth : int -> unit
250251
val _flambda_debug_permute_every_name : unit -> unit
251252
val _no_flambda_debug_permute_every_name : unit -> unit
252253
val _flambda_debug_concrete_types_only_on_canonicals : unit -> unit
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
type t = { foo : int; bar : float; }
3+
4+
let foo b x y =
5+
let f =
6+
if b
7+
then { foo = x; bar = y +. 1.; }
8+
else { bar = y +. 1.; foo = x; }
9+
in
10+
match f with
11+
| { foo; bar; } -> foo + (int_of_float bar)
12+
13+

flambdatest/mlexamples/float_fn.ml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
external (+.) : float -> float -> float = "%addfloat"
3+
4+
let[@inline never] g x = x +. 42.
5+
6+
let f b x =
7+
let y = g x
8+
(*
9+
if b then
10+
x +. 1.
11+
else
12+
g x
13+
*)
14+
in
15+
y +. 0.
16+
17+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
external (+.) : float -> float -> float = "%addfloat"
3+
4+
let[@inline never] g x = (x +. 42., x +. 1.)
5+
6+
let f b x =
7+
let y, z = g x
8+
(*
9+
if b then
10+
x +. 1.
11+
else
12+
g x
13+
*)
14+
in
15+
y +. z
16+
17+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
external (+.) : float -> float -> float = "%addfloat"
3+
4+
let f b x =
5+
let y =
6+
if b then
7+
x +. 1., 0.
8+
else
9+
x +. 42., x +. 1.
10+
in
11+
match y with
12+
| a, b -> a +. b
13+
14+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
let f b x =
3+
let y =
4+
if b then
5+
x +. 1.
6+
else
7+
x +. 42.
8+
in
9+
y +. 0.
10+
11+

0 commit comments

Comments
 (0)