Skip to content

Commit 0f4d23e

Browse files
authored
flambda-backend: Index arrays with unboxed ints (#2337)
* wip * . * new primitives for unboxed int indexing * fix tests * bytegen * fix runtime * reduce diff * code cleanup * fix upstream * add comment in array_access_validity_condition
1 parent c723951 commit 0f4d23e

15 files changed

+574
-115
lines changed

bytecomp/bytegen.ml

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,16 @@ let comp_bint_primitive bi suff args =
425425
| Pint64 -> "caml_int64_" in
426426
Kccall(pref ^ suff, List.length args)
427427

428+
let array_primitive (index_kind : Lambda.array_index_kind) prefix =
429+
let suffix =
430+
match index_kind with
431+
| Ptagged_int_index -> ""
432+
| Punboxed_int_index Pint64 -> "_indexed_by_int64"
433+
| Punboxed_int_index Pint32 -> "_indexed_by_int32"
434+
| Punboxed_int_index Pnativeint -> "_indexed_by_nativeint"
435+
in
436+
prefix ^ suffix
437+
428438
let comp_primitive stack_info p sz args =
429439
check_stack stack_info sz;
430440
match p with
@@ -504,30 +514,45 @@ let comp_primitive stack_info p sz args =
504514
(* In bytecode, nothing is ever actually stack-allocated, so we ignore the
505515
array modes (allocation for [Parrayref{s,u}], modification for
506516
[Parrayset{s,u}]). *)
507-
| Parrayrefs (Pgenarray_ref _) -> Kccall("caml_array_get", 2)
508-
| Parrayrefs (Pfloatarray_ref _) -> Kccall("caml_floatarray_get", 2)
509-
| Parrayrefs (Paddrarray_ref | Pintarray_ref) ->
517+
| Parrayrefs (Pgenarray_ref _, index_kind)
518+
| Parrayrefs ((Paddrarray_ref | Pintarray_ref | Pfloatarray_ref _),
519+
(Punboxed_int_index _ as index_kind)) ->
520+
Kccall(array_primitive index_kind "caml_array_get", 2)
521+
| Parrayrefs (Pfloatarray_ref _, Ptagged_int_index) ->
522+
Kccall("caml_floatarray_get", 2)
523+
| Parrayrefs ((Paddrarray_ref | Pintarray_ref), Ptagged_int_index) ->
510524
Kccall("caml_array_get_addr", 2)
511-
| Parrayrefs (Punboxedfloatarray_ref _ | Punboxedintarray_ref _) ->
525+
| Parrayrefs ((Punboxedfloatarray_ref _ | Punboxedintarray_ref _), _) ->
512526
Misc.fatal_errorf "Cannot use primitive %a for unboxed arrays in bytecode"
513527
Printlambda.primitive p
514-
| Parraysets (Pgenarray_set _) -> Kccall("caml_array_set", 3)
515-
| Parraysets Pfloatarray_set -> Kccall("caml_floatarray_set", 3)
516-
| Parraysets (Paddrarray_set _ | Pintarray_set) ->
528+
| Parraysets (Pgenarray_set _, index_kind)
529+
| Parraysets ((Paddrarray_set _ | Pintarray_set | Pfloatarray_set),
530+
(Punboxed_int_index _ as index_kind)) ->
531+
Kccall(array_primitive index_kind "caml_array_set", 3)
532+
| Parraysets (Pfloatarray_set, Ptagged_int_index) -> Kccall("caml_floatarray_set", 3)
533+
| Parraysets ((Paddrarray_set _ | Pintarray_set), Ptagged_int_index) ->
517534
Kccall("caml_array_set_addr", 3)
518-
| Parraysets (Punboxedfloatarray_set _ | Punboxedintarray_set _) ->
535+
| Parraysets ((Punboxedfloatarray_set _ | Punboxedintarray_set _), _index_kind) ->
519536
Misc.fatal_errorf "Cannot use primitive %a for unboxed arrays in bytecode"
520537
Printlambda.primitive p
521-
| Parrayrefu (Pgenarray_ref _) -> Kccall("caml_array_unsafe_get", 2)
522-
| Parrayrefu (Pfloatarray_ref _) -> Kccall("caml_floatarray_unsafe_get", 2)
523-
| Parrayrefu (Paddrarray_ref | Pintarray_ref) -> Kgetvectitem
524-
| Parrayrefu (Punboxedfloatarray_ref _ | Punboxedintarray_ref _) ->
538+
| Parrayrefu (Pgenarray_ref _, index_kind)
539+
| Parrayrefu ((Paddrarray_ref | Pintarray_ref | Pfloatarray_ref _),
540+
(Punboxed_int_index _ as index_kind)) ->
541+
Kccall(array_primitive index_kind "caml_array_unsafe_get", 2)
542+
| Parrayrefu (Pfloatarray_ref _, Ptagged_int_index) ->
543+
Kccall("caml_floatarray_unsafe_get", 2)
544+
| Parrayrefu ((Paddrarray_ref | Pintarray_ref), Ptagged_int_index) -> Kgetvectitem
545+
| Parrayrefu ((Punboxedfloatarray_ref _ | Punboxedintarray_ref _), _index_kind) ->
525546
Misc.fatal_errorf "Cannot use primitive %a for unboxed arrays in bytecode"
526547
Printlambda.primitive p
527-
| Parraysetu (Pgenarray_set _) -> Kccall("caml_array_unsafe_set", 3)
528-
| Parraysetu Pfloatarray_set -> Kccall("caml_floatarray_unsafe_set", 3)
529-
| Parraysetu (Paddrarray_set _ | Pintarray_set) -> Ksetvectitem
530-
| Parraysetu (Punboxedfloatarray_set _ | Punboxedintarray_set _) ->
548+
| Parraysetu (Pgenarray_set _, index_kind)
549+
| Parraysetu ((Paddrarray_set _ | Pintarray_set | Pfloatarray_set),
550+
(Punboxed_int_index _ as index_kind)) ->
551+
Kccall(array_primitive index_kind "caml_array_unsafe_set", 3)
552+
| Parraysetu (Pfloatarray_set, Ptagged_int_index) ->
553+
Kccall("caml_floatarray_unsafe_set", 3)
554+
| Parraysetu ((Paddrarray_set _ | Pintarray_set), Ptagged_int_index) -> Ksetvectitem
555+
| Parraysetu ((Punboxedfloatarray_set _ | Punboxedintarray_set _), _index_kind) ->
531556
Misc.fatal_errorf "Cannot use primitive %a for unboxed arrays in bytecode"
532557
Printlambda.primitive p
533558
| Pctconst c ->

lambda/lambda.ml

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,10 @@ type primitive =
197197
| Pmakearray of array_kind * mutable_flag * alloc_mode
198198
| Pduparray of array_kind * mutable_flag
199199
| Parraylength of array_kind
200-
| Parrayrefu of array_ref_kind
201-
| Parraysetu of array_set_kind
202-
| Parrayrefs of array_ref_kind
203-
| Parraysets of array_set_kind
200+
| Parrayrefu of array_ref_kind * array_index_kind
201+
| Parraysetu of array_set_kind * array_index_kind
202+
| Parrayrefs of array_ref_kind * array_index_kind
203+
| Parraysets of array_set_kind * array_index_kind
204204
(* Test if the argument is a block or an immediate integer *)
205205
| Pisint of { variant_only : bool }
206206
(* Test if the (integer) argument is outside an interval *)
@@ -358,6 +358,10 @@ and array_set_kind =
358358
| Punboxedfloatarray_set of unboxed_float
359359
| Punboxedintarray_set of unboxed_integer
360360

361+
and array_index_kind =
362+
| Ptagged_int_index
363+
| Punboxed_int_index of unboxed_integer
364+
361365
and boxed_float = Primitive.boxed_float =
362366
| Pfloat64
363367
| Pfloat32
@@ -1586,12 +1590,12 @@ let primitive_may_allocate : primitive -> alloc_mode option = function
15861590
| Pduparray _ -> Some alloc_heap
15871591
| Parraylength _ -> None
15881592
| Parraysetu _ | Parraysets _
1589-
| Parrayrefu (Paddrarray_ref | Pintarray_ref
1590-
| Punboxedfloatarray_ref _ | Punboxedintarray_ref _)
1591-
| Parrayrefs (Paddrarray_ref | Pintarray_ref
1592-
| Punboxedfloatarray_ref _ | Punboxedintarray_ref _) -> None
1593-
| Parrayrefu (Pgenarray_ref m | Pfloatarray_ref m)
1594-
| Parrayrefs (Pgenarray_ref m | Pfloatarray_ref m) -> Some m
1593+
| Parrayrefu ((Paddrarray_ref | Pintarray_ref
1594+
| Punboxedfloatarray_ref _ | Punboxedintarray_ref _), _)
1595+
| Parrayrefs ((Paddrarray_ref | Pintarray_ref
1596+
| Punboxedfloatarray_ref _ | Punboxedintarray_ref _), _) -> None
1597+
| Parrayrefu ((Pgenarray_ref m | Pfloatarray_ref m), _)
1598+
| Parrayrefs ((Pgenarray_ref m | Pfloatarray_ref m), _) -> Some m
15951599
| Pisint _ | Pisout -> None
15961600
| Pintofbint _ -> None
15971601
| Pbintofint (_,m)
@@ -1743,7 +1747,7 @@ let primitive_result_layout (p : primitive) =
17431747
| Pstring_load_16 _ | Pbytes_load_16 _ | Pbigstring_load_16 _
17441748
| Pprobe_is_enabled _ | Pbswap16
17451749
-> layout_int
1746-
| Parrayrefu array_ref_kind | Parrayrefs array_ref_kind ->
1750+
| Parrayrefu (array_ref_kind, _) | Parrayrefs (array_ref_kind, _) ->
17471751
array_ref_kind_result_layout array_ref_kind
17481752
| Pbintofint (bi, _) | Pcvtbint (_,bi,_)
17491753
| Pnegbint (bi, _) | Paddbint (bi, _) | Psubbint (bi, _)

lambda/lambda.mli

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,10 @@ type primitive =
159159
The arguments of [Pduparray] give the kind and mutability of the
160160
array being *produced* by the duplication. *)
161161
| Parraylength of array_kind
162-
| Parrayrefu of array_ref_kind
163-
| Parraysetu of array_set_kind
164-
| Parrayrefs of array_ref_kind
165-
| Parraysets of array_set_kind
162+
| Parrayrefu of array_ref_kind * array_index_kind
163+
| Parraysetu of array_set_kind * array_index_kind
164+
| Parrayrefs of array_ref_kind * array_index_kind
165+
| Parraysets of array_set_kind * array_index_kind
166166
(* Test if the argument is a block or an immediate integer *)
167167
| Pisint of { variant_only : bool }
168168
(* Test if the (integer) argument is outside an interval *)
@@ -308,6 +308,10 @@ and array_set_kind =
308308
| Punboxedfloatarray_set of unboxed_float
309309
| Punboxedintarray_set of unboxed_integer
310310

