Skip to content

Commit 4650c76

Browse files
mshinwelllthls
andauthored
Fix Flambda 2 typing for immutable arrays (#1457)
Co-authored-by: Vincent Laviron <[email protected]>
1 parent 5df344a commit 4650c76

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

middle_end/flambda2/types/meet_and_join.ml

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ and meet_head_of_kind_value env (head1 : TG.head_of_kind_value)
393393
let element_kind = meet_array_element_kinds element_kind1 element_kind2 in
394394
let<* contents, env_extension =
395395
meet_array_contents env array_contents1 array_contents2
396+
~meet_element_kind:element_kind
396397
in
397398
let<* length, env_extension' = meet env length1 length2 in
398399
(* CR-someday vlaviron: If the element kind is Bottom, we could meet the
@@ -410,7 +411,8 @@ and meet_head_of_kind_value env (head1 : TG.head_of_kind_value)
410411
Bottom
411412

412413
and meet_array_contents env (array_contents1 : TG.array_contents Or_unknown.t)
413-
(array_contents2 : TG.array_contents Or_unknown.t) =
414+
(array_contents2 : TG.array_contents Or_unknown.t)
415+
~(meet_element_kind : _ Or_unknown_or_bottom.t) =
414416
meet_unknown
415417
(fun env (array_contents1 : TG.array_contents)
416418
(array_contents2 : TG.array_contents) :
@@ -429,7 +431,20 @@ and meet_array_contents env (array_contents1 : TG.array_contents Or_unknown.t)
429431
let<* fields_rev, env_extension' =
430432
fields_rev_and_env_extension
431433
in
432-
let<* field, env_extension = meet env field1 field2 in
434+
let<* field, env_extension =
435+
match meet_element_kind with
436+
| Bottom -> Bottom
437+
| Unknown ->
438+
(* vlaviron: If the meet of the kinds is Unknown, then both
439+
inputs had Unknown kinds. I don't see how we could end up
440+
with an array type where the contents are known but we
441+
don't know the kind, but in that case we wouldn't be able
442+
to call meet because the two sides may have different
443+
kinds. So we'll just return the first input, which is
444+
guaranteed to be a correct approximation of the meet. *)
445+
Ok (field1, TEE.empty)
446+
| Ok _ -> meet env field1 field2
447+
in
433448
let<+ env_extension =
434449
meet_env_extension env env_extension env_extension'
435450
in
@@ -1186,7 +1201,10 @@ and join_head_of_kind_value env (head1 : TG.head_of_kind_value)
11861201
} ) ->
11871202
let alloc_mode = join_alloc_mode alloc_mode1 alloc_mode2 in
11881203
let element_kind = join_array_element_kinds element_kind1 element_kind2 in
1189-
let contents = join_array_contents env array_contents1 array_contents2 in
1204+
let contents =
1205+
join_array_contents env array_contents1 array_contents2
1206+
~joined_element_kind:element_kind
1207+
in
11901208
let>+ length = join env length1 length2 in
11911209
TG.Head_of_kind_value.create_array_with_contents ~element_kind ~length
11921210
contents alloc_mode
@@ -1196,7 +1214,8 @@ and join_head_of_kind_value env (head1 : TG.head_of_kind_value)
11961214
Unknown
11971215

11981216
and join_array_contents env (array_contents1 : TG.array_contents Or_unknown.t)
1199-
(array_contents2 : TG.array_contents Or_unknown.t) =
1217+
(array_contents2 : TG.array_contents Or_unknown.t)
1218+
~(joined_element_kind : _ Or_unknown_or_bottom.t) =
12001219
join_unknown
12011220
(fun env (array_contents1 : TG.array_contents)
12021221
(array_contents2 : TG.array_contents) : TG.array_contents Or_unknown.t ->
@@ -1211,7 +1230,11 @@ and join_array_contents env (array_contents1 : TG.array_contents Or_unknown.t)
12111230
List.fold_left2
12121231
(fun (fields_rev : _ Or_unknown.t) field1 field2 : _ Or_unknown.t ->
12131232
let>* fields_rev = fields_rev in
1214-
let>+ field = join env field1 field2 in
1233+
let>+ field =
1234+
match joined_element_kind with
1235+
| Bottom | Unknown -> Or_unknown.Unknown
1236+
| Ok _ -> join env field1 field2
1237+
in
12151238
field :: fields_rev)
12161239
(Or_unknown.Known []) fields1 fields2
12171240
in

0 commit comments

Comments
 (0)