Skip to content

Commit 14482df

Browse files
mshinwellantalsz
authored andcommitted
Finish flambda2 wiring + add caml_modify_local_prototype in memory.h
1 parent 2bdaf06 commit 14482df

File tree

10 files changed

+144
-172
lines changed

10 files changed

+144
-172
lines changed

middle_end/flambda2/from_lambda/lambda_to_flambda.ml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -993,8 +993,8 @@ let primitive_result_kind (prim : Lambda.primitive) :
993993
| Pccall { prim_native_repr_res = _, Unboxed_float; _ }
994994
| Pfloatofint _ | Pnegfloat _ | Pabsfloat _ | Paddfloat _ | Psubfloat _
995995
| Pmulfloat _ | Pdivfloat _ | Pfloatfield _
996-
| Parrayrefs Pfloatarray
997-
| Parrayrefu Pfloatarray
996+
| Parrayrefs (Pfloatarray_ref _)
997+
| Parrayrefu (Pfloatarray_ref _)
998998
| Pbigarrayref (_, _, (Pbigarray_float32 | Pbigarray_float64), _) ->
999999
Flambda_kind.With_subkind.boxed_float
10001000
| Pccall { prim_native_repr_res = _, Unboxed_integer Pnativeint; _ }
@@ -1019,8 +1019,8 @@ let primitive_result_kind (prim : Lambda.primitive) :
10191019
| Pstringlength | Pstringrefu | Pbyteslength | Pbytesrefu | Pbytessetu
10201020
| Parraylength _ | Parraysetu _ | Pisint _ | Pbintcomp _ | Pintofbint _
10211021
| Pisout
1022-
| Parrayrefs Pintarray
1023-
| Parrayrefu Pintarray
1022+
| Parrayrefs Pintarray_ref
1023+
| Parrayrefu Pintarray_ref
10241024
| Pprobe_is_enabled _ | Pctconst _ | Pbswap16
10251025
| Pbigarrayref
10261026
( _,
@@ -1055,8 +1055,8 @@ let primitive_result_kind (prim : Lambda.primitive) :
10551055
(* CR ncourant: this should be bottom, but we don't have it *)
10561056
Flambda_kind.With_subkind.any_value
10571057
| Pccall { prim_native_repr_res = _, Same_as_ocaml_repr; _ }
1058-
| Parrayrefs (Pgenarray | Paddrarray)
1059-
| Parrayrefu (Pgenarray | Paddrarray)
1058+
| Parrayrefs (Pgenarray_ref _ | Paddrarray_ref)
1059+
| Parrayrefu (Pgenarray_ref _ | Paddrarray_ref)
10601060
| Pbytes_to_string | Pbytes_of_string | Parray_of_iarray | Parray_to_iarray
10611061
| Pgetglobal _ | Psetglobal _ | Pgetpredef _ | Pmakeblock _
10621062
| Pmakefloatblock _ | Pfield _ | Pfield_computed _ | Pduprecord _

middle_end/flambda2/from_lambda/lambda_to_flambda_primitives.ml

Lines changed: 39 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -131,34 +131,40 @@ let convert_array_kind (kind : L.array_kind) : converted_array_kind =
131131
| Pintarray -> Array_kind Immediates
132132
| Pfloatarray -> Array_kind Naked_floats
133133

134+
module Array_ref_kind = struct
135+
type t =
136+
| Immediates
137+
| Values
138+
| Naked_floats of L.alloc_mode
139+
end
140+
134141
type converted_array_ref_kind =
135-
| Array_ref_kind of P.Array_ref_kind.t
136-
| Float_array_opt_dynamic_ref of Alloc_mode.For_allocations.t
142+
| Array_ref_kind of Array_ref_kind.t
143+
| Float_array_opt_dynamic_ref of L.alloc_mode
137144

138-
let convert_array_ref_kind
139-
~current_region (kind : L.array_ref_kind) : converted_array_ref_kind =
145+
let convert_array_ref_kind (kind : L.array_ref_kind) : converted_array_ref_kind
146+
=
140147
match kind with
141148
| Pgenarray_ref mode ->
142149
check_float_array_optimisation_enabled ();
143-
Float_array_opt_dynamic_ref
144-
(Alloc_mode.For_allocations.from_lambda ~current_region mode)
150+
Float_array_opt_dynamic_ref mode
145151
| Paddrarray_ref -> Array_ref_kind Values
146152
| Pintarray_ref -> Array_ref_kind Immediates
147-
| Pfloatarray_ref mode ->
148-
Array_ref_kind
149-
(Naked_floats (Alloc_mode.For_allocations.from_lambda ~current_region mode))
153+
| Pfloatarray_ref mode -> Array_ref_kind (Naked_floats mode)
150154

151155
type converted_array_set_kind =
152156
| Array_set_kind of P.Array_set_kind.t
153157
| Float_array_opt_dynamic_set of Alloc_mode.For_assignments.t
154158

155-
let convert_array_set_kind (kind : L.array_set_kind) : converted_array_set_kind =
159+
let convert_array_set_kind (kind : L.array_set_kind) : converted_array_set_kind
160+
=
156161
match kind with
157162
| Pgenarray_set mode ->
158163
check_float_array_optimisation_enabled ();
159164
Float_array_opt_dynamic_set (Alloc_mode.For_assignments.from_lambda mode)
160165
| Paddrarray_set mode ->
161-
Array_set_kind (Values (Alloc_mode.For_assignments.from_lambda mode))
166+
Array_set_kind
167+
(Values (Assignment (Alloc_mode.For_assignments.from_lambda mode)))
162168
| Pintarray_set -> Array_set_kind Immediates
163169
| Pfloatarray_set -> Array_set_kind Naked_floats
164170

@@ -522,53 +528,39 @@ let check_array_access ~dbg ~array ~index primitive : H.expr_primitive =
522528
~conditions:(array_access_validity_condition array index)
523529
~dbg
524530

525-
let array_load_unsafe ~array ~index (array_ref_kind : P.Array_ref_kind.t)
526-
~current_region : H.expr_primitive =
531+
let array_load_unsafe ~array ~index (array_ref_kind : Array_ref_kind.t)
532+
~current_region : H.expr_primitive =
527533
match array_ref_kind with
528-
| Immediates | Values ->
529-
Binary (Array_load (array_ref_kind, Mutable), array, index)
534+
| Immediates -> Binary (Array_load (Immediates, Mutable), array, index)
535+
| Values -> Binary (Array_load (Values, Mutable), array, index)
530536
| Naked_floats mode ->
531537
box_float mode
532538
(Binary (Array_load (Naked_floats, Mutable), array, index))
533539
~current_region
534540

535-
let array_set_unsafe ~array ~index ~new_value (array_set_kind : P.Array_set_kind.t) :
536-
H.expr_primitive =
537-
match array_set_kind with
538-
| Immediates
539-
Ternary
540-
( Array_set (array_kind, Assignment Alloc_mode.For_assignments.heap),
541-
array,
542-
index,
543-
new_value )
544-
| Values ->
545-
Ternary
546-
( Array_set (array_kind, Assignment Alloc_mode.For_assignments.heap),
547-
array,
548-
index,
549-
new_value )
550-
| Naked_floats ->
551-
Ternary
552-
( Array_set
553-
(Naked_floats, Assignment (Alloc_mode.For_assignments.local ())),
554-
array,
555-
index,
556-
unbox_float new_value )
541+
let array_set_unsafe ~array ~index ~new_value
542+
(array_set_kind : P.Array_set_kind.t) : H.expr_primitive =
543+
let new_value =
544+
match array_set_kind with
545+
| Immediates | Values _ -> new_value
546+
| Naked_floats -> unbox_float new_value
547+
in
548+
Ternary (Array_set array_set_kind, array, index, new_value)
557549

558-
let[@inline always] match_on_array_ref_kind ~current_region ~array array_ref_kind f
559-
: H.expr_primitive =
560-
match convert_array_ref_kind ~current_region array_ref_kind with
550+
let[@inline always] match_on_array_ref_kind ~array array_ref_kind f :
551+
H.expr_primitive =
552+
match convert_array_ref_kind array_ref_kind with
561553
| Array_ref_kind array_ref_kind -> f array_ref_kind
562554
| Float_array_opt_dynamic_ref mode ->
563555
(* CR keryan: we should push the ITE as low as possible to avoid duplicating
564556
too much *)
565557
If_then_else
566558
( Unary (Is_flat_float_array, array),
567-
f (P.Array_ref_kind.Naked_floats mode),
568-
f P.Array_ref_kind.Values )
559+
f (Array_ref_kind.Naked_floats mode),
560+
f Array_ref_kind.Values )
569561

570-
let[@inline always] match_on_array_set_kind ~array array_ref_kind f
571-
: H.expr_primitive =
562+
let[@inline always] match_on_array_set_kind ~array array_ref_kind f :
563+
H.expr_primitive =
572564
match convert_array_set_kind array_ref_kind with
573565
| Array_set_kind array_set_kind -> f array_set_kind
574566
| Float_array_opt_dynamic_set mode ->
@@ -577,7 +569,7 @@ let[@inline always] match_on_array_set_kind ~array array_ref_kind f
577569
If_then_else
578570
( Unary (Is_flat_float_array, array),
579571
f P.Array_set_kind.Naked_floats,
580-
f (P.Array_set_kind.Values mode) )
572+
f (P.Array_set_kind.Values (Assignment mode)) )
581573

