@@ -131,34 +131,40 @@ let convert_array_kind (kind : L.array_kind) : converted_array_kind =
131
131
| Pintarray -> Array_kind Immediates
132
132
| Pfloatarray -> Array_kind Naked_floats
133
133
134
+ module Array_ref_kind = struct
135
+ type t =
136
+ | Immediates
137
+ | Values
138
+ | Naked_floats of L .alloc_mode
139
+ end
140
+
134
141
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
137
144
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
+ =
140
147
match kind with
141
148
| Pgenarray_ref mode ->
142
149
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
145
151
| Paddrarray_ref -> Array_ref_kind Values
146
152
| 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)
150
154
151
155
type converted_array_set_kind =
152
156
| Array_set_kind of P.Array_set_kind .t
153
157
| Float_array_opt_dynamic_set of Alloc_mode.For_assignments .t
154
158
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
+ =
156
161
match kind with
157
162
| Pgenarray_set mode ->
158
163
check_float_array_optimisation_enabled () ;
159
164
Float_array_opt_dynamic_set (Alloc_mode.For_assignments. from_lambda mode)
160
165
| 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)))
162
168
| Pintarray_set -> Array_set_kind Immediates
163
169
| Pfloatarray_set -> Array_set_kind Naked_floats
164
170
@@ -522,53 +528,39 @@ let check_array_access ~dbg ~array ~index primitive : H.expr_primitive =
522
528
~conditions: (array_access_validity_condition array index)
523
529
~dbg
524
530
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 =
527
533
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)
530
536
| Naked_floats mode ->
531
537
box_float mode
532
538
(Binary (Array_load (Naked_floats , Mutable ), array , index))
533
539
~current_region
534
540
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)
557
549
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
561
553
| Array_ref_kind array_ref_kind -> f array_ref_kind
562
554
| Float_array_opt_dynamic_ref mode ->
563
555
(* CR keryan: we should push the ITE as low as possible to avoid duplicating
564
556
too much *)
565
557
If_then_else
566
558
( 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 )
569
561
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 =
572
564
match convert_array_set_kind array_ref_kind with
573
565
| Array_set_kind array_set_kind -> f array_set_kind
574
566
| Float_array_opt_dynamic_set mode ->
@@ -577,7 +569,7 @@ let[@inline always] match_on_array_set_kind ~array array_ref_kind f
577
569
If_then_else
578
570
( Unary (Is_flat_float_array , array ),
579
571
f P.Array_set_kind. Naked_floats ,
580
- f (P.Array_set_kind. Values mode) )
572
+ f (P.Array_set_kind. Values ( Assignment mode) ) )
581
573
582
574
(* Safe arith (div/mod by zero) *)
583
575
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)
1022
1014
(* For this and the following cases we will end up relying on the backend to
1023
1015
CSE the two accesses to the array's header word in the [Pgenarray]
1024
1016
case. *)
1025
- match_on_array_ref_kind ~current_region ~ array array_ref_kind
1017
+ match_on_array_ref_kind ~array array_ref_kind
1026
1018
(array_load_unsafe ~array ~index ~current_region )
1027
1019
| Parrayrefs array_ref_kind , [array ; index] ->
1028
1020
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
1030
1022
(array_load_unsafe ~array ~index ~current_region ))
1031
1023
| Parraysetu array_set_kind , [array ; index; new_value] ->
1032
1024
match_on_array_set_kind ~array array_set_kind
0 commit comments