Skip to content

Commit e89c6a6

Browse files
authored
Revert "Ensure consistent variable binding times (#3217)" (#3278)
This reverts commit 40c4705. The implementation in #3217 makes some wrong assumptions and merely hides the underlying bug, it does not fix it. Since this should only cause missed optimizations at worse, let's revert until we figure out a proper fix rather than stacking band-aids. More precisely, the implementation in #3217 assumes that shared prefixes in environments are created before forking the environment, i.e. that the history looks like this, with a single definition for each variable: ``` fork <-------------\ | \ define a | | | define b +--- join arguments / | \ | / | \ | use1 use2 use3 | ^ ^ ^ / +-----+-----+----------/ ``` In practice this does not hold, and variables can be defined multiple times in distinct environments -- causing them to have multiple binding times globally.
1 parent ab4ddf8 commit e89c6a6

File tree

3 files changed

+20
-30
lines changed

3 files changed

+20
-30
lines changed

middle_end/flambda2/types/env/typing_env.ml

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,7 @@ type t =
113113
(* [prev_levels] is sorted with the greatest scope at the head of the
114114
list *)
115115
current_level : One_level.t;
116-
next_binding_time : Binding_time.t ref;
117-
(* [next_binding_time] is a reference shared by all related environments to
118-
the latest binding time ever used. Used to ensure consistent binding
119-
times between variables defined in parallel branches. *)
116+
next_binding_time : Binding_time.t;
120117
min_binding_time : Binding_time.t;
121118
(* Earlier variables have mode In_types *)
122119
is_bottom : bool
@@ -388,7 +385,7 @@ let create ~resolver ~get_imported_names =
388385
to allow an efficient implementation of [cut] (see below), we always
389386
increment the scope by one here. *)
390387
current_level = One_level.create_empty (Scope.next Scope.initial);
391-
next_binding_time = ref Binding_time.earliest_var;
388+
next_binding_time = Binding_time.earliest_var;
392389
defined_symbols = Symbol.Set.empty;
393390
code_age_relation = Code_age_relation.empty;
394391
min_binding_time = Binding_time.earliest_var;
@@ -623,14 +620,17 @@ let alias_is_bound_strictly_earlier t ~bound_name ~alias =
623620

624621
let with_current_level t ~current_level = { t with current_level }
625622

623+
let with_current_level_and_next_binding_time t ~current_level next_binding_time
624+
=
625+
{ t with current_level; next_binding_time }
626+
626627
let with_aliases t ~aliases =
627628
let current_level = One_level.with_aliases t.current_level ~aliases in
628629
with_current_level t ~current_level
629630

630631
let cached t = One_level.just_after_level t.current_level
631632

632-
let add_variable_definition_with_binding_time ~binding_time t var kind name_mode
633-
=
633+
let add_variable_definition t var kind name_mode =
634634
(* We can add equations in our own compilation unit on variables and symbols
635635
defined in another compilation unit. However we can't define other
636636
compilation units' variables or symbols (except for predefined symbols such
@@ -644,28 +644,24 @@ let add_variable_definition_with_binding_time ~binding_time t var kind name_mode
644644
%a@ in environment:@ %a"
645645
Variable.print var print t;
646646
let name = Name.var var in
647-
if Flambda_features.check_light_invariants () && mem t name
647+
if Flambda_features.check_invariants () && mem t name
648648
then
649649
Misc.fatal_errorf "Cannot rebind %a in environment:@ %a" Name.print name
650650
print t;
651651
let level =
652-
TEL.add_definition (One_level.level t.current_level) var kind binding_time
652+
TEL.add_definition
653+
(One_level.level t.current_level)
654+
var kind t.next_binding_time
653655
in
654656
let just_after_level =
655657
Cached_level.add_or_replace_binding (cached t) name (MTC.unknown kind)
656-
binding_time name_mode
658+
t.next_binding_time name_mode
657659
in
658660
let current_level =
659661
One_level.create (current_scope t) level ~just_after_level
660662
in
661-
with_current_level t ~current_level
662-
663-
let get_next_binding_time t = !(t.next_binding_time)
664-
665-
let add_variable_definition t var kind name_mode =
666-
let binding_time = get_next_binding_time t in
667-
t.next_binding_time := Binding_time.succ binding_time;
668-
add_variable_definition_with_binding_time ~binding_time t var kind name_mode
663+
with_current_level_and_next_binding_time t ~current_level
664+
(Binding_time.succ t.next_binding_time)
669665

670666
let add_symbol_definition t sym =
671667
(* CR-someday mshinwell: check for redefinition when invariants enabled? *)
@@ -962,9 +958,7 @@ and add_env_extension_with_extra_variables t
962958
let add_env_extension_from_level t level ~meet_type : t =
963959
let t =
964960
TEL.fold_on_defined_vars
965-
(fun ~binding_time var kind t ->
966-
add_variable_definition_with_binding_time ~binding_time t var kind
967-
Name_mode.in_types)
961+
(fun var kind t -> add_variable_definition t var kind Name_mode.in_types)
968962
level t
969963
in
970964
let t =
@@ -1198,7 +1192,7 @@ let compute_joined_aliases base_env alias_candidates envs_at_uses =
11981192
with_aliases base_env ~aliases:new_aliases
11991193

12001194
let closure_env t =
1201-
increment_scope { t with min_binding_time = get_next_binding_time t }
1195+
increment_scope { t with min_binding_time = t.next_binding_time }
12021196

12031197
let rec free_names_transitive_of_type_of_name t name ~result =
12041198
let result = Name_occurrences.add_name result name Name_mode.in_types in

middle_end/flambda2/types/env/typing_env_level.ml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@ let [@ocamlformat "disable"] print ppf
6969

7070
let fold_on_defined_vars f t init =
7171
Binding_time.Map.fold
72-
(fun bt vars acc ->
72+
(fun _bt vars acc ->
7373
Variable.Set.fold
7474
(fun var acc ->
7575
let kind = Variable.Map.find var t.defined_vars in
76-
f ~binding_time:bt var kind acc)
76+
f var kind acc)
7777
vars acc)
7878
t.binding_times init
7979

@@ -113,8 +113,7 @@ let add_symbol_projection t var proj =
113113
{ t with symbol_projections }
114114

115115
let add_definition t var kind binding_time =
116-
if Flambda_features.check_light_invariants ()
117-
&& Variable.Map.mem var t.defined_vars
116+
if Flambda_features.check_invariants () && Variable.Map.mem var t.defined_vars
118117
then
119118
Misc.fatal_errorf "Environment extension already binds variable %a:@ %a"
120119
Variable.print var print t;

middle_end/flambda2/types/env/typing_env_level.mli

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,6 @@ val variables_by_binding_time : t -> Variable.Set.t Binding_time.Map.t
5858
val variable_is_defined : t -> Variable.t -> bool
5959

6060
val fold_on_defined_vars :
61-
(binding_time:Binding_time.t -> Variable.t -> Flambda_kind.t -> 'a -> 'a) ->
62-
t ->
63-
'a ->
64-
'a
61+
(Variable.t -> Flambda_kind.t -> 'a -> 'a) -> t -> 'a -> 'a
6562

6663
val as_extension_without_bindings : t -> Type_grammar.Env_extension.t

0 commit comments

Comments
 (0)