582574
(* Safe arith (div/mod by zero) *)
583575
let checked_arith_op ~dbg (bi : Lambda.boxed_integer option) op mode arg1 arg2
@@ -1022,11 +1014,11 @@ let convert_lprim ~big_endian (prim : L.primitive) (args : Simple.t list)
10221014
(* For this and the following cases we will end up relying on the backend to
10231015
CSE the two accesses to the array's header word in the [Pgenarray]
10241016
case. *)
1025-
match_on_array_ref_kind ~current_region ~array array_ref_kind
1017+
match_on_array_ref_kind ~array array_ref_kind
10261018
(array_load_unsafe ~array ~index ~current_region)
10271019
| Parrayrefs array_ref_kind, [array; index] ->
10281020
check_array_access ~dbg ~array ~index
1029-
(match_on_array_ref_kind ~current_region ~array array_ref_kind
1021+
(match_on_array_ref_kind ~array array_ref_kind
10301022
(array_load_unsafe ~array ~index ~current_region))
10311023
| Parraysetu array_set_kind, [array; index; new_value] ->
10321024
match_on_array_set_kind ~array array_set_kind

middle_end/flambda2/parser/fexpr_to_flambda.ml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,14 @@ let binop (binop : Fexpr.binop) : Flambda_primitive.binary_primitive =
441441

442442
let ternop env (ternop : Fexpr.ternop) : Flambda_primitive.ternary_primitive =
443443
match ternop with
444-
| Array_set (ak, ia) -> Array_set (ak, init_or_assign env ia)
444+
| Array_set (ak, ia) ->
445+
let ask : Flambda_primitive.Array_set_kind.t =
446+
match ak, ia with
447+
| Immediates, _ -> Immediates
448+
| Naked_floats, _ -> Naked_floats
449+
| Values, ia -> Values (init_or_assign env ia)
450+
in
451+
Array_set ask
445452
| Block_set (bk, ia) -> Block_set (block_access_kind bk, init_or_assign env ia)
446453
| Bytes_or_bigstring_set (blv, saw) -> Bytes_or_bigstring_set (blv, saw)
447454

middle_end/flambda2/parser/flambda_to_fexpr.ml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,19 @@ let binop (op : Flambda_primitive.binary_primitive) : Fexpr.binop =
582582

583583
let ternop env (op : Flambda_primitive.ternary_primitive) : Fexpr.ternop =
584584
match op with
585-
| Array_set (ak, ia) -> Array_set (ak, init_or_assign env ia)
585+
| Array_set ak ->
586+
let ia : Flambda_primitive.Init_or_assign.t =
587+
match ak with
588+
| Values ia -> ia
589+
| Immediates | Naked_floats -> Assignment Alloc_mode.For_assignments.heap
590+
in
591+
let ak : Flambda_primitive.Array_kind.t =
592+
match ak with
593+
| Immediates -> Immediates
594+
| Values _ -> Values
595+
| Naked_floats -> Naked_floats
596+
in
597+
Array_set (ak, init_or_assign env ia)
586598
| Block_set (bk, ia) -> Block_set (block_access_kind bk, init_or_assign env ia)
587599
| Bytes_or_bigstring_set (blv, saw) -> Bytes_or_bigstring_set (blv, saw)
588600
| Bigarray_set _ ->

middle_end/flambda2/simplify/simplify_ternary_primitive.ml

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,16 @@
1616

1717
open! Simplify_import
1818

19-
let simplify_array_set (array_kind : P.Array_kind.t) init_or_assign dacc
20-
~original_term:_ dbg ~arg1:array ~arg1_ty:array_ty ~arg2:index ~arg2_ty:_
21-
~arg3:new_value ~arg3_ty:_ ~result_var =
22-
let elt_kind = P.Array_kind.element_kind array_kind |> K.With_subkind.kind in
19+
let simplify_array_set (array_set_kind : P.Array_set_kind.t) dacc ~original_term
20+
dbg ~arg1:array ~arg1_ty:array_ty ~arg2:index ~arg2_ty:_ ~arg3:new_value
21+
~arg3_ty:_ ~result_var =
22+
let elt_kind =
23+
P.Array_set_kind.element_kind array_set_kind |> K.With_subkind.kind
24+
in
2325
let array_kind =
24-
Simplify_common.specialise_array_kind dacc array_kind ~array_ty
26+
Simplify_common.specialise_array_kind dacc
27+
(P.Array_set_kind.array_kind array_set_kind)
28+
~array_ty
2529
in
2630
match array_kind with
2731
| Bottom -> SPR.create_invalid dacc
@@ -30,10 +34,26 @@ let simplify_array_set (array_kind : P.Array_kind.t) init_or_assign dacc
3034
P.Array_kind.element_kind array_kind |> K.With_subkind.kind
3135
in
3236
assert (K.equal elt_kind elt_kind');
37+
let array_set_kind : P.Array_set_kind.t =
38+
match array_kind with
39+
| Immediates -> Immediates
40+
| Values -> (
41+
match array_set_kind with
42+
| Values init_or_assign -> Values init_or_assign
43+
| Immediates
44+
(* We don't expect specialisation regressions from Immediates to
45+
Values. *)
46+
| Naked_floats ->
47+
Misc.fatal_errorf
48+
"Didn't expect array specialisation to yield array kind %a from \
49+
array set kind %a:@ %a"
50+
P.Array_kind.print array_kind P.Array_set_kind.print array_set_kind
51+
Named.print original_term)
52+
| Naked_floats -> Naked_floats
53+
in
3354
let named =
3455
Named.create_prim
35-
(Ternary
36-
(Array_set (array_kind, init_or_assign), array, index, new_value))
56+
(Ternary (Array_set array_set_kind, array, index, new_value))
3757
dbg
3858
in
3959
let unit_ty = Flambda2_types.this_tagged_immediate Targetint_31_63.zero in
@@ -59,8 +79,7 @@ let simplify_ternary_primitive dacc original_prim (prim : P.ternary_primitive)
5979
let original_term = Named.create_prim original_prim dbg in
6080
let simplifier =
6181
match prim with
62-
| Array_set (array_kind, init_or_assign) ->
63-
simplify_array_set array_kind init_or_assign
82+
| Array_set array_kind -> simplify_array_set array_kind
6483
| Block_set (block_access_kind, init_or_assign) ->
6584
simplify_block_set block_access_kind init_or_assign
6685
| Bytes_or_bigstring_set (bytes_like_value, string_accessor_width) ->

middle_end/flambda2/terms/code_size.ml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,11 @@ let block_set (kind : Flambda_primitive.Block_access_kind.t)
148148
| Values _, (Assignment Local | Initialization) -> 1 (* cadda + store *)
149149
| Naked_floats _, (Assignment _ | Initialization) -> 1
150150

151-
let array_set (kind : Flambda_primitive.Array_kind.t)
152-
(init : Flambda_primitive.Init_or_assign.t) =
153-
match kind, init with
154-
| Values, Assignment Heap -> nonalloc_extcall_size
155-
| Values, (Assignment Local | Initialization) -> 1
156-
| (Immediates | Naked_floats), (Assignment _ | Initialization) -> 1
151+
let array_set (kind : Flambda_primitive.Array_set_kind.t) =
152+
match kind with
153+
| Values (Assignment Heap) -> nonalloc_extcall_size
154+
| Values (Assignment Local | Initialization) -> 1
155+
| Immediates | Naked_floats -> 1
157156

158157
let string_or_bigstring_load kind width =
159158
let start_address_load =
@@ -360,7 +359,7 @@ let binary_prim_size prim =
360359
let ternary_prim_size prim =
361360
match (prim : Flambda_primitive.ternary_primitive) with
362361
| Block_set (block_access, init) -> block_set block_access init
363-
| Array_set (kind, init) -> array_set kind init
362+
| Array_set kind -> array_set kind
364363
| Bytes_or_bigstring_set (kind, width) -> bytes_like_set kind width
365364
| Bigarray_set (_dims, (Complex32 | Complex64), _layout) ->
366365
5 (* ~ 3 block_load + 2 block_set *)

0 commit comments

Comments
 (0)