Skip to content

Commit cffb9cc

Browse files
authored
Fix simplification of never_return applications (#2142)
1 parent cb3ac37 commit cffb9cc

File tree

3 files changed

+26
-37
lines changed

3 files changed

+26
-37
lines changed

middle_end/flambda2/simplify/expr_builder.ml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -830,9 +830,14 @@ let rewrite_fixed_arity_apply uacc ~use_id arity apply =
830830
in
831831
uacc, RE.create_apply (UA.are_rebuilding_terms uacc) apply
832832
in
833-
match Apply.continuation apply with
834-
| Never_returns -> make_apply apply
835-
| Return cont ->
833+
match use_id, Apply.continuation apply with
834+
| _, Never_returns -> make_apply apply
835+
| None, Return _ ->
836+
Misc.fatal_errorf
837+
"Expr_builder.rewrite_fixed_arity_apply: got no use_id for the return continuation but the apply \
838+
could return:@ %a@."
839+
Apply.print apply
840+
| Some use_id, Return cont ->
836841
rewrite_fixed_arity_continuation uacc cont ~use_id arity
837842
~around:(fun uacc return_cont ->
838843
let exn_cont =

middle_end/flambda2/simplify/expr_builder.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ val rewrite_switch_arm :
138138

139139
val rewrite_fixed_arity_apply :
140140
Upwards_acc.t ->
141-
use_id:Apply_cont_rewrite_id.t ->
141+
use_id:Apply_cont_rewrite_id.t option ->
142142
[`Unarized] Flambda_arity.t ->
143143
Apply.t ->
144144
Upwards_acc.t * Rebuilt_expr.t

middle_end/flambda2/simplify/simplify_apply_expr.ml

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -179,15 +179,7 @@ let rebuild_non_inlined_direct_full_application apply ~use_id ~exn_cont_use_id
179179
* in *)
180180
let apply = if erase_callee then Apply.erase_callee apply else apply in
181181
let uacc, expr =
182-
match use_id with
183-
| None ->
184-
let uacc =
185-
UA.add_free_names uacc (Apply.free_names apply)
186-
|> UA.notify_added ~code_size:(Code_size.apply apply)
187-
in
188-
uacc, RE.create_apply (UA.are_rebuilding_terms uacc) apply
189-
| Some use_id ->
190-
EB.rewrite_fixed_arity_apply uacc ~use_id result_arity apply
182+
EB.rewrite_fixed_arity_apply uacc ~use_id result_arity apply
191183
in
192184
after_rebuild expr uacc
193185

@@ -861,12 +853,6 @@ let rebuild_function_call_where_callee's_type_unavailable apply call_kind
861853
let simplify_function_call_where_callee's_type_unavailable dacc apply
862854
(call : Call_kind.Function_call.t) ~apply_alloc_mode ~down_to_up =
863855
fail_if_probe apply;
864-
let cont =
865-
match Apply.continuation apply with
866-
| Never_returns ->
867-
Misc.fatal_error "cannot simplify an application that never returns"
868-
| Return continuation -> continuation
869-
in
870856
let denv = DA.denv dacc in
871857
if Are_rebuilding_terms.are_rebuilding (DE.are_rebuilding_terms denv)
872858
then
@@ -875,6 +861,18 @@ let simplify_function_call_where_callee's_type_unavailable dacc apply
875861
~tracker:(DE.inlining_history_tracker denv)
876862
~apply ();
877863
let env_at_use = denv in
864+
let dacc, use_id =
865+
match Apply.continuation apply with
866+
| Never_returns -> dacc, None
867+
| Return continuation ->
868+
let dacc, use_id =
869+
DA.record_continuation_use dacc continuation
870+
(Non_inlinable { escaping = true })
871+
~env_at_use
872+
~arg_types:(T.unknown_types_from_arity (Apply.return_arity apply))
873+
in
874+
dacc, Some use_id
875+
in
878876
let dacc, exn_cont_use_id =
879877
DA.record_continuation_use dacc
880878
(Exn_continuation.exn_handler (Apply.exn_continuation apply))
@@ -884,12 +882,6 @@ let simplify_function_call_where_callee's_type_unavailable dacc apply
884882
(T.unknown_types_from_arity
885883
(Exn_continuation.arity (Apply.exn_continuation apply)))
886884
in
887-
let dacc, use_id =
888-
DA.record_continuation_use dacc cont
889-
(Non_inlinable { escaping = true })
890-
~env_at_use
891-
~arg_types:(T.unknown_types_from_arity (Apply.return_arity apply))
892-
in
893885
let call_kind =
894886
match call with
895887
| Indirect_unknown_arity ->
@@ -903,8 +895,7 @@ let simplify_function_call_where_callee's_type_unavailable dacc apply
903895
Call_kind.indirect_function_call_known_arity apply_alloc_mode
904896
in
905897
let dacc =
906-
record_free_names_of_apply_as_used ~use_id:(Some use_id) ~exn_cont_use_id
907-
dacc apply
898+
record_free_names_of_apply_as_used ~use_id ~exn_cont_use_id dacc apply
908899
in
909900
down_to_up dacc
910901
~rebuild:
@@ -1049,7 +1040,8 @@ let rebuild_method_call apply ~use_id ~exn_cont_use_id uacc ~after_rebuild =
10491040
apply
10501041
in
10511042
let uacc, expr =
1052-
EB.rewrite_fixed_arity_apply uacc ~use_id (Apply.return_arity apply) apply
1043+
EB.rewrite_fixed_arity_apply uacc ~use_id:(Some use_id)
1044+
(Apply.return_arity apply) apply
10531045
in
10541046
after_rebuild expr uacc
10551047

@@ -1108,15 +1100,7 @@ let rebuild_c_call apply ~use_id ~exn_cont_use_id ~return_arity uacc
11081100
apply
11091101
in
11101102
let uacc, expr =
1111-
match use_id with
1112-
| Some use_id ->
1113-
EB.rewrite_fixed_arity_apply uacc ~use_id return_arity apply
1114-
| None ->
1115-
let uacc =
1116-
UA.add_free_names uacc (Apply.free_names apply)
1117-
|> UA.notify_added ~code_size:(Code_size.apply apply)
1118-
in
1119-
uacc, RE.create_apply (UA.are_rebuilding_terms uacc) apply
1103+
EB.rewrite_fixed_arity_apply uacc ~use_id return_arity apply
11201104
in
11211105
after_rebuild expr uacc
11221106

0 commit comments

Comments
 (0)