311+
and array_index_kind =
312+
| Ptagged_int_index
313+
| Punboxed_int_index of unboxed_integer
314+
311315
and value_kind =
312316
| Pgenval
313317
| Pintval

lambda/matching.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2219,7 +2219,7 @@ let get_expr_args_array ~scopes kind head (arg, _mut, _sort, _layout) rem =
22192219
let ref_kind = Lambda.(array_ref_kind alloc_heap kind) in
22202220
let result_layout = array_ref_kind_result_layout ref_kind in
22212221
( Lprim
2222-
(Parrayrefu ref_kind,
2222+
(Parrayrefu (ref_kind, Ptagged_int_index),
22232223
[ arg; Lconst (Const_base (Const_int pos)) ],
22242224
loc),
22252225
(match am with

lambda/printlambda.ml

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,13 @@ let array_ref_kind ppf k =
8383
| Punboxedintarray_ref Pint64 -> fprintf ppf "unboxed_int64"
8484
| Punboxedintarray_ref Pnativeint -> fprintf ppf "unboxed_nativeint"
8585

86+
let array_index_kind ppf k =
87+
match k with
88+
| Ptagged_int_index -> fprintf ppf "int"
89+
| Punboxed_int_index Pint32 -> fprintf ppf "unboxed_int32"
90+
| Punboxed_int_index Pint64 -> fprintf ppf "unboxed_int64"
91+
| Punboxed_int_index Pnativeint -> fprintf ppf "unboxed_nativeint"
92+
8693
let array_set_kind ppf k =
8794
let pp_mode ppf = function
8895
| Modify_heap -> ()
@@ -482,10 +489,18 @@ let primitive ppf = function
482489
| Pduparray (k, Immutable) -> fprintf ppf "duparray_imm[%s]" (array_kind k)
483490
| Pduparray (k, Immutable_unique) ->
484491
fprintf ppf "duparray_unique[%s]" (array_kind k)
485-
| Parrayrefu rk -> fprintf ppf "array.unsafe_get[%a]" array_ref_kind rk
486-
| Parraysetu sk -> fprintf ppf "array.unsafe_set[%a]" array_set_kind sk
487-
| Parrayrefs rk -> fprintf ppf "array.get[%a]" array_ref_kind rk
488-
| Parraysets sk -> fprintf ppf "array.set[%a]" array_set_kind sk
492+
| Parrayrefu (rk, idx) -> fprintf ppf "array.unsafe_get[%a indexed by %a]"
493+
array_ref_kind rk
494+
array_index_kind idx
495+
| Parraysetu (sk, idx) -> fprintf ppf "array.unsafe_set[%a indexed by %a]"
496+
array_set_kind sk
497+
array_index_kind idx
498+
| Parrayrefs (rk, idx) -> fprintf ppf "array.get[%a indexed by %a]"
499+
array_ref_kind rk
500+
array_index_kind idx
501+
| Parraysets (sk, idx) -> fprintf ppf "array.set[%a indexed by %a]"
502+
array_set_kind sk
503+
array_index_kind idx
489504
| Pctconst c ->
490505
let const_name = match c with
491506
| Big_endian -> "big_endian"

lambda/transl_array_comprehension.ml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,8 @@ let iterator ~transl_exp ~scopes ~loc
495495
~return_layout:(Pvalue Pintval)
496496
pattern.pat_loc
497497
(Lprim(Parrayrefu
498-
Lambda.(array_ref_kind alloc_heap iter_arr_kind),
498+
(Lambda.(array_ref_kind alloc_heap iter_arr_kind),
499+
Ptagged_int_index),
499500
[iter_arr.var; Lvar iter_ix],
500501
loc))
501502
pattern
@@ -776,7 +777,8 @@ let body
776777
let open Let_binding in
777778
let set_element_raw elt =
778779
(* array.(index) <- elt *)
779-
Lprim(Parraysetu Lambda.(array_set_kind modify_heap array_kind),
780+
Lprim(Parraysetu (Lambda.(array_set_kind modify_heap array_kind),
781+
Ptagged_int_index),
780782
[array.var; index.var; elt],
781783
loc)
782784
in

lambda/translprim.ml

Lines changed: 78 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -293,23 +293,82 @@ let lookup_primitive loc ~poly_mode ~poly_sort pos p =
293293
| "%bytes_unsafe_get" -> Primitive (Pbytesrefu, 2)
294294
| "%bytes_unsafe_set" -> Primitive (Pbytessetu, 3)
295295
| "%array_length" -> Primitive ((Parraylength gen_array_kind), 1)
296-
| "%array_safe_get" -> Primitive ((Parrayrefs (gen_array_ref_kind mode)), 2)
296+
| "%array_safe_get" ->
297+
Primitive
298+
((Parrayrefs (gen_array_ref_kind mode, Ptagged_int_index)), 2)
297299
| "%array_safe_set" ->
298-
Primitive (Parraysets (gen_array_set_kind (get_first_arg_mode ())), 3)
299-
| "%array_unsafe_get" -> Primitive (Parrayrefu (gen_array_ref_kind mode), 2)
300+
Primitive
301+
(Parraysets (gen_array_set_kind (get_first_arg_mode ()), Ptagged_int_index),
302+
3)
303+
| "%array_unsafe_get" ->
304+
Primitive
305+
(Parrayrefu (gen_array_ref_kind mode, Ptagged_int_index), 2)
300306
| "%array_unsafe_set" ->
301-
Primitive ((Parraysetu (gen_array_set_kind (get_first_arg_mode ()))), 3)
307+
Primitive
308+
((Parraysetu (gen_array_set_kind (get_first_arg_mode ()), Ptagged_int_index)),
309+
3)
310+
| "%array_safe_get_indexed_by_int64#" ->
311+
Primitive
312+
((Parrayrefs (gen_array_ref_kind mode, Punboxed_int_index Pint64)), 2)
313+
| "%array_safe_set_indexed_by_int64#" ->
314+
Primitive
315+
(Parraysets
316+
(gen_array_set_kind (get_first_arg_mode ()), Punboxed_int_index Pint64),
317+
3)
318+
| "%array_unsafe_get_indexed_by_int64#" ->
319+
Primitive
320+
(Parrayrefu (gen_array_ref_kind mode, Punboxed_int_index Pint64), 2)
321+
| "%array_unsafe_set_indexed_by_int64#" ->
322+
Primitive
323+
((Parraysetu
324+
(gen_array_set_kind (get_first_arg_mode ()), Punboxed_int_index Pint64)),
325+
3)
326+
| "%array_safe_get_indexed_by_int32#" ->
327+
Primitive
328+
((Parrayrefs (gen_array_ref_kind mode, Punboxed_int_index Pint32)), 2)
329+
| "%array_safe_set_indexed_by_int32#" ->
330+
Primitive
331+
(Parraysets
332+
(gen_array_set_kind (get_first_arg_mode ()), Punboxed_int_index Pint32),
333+
3)
334+
| "%array_unsafe_get_indexed_by_int32#" ->
335+
Primitive
336+
(Parrayrefu (gen_array_ref_kind mode, Punboxed_int_index Pint32), 2)
337+
| "%array_unsafe_set_indexed_by_int32#" ->
338+
Primitive
339+
((Parraysetu
340+
(gen_array_set_kind (get_first_arg_mode ()), Punboxed_int_index Pint32)),
341+
3)
342+
| "%array_safe_get_indexed_by_nativeint#" ->
343+
Primitive
344+
((Parrayrefs (gen_array_ref_kind mode, Punboxed_int_index Pnativeint)), 2)
345+
| "%array_safe_set_indexed_by_nativeint#" ->
346+
Primitive
347+
(Parraysets
348+
(gen_array_set_kind (get_first_arg_mode ()), Punboxed_int_index Pnativeint),
349+
3)
350+
| "%array_unsafe_get_indexed_by_nativeint#" ->
351+
Primitive
352+
(Parrayrefu (gen_array_ref_kind mode, Punboxed_int_index Pnativeint), 2)
353+
| "%array_unsafe_set_indexed_by_nativeint#" ->
354+
Primitive
355+
((Parraysetu
356+
(gen_array_set_kind (get_first_arg_mode ()), Punboxed_int_index Pnativeint)),
357+
3)
302358
| "%obj_size" -> Primitive ((Parraylength Pgenarray), 1)
303-
| "%obj_field" -> Primitive ((Parrayrefu (Pgenarray_ref mode)), 2)
359+
| "%obj_field" -> Primitive ((Parrayrefu (Pgenarray_ref mode, Ptagged_int_index)), 2)
304360
| "%obj_set_field" ->
305-
Primitive ((Parraysetu (Pgenarray_set (get_first_arg_mode ()))), 3)
361+
Primitive
362+
((Parraysetu (Pgenarray_set (get_first_arg_mode ()), Ptagged_int_index)), 3)
306363
| "%floatarray_length" -> Primitive ((Parraylength Pfloatarray), 1)
307364
| "%floatarray_safe_get" ->
308-
Primitive ((Parrayrefs (Pfloatarray_ref mode)), 2)
309-
| "%floatarray_safe_set" -> Primitive (Parraysets Pfloatarray_set, 3)
365+
Primitive ((Parrayrefs (Pfloatarray_ref mode, Ptagged_int_index)), 2)
366+
| "%floatarray_safe_set" ->
367+
Primitive (Parraysets (Pfloatarray_set, Ptagged_int_index), 3)
310368
| "%floatarray_unsafe_get" ->
311-
Primitive ((Parrayrefu (Pfloatarray_ref mode)), 2)
312-
| "%floatarray_unsafe_set" -> Primitive ((Parraysetu Pfloatarray_set), 3)
369+
Primitive ((Parrayrefu (Pfloatarray_ref mode, Ptagged_int_index)), 2)
370+
| "%floatarray_unsafe_set" ->
371+
Primitive ((Parraysetu (Pfloatarray_set, Ptagged_int_index)), 3)
313372
| "%obj_is_int" -> Primitive (Pisint { variant_only = false }, 1)
314373
| "%lazy_force" -> Lazy_force pos
315374
| "%nativeint_of_int" -> Primitive ((Pbintofint (Pnativeint, mode)), 1)
@@ -807,26 +866,26 @@ let specialize_primitive env loc ty ~has_constant_constructor prim =
807866
if t = array_type then None
808867
else Some (Primitive (Parraylength array_type, arity))
809868
end
810-
| Primitive (Parrayrefu rt, arity), p1 :: _ -> begin
869+
| Primitive (Parrayrefu (rt, index_kind), arity), p1 :: _ -> begin
811870
let array_ref_type = glb_array_ref_type (to_location loc) rt (array_type_kind env p1)
812871
in
813872
if rt = array_ref_type then None
814-
else Some (Primitive (Parrayrefu array_ref_type, arity))
873+
else Some (Primitive (Parrayrefu (array_ref_type, index_kind), arity))
815874
end
816-
| Primitive (Parraysetu st, arity), p1 :: _ -> begin
875+
| Primitive (Parraysetu (st, index_kind), arity), p1 :: _ -> begin
817876
let array_set_type = glb_array_set_type (to_location loc) st (array_type_kind env p1) in
818877
if st = array_set_type then None
819-
else Some (Primitive (Parraysetu array_set_type, arity))
878+
else Some (Primitive (Parraysetu (array_set_type, index_kind), arity))
820879
end
821-
| Primitive (Parrayrefs rt, arity), p1 :: _ -> begin
880+
| Primitive (Parrayrefs (rt, index_kind), arity), p1 :: _ -> begin
822881
let array_ref_type = glb_array_ref_type (to_location loc) rt (array_type_kind env p1) in
823882
if rt = array_ref_type then None
824-
else Some (Primitive (Parrayrefs array_ref_type, arity))
883+
else Some (Primitive (Parrayrefs (array_ref_type, index_kind), arity))
825884
end
826-
| Primitive (Parraysets st, arity), p1 :: _ -> begin
885+
| Primitive (Parraysets (st, index_kind), arity), p1 :: _ -> begin
827886
let array_set_type = glb_array_set_type (to_location loc) st (array_type_kind env p1) in
828887
if st = array_set_type then None
829-
else Some (Primitive (Parraysets array_set_type, arity))
888+
else Some (Primitive (Parraysets (array_set_type, index_kind), arity))
830889
end
831890
| Primitive (Pbigarrayref(unsafe, n, Pbigarray_unknown,
832891
Pbigarray_unknown_layout), arity), p1 :: _ -> begin
@@ -1293,7 +1352,7 @@ let lambda_primitive_needs_event_after = function
12931352
| Pmulfloat (_, _) | Pdivfloat (_, _)
12941353
| Pstringrefs | Pbytesrefs
12951354
| Pbytessets | Pmakearray (Pgenarray, _, _) | Pduparray _
1296-
| Parrayrefu (Pgenarray_ref _ | Pfloatarray_ref _)
1355+
| Parrayrefu ((Pgenarray_ref _ | Pfloatarray_ref _), _)
12971356
| Parrayrefs _ | Parraysets _ | Pbintofint _ | Pcvtbint _ | Pnegbint _
12981357
| Paddbint _ | Psubbint _ | Pmulbint _ | Pdivbint _ | Pmodbint _ | Pandbint _
12991358
| Porbint _ | Pxorbint _ | Plslbint _ | Plsrbint _ | Pasrbint _

middle_end/convert_primitives.ml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive =
9999
| Pmakearray (kind, mutability, mode) -> Pmakearray (kind, mutability, mode)
100100
| Pduparray (kind, mutability) -> Pduparray (kind, mutability)
101101
| Parraylength kind -> Parraylength kind
102-
| Parrayrefu rkind -> Parrayrefu rkind
103-
| Parraysetu skind -> Parraysetu skind
104-
| Parrayrefs rkind -> Parrayrefs rkind
105-
| Parraysets skind -> Parraysets skind
102+
| Parrayrefu (rkind, Ptagged_int_index) -> Parrayrefu rkind
103+
| Parraysetu (skind, Ptagged_int_index) -> Parraysetu skind
104+
| Parrayrefs (rkind, Ptagged_int_index) -> Parrayrefs rkind
105+
| Parraysets (skind, Ptagged_int_index) -> Parraysets skind
106106
| Pisint _ -> Pisint
107107
| Pisout -> Pisout
108108
| Pcvtbint (src, dest, m) -> Pcvtbint (src, dest, m)
@@ -219,6 +219,10 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive =
219219
| Punboxed_int32_array_set_128 _
220220
| Punboxed_int64_array_set_128 _
221221
| Punboxed_nativeint_array_set_128 _
222+
| Parrayrefu (_, Punboxed_int_index _)
223+
| Parraysetu (_, Punboxed_int_index _)
224+
| Parrayrefs (_, Punboxed_int_index _)
225+
| Parraysets (_, Punboxed_int_index _)
222226
->
223227
Misc.fatal_errorf "lambda primitive %a can't be converted to \
224228
clambda primitive"

0 commit comments

Comments
 (0)