Skip to content

Commit 559870d

Browse files
authored
flambda-backend: More precise layout for array patterns (#1968)
* more precise layout * define array_ref_kind_result_layout
1 parent 097204a commit 559870d

File tree

3 files changed

+14
-9
lines changed

3 files changed

+14
-9
lines changed

lambda/lambda.ml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1530,6 +1530,11 @@ let layout_of_native_repr : Primitive.native_repr -> _ = function
15301530
| Void -> assert false
15311531
end
15321532

1533+
let array_ref_kind_result_layout = function
1534+
| Pintarray_ref -> layout_int
1535+
| Pfloatarray_ref _ -> layout_boxed_float
1536+
| Pgenarray_ref _ | Paddrarray_ref -> layout_field
1537+
15331538
let primitive_result_layout (p : primitive) =
15341539
assert !Clflags.native_code;
15351540
match p with
@@ -1570,10 +1575,7 @@ let primitive_result_layout (p : primitive) =
15701575
| Pprobe_is_enabled _ | Pbswap16
15711576
-> layout_int
15721577
| Parrayrefu array_ref_kind | Parrayrefs array_ref_kind ->
1573-
(match array_ref_kind with
1574-
| Pintarray_ref -> layout_int
1575-
| Pfloatarray_ref _ -> layout_boxed_float
1576-
| Pgenarray_ref _ | Paddrarray_ref -> layout_field)
1578+
array_ref_kind_result_layout array_ref_kind
15771579
| Pbintofint (bi, _) | Pcvtbint (_,bi,_)
15781580
| Pnegbint (bi, _) | Paddbint (bi, _) | Psubbint (bi, _)
15791581
| Pmulbint (bi, _) | Pdivbint {size = bi} | Pmodbint {size = bi}

lambda/lambda.mli

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,8 @@ val structured_constant_layout : structured_constant -> layout
764764

765765
val primitive_result_layout : primitive -> layout
766766

767+
val array_ref_kind_result_layout: array_ref_kind -> layout
768+
767769
val compute_expr_layout : (Ident.t -> layout option) -> lambda -> layout
768770

769771
(** The mode will be discarded if unnecessary for the given [array_kind] *)

lambda/matching.ml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2197,18 +2197,19 @@ let get_expr_args_array ~scopes kind head (arg, _mut, _sort, _layout) rem =
21972197
if pos >= len then
21982198
rem
21992199
else
2200-
(* CR ncourant: could do better than layout_field using kind *)
2200+
(* TODO: The resulting float should be allocated to at the mode of the
2201+
array pattern, once that's available *)
2202+
let ref_kind = Lambda.(array_ref_kind alloc_heap kind) in
2203+
let result_layout = array_ref_kind_result_layout ref_kind in
22012204
( Lprim
2202-
(* TODO: The resulting float should be allocated to at the mode of the
2203-
array pattern, once that's available *)
2204-
(Parrayrefu Lambda.(array_ref_kind alloc_heap kind),
2205+
(Parrayrefu ref_kind,
22052206
[ arg; Lconst (Const_base (Const_int pos)) ],
22062207
loc),
22072208
(match am with
22082209
| Mutable -> StrictOpt
22092210
| Immutable -> Alias),
22102211
Jkind.Sort.for_array_get_result,
2211-
layout_field)
2212+
result_layout)
22122213
:: make_args (pos + 1)
22132214
in
22142215
make_args 0

0 commit comments

Comments
 (0)