diff options
author | Mark Shinwell <mshinwell@gmail.com> | 2016-02-08 14:05:38 +0100 |
---|---|---|
committer | Mark Shinwell <mshinwell@gmail.com> | 2016-02-09 09:59:26 +0100 |
commit | a3975110317da9b47b018f60fdb57236e8db9f12 (patch) | |
tree | 55b067c9c19f128a35fc6d5a89228255855ae646 /middle_end/lift_constants.ml | |
parent | ec190a03a3e33acee42aea7f27a931ff70d3216f (diff) | |
download | ocaml-a3975110317da9b47b018f60fdb57236e8db9f12.tar.gz |
Import latest Flambda changes
Diffstat (limited to 'middle_end/lift_constants.ml')
-rw-r--r-- | middle_end/lift_constants.ml | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/middle_end/lift_constants.ml b/middle_end/lift_constants.ml index c3beb9d9bd..4ceefb14be 100644 --- a/middle_end/lift_constants.ml +++ b/middle_end/lift_constants.ml @@ -142,13 +142,14 @@ let assign_symbols_and_collect_constant_definitions in collect_let_and_initialize_symbols program.program_body; let record_set_of_closure_equalities (set_of_closures:Flambda.set_of_closures) = - Variable.Map.iter (fun arg var -> + Variable.Map.iter (fun arg (var : Flambda.specialised_to) -> if not (Inconstant_idents.variable arg inconstants) then - Variable.Tbl.add var_to_definition_tbl arg (AA.Variable var)) + Variable.Tbl.add var_to_definition_tbl arg (AA.Variable var.var)) set_of_closures.free_vars; - Variable.Map.iter (fun arg var -> + Variable.Map.iter (fun arg (spec_to : Flambda.specialised_to) -> if not (Inconstant_idents.variable arg inconstants) then - Variable.Tbl.add var_to_definition_tbl arg (AA.Variable var)) + Variable.Tbl.add var_to_definition_tbl arg + (AA.Variable spec_to.var)) set_of_closures.specialised_args in Flambda_iterators.iter_on_set_of_closures_of_program program @@ -618,7 +619,7 @@ let introduce_free_variables_in_set_of_closures | exception Not_found -> var | external_var -> (* specialised arguments bound to constant can be rewritten *) - external_var + external_var.var in match Variable.Tbl.find var_to_block_field_tbl searched_var with | def -> @@ -671,14 +672,20 @@ let introduce_free_variables_in_set_of_closures keep) free_vars in + let free_vars = + Flambda_utils.clean_projections ~which_variables:free_vars + in let specialised_args = (* Keep only those that are not rewritten to constants. *) - Variable.Map.filter (fun _ v -> - let keep = not (Variable.Tbl.mem var_to_block_field_tbl v) in + Variable.Map.filter (fun _ (spec_to : Flambda.specialised_to) -> + let keep = not (Variable.Tbl.mem var_to_block_field_tbl spec_to.var) in if not keep then done_something := true; keep) specialised_args in + let specialised_args = + Flambda_utils.clean_projections ~which_variables:specialised_args + in if not !done_something then set_of_closures else |