|
22 | 22 | * along with this program; if not, write to the Free Software
|
23 | 23 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *)
|
24 | 24 |
|
25 |
| - |
26 |
| - |
27 |
| - |
28 |
| - |
29 |
| - |
30 |
| - |
31 |
| - |
32 |
| - |
33 |
| - |
34 | 25 | (*
|
35 | 26 | A naive beta reduce would break the invariants of the optmization.
|
36 | 27 |
|
|
53 | 44 | ]}
|
54 | 45 | we can bound [x] to [100] in a single step
|
55 | 46 | *)
|
56 |
| -let propogate_beta_reduce |
57 |
| - (meta : Lam_stats.t) (params : Ident.t list) (body : Lam.t) (args : Lam.t list) = |
58 |
| - match Lam_beta_reduce_util.simple_beta_reduce params body args with |
59 |
| - | Some x -> x |
60 |
| - | None -> |
61 |
| - let rest_bindings, rev_new_params = |
62 |
| - Ext_list.fold_left2 params args ([],[]) (fun old_param arg (rest_bindings, acc) -> |
63 |
| - match arg with |
64 |
| - | Lconst _ |
65 |
| - | Lvar _ -> rest_bindings , arg :: acc |
66 |
| - | _ -> |
67 |
| - let p = Ident.rename old_param in |
68 |
| - (p,arg) :: rest_bindings , (Lam.var p) :: acc |
69 |
| - ) in |
70 |
| - let new_body = Lam_bounded_vars.rewrite (Hash_ident.of_list2 (List.rev params) (rev_new_params)) body in |
71 |
| - Ext_list.fold_right rest_bindings new_body |
72 |
| - (fun (param, arg ) l -> |
73 |
| - begin match arg with |
74 |
| - | Lprim {primitive = Pmakeblock (_, _, Immutable) ;args ; _} -> |
75 |
| - Hash_ident.replace meta.ident_tbl param |
76 |
| - (Lam_util.kind_of_lambda_block args ) |
77 |
| - | Lprim {primitive = Psome | Psome_not_nest; args = [v]; _} -> |
78 |
| - Hash_ident.replace meta.ident_tbl param |
79 |
| - (Normal_optional(v)) |
80 |
| - | _ -> () end; |
81 |
| - Lam_util.refine_let ~kind:Strict param arg l) |
82 |
| - |
83 |
| - |
84 |
| -let propogate_beta_reduce_with_map |
85 |
| - (meta : Lam_stats.t) (map : Lam_var_stats.stats Map_ident.t ) params body args = |
| 47 | +let propogate_beta_reduce (meta : Lam_stats.t) (params : Ident.t list) |
| 48 | + (body : Lam.t) (args : Lam.t list) = |
86 | 49 | match Lam_beta_reduce_util.simple_beta_reduce params body args with
|
87 | 50 | | Some x -> x
|
88 | 51 | | None ->
|
89 |
| - let rest_bindings, rev_new_params = |
90 |
| - Ext_list.fold_left2 params args ([],[]) |
91 |
| - (fun old_param arg (rest_bindings, acc) -> |
92 |
| - match arg with |
93 |
| - | Lconst _ |
94 |
| - | Lvar _ -> rest_bindings , arg :: acc |
95 |
| - | Lglobal_module _ |
96 |
| - -> |
97 |
| - let p = Ident.rename old_param in |
98 |
| - (p,arg) :: rest_bindings , (Lam.var p) :: acc |
99 |
| - |
100 |
| - | _ -> |
101 |
| - if Lam_analysis.no_side_effects arg then |
102 |
| - match Map_ident.find_exn map old_param with |
103 |
| - | stat -> |
104 |
| - if Lam_var_stats.top_and_used_zero_or_one stat then |
105 |
| - rest_bindings, arg :: acc |
106 |
| - else |
107 |
| - let p = Ident.rename old_param in |
108 |
| - (p,arg) :: rest_bindings , (Lam.var p) :: acc |
109 |
| - else |
110 |
| - let p = Ident.rename old_param in |
111 |
| - (p,arg) :: rest_bindings , (Lam.var p) :: acc ) in |
112 |
| - let new_body = Lam_bounded_vars.rewrite (Hash_ident.of_list2 (List.rev params) (rev_new_params)) body in |
113 |
| - Ext_list.fold_right rest_bindings new_body |
114 |
| - (fun (param, (arg : Lam.t)) l -> |
115 |
| - begin match arg with |
116 |
| - | Lprim {primitive = Pmakeblock (_, _, Immutable ) ; args} -> |
117 |
| - Hash_ident.replace meta.ident_tbl param |
118 |
| - (Lam_util.kind_of_lambda_block args ) |
119 |
| - |
120 |
| - | Lprim {primitive = Psome | Psome_not_nest; args = [v]} -> |
121 |
| - Hash_ident.replace meta.ident_tbl param |
122 |
| - (Normal_optional(v)); |
123 |
| - |
124 |
| - | _ -> () end; |
125 |
| - Lam_util.refine_let ~kind:Strict param arg l) |
126 |
| - |
127 |
| - |
128 |
| - |
| 52 | + let rest_bindings, rev_new_params = |
| 53 | + Ext_list.fold_left2 params args ([], []) |
| 54 | + (fun old_param arg (rest_bindings, acc) -> |
| 55 | + match arg with |
| 56 | + | Lconst _ | Lvar _ -> (rest_bindings, arg :: acc) |
| 57 | + | _ -> |
| 58 | + let p = Ident.rename old_param in |
| 59 | + ((p, arg) :: rest_bindings, Lam.var p :: acc)) |
| 60 | + in |
| 61 | + let new_body = |
| 62 | + Lam_bounded_vars.rewrite |
| 63 | + (Hash_ident.of_list2 (List.rev params) rev_new_params) |
| 64 | + body |
| 65 | + in |
| 66 | + Ext_list.fold_right rest_bindings new_body (fun (param, arg) l -> |
| 67 | + (match arg with |
| 68 | + | Lprim { primitive = Pmakeblock (_, _, Immutable); args; _ } -> |
| 69 | + Hash_ident.replace meta.ident_tbl param |
| 70 | + (Lam_util.kind_of_lambda_block args) |
| 71 | + | Lprim { primitive = Psome | Psome_not_nest; args = [ v ]; _ } -> |
| 72 | + Hash_ident.replace meta.ident_tbl param (Normal_optional v) |
| 73 | + | _ -> ()); |
| 74 | + Lam_util.refine_let ~kind:Strict param arg l) |
| 75 | + |
| 76 | +let propogate_beta_reduce_with_map (meta : Lam_stats.t) |
| 77 | + (map : Lam_var_stats.stats Map_ident.t) params body args = |
| 78 | + match Lam_beta_reduce_util.simple_beta_reduce params body args with |
| 79 | + | Some x -> x |
| 80 | + | None -> |
| 81 | + let rest_bindings, rev_new_params = |
| 82 | + Ext_list.fold_left2 params args ([], []) |
| 83 | + (fun old_param arg (rest_bindings, acc) -> |
| 84 | + match arg with |
| 85 | + | Lconst _ | Lvar _ -> (rest_bindings, arg :: acc) |
| 86 | + | Lglobal_module _ -> |
| 87 | + let p = Ident.rename old_param in |
| 88 | + ((p, arg) :: rest_bindings, Lam.var p :: acc) |
| 89 | + | _ -> |
| 90 | + if Lam_analysis.no_side_effects arg then |
| 91 | + match Map_ident.find_exn map old_param with |
| 92 | + | stat -> |
| 93 | + if Lam_var_stats.top_and_used_zero_or_one stat then |
| 94 | + (rest_bindings, arg :: acc) |
| 95 | + else |
| 96 | + let p = Ident.rename old_param in |
| 97 | + ((p, arg) :: rest_bindings, Lam.var p :: acc) |
| 98 | + else |
| 99 | + let p = Ident.rename old_param in |
| 100 | + ((p, arg) :: rest_bindings, Lam.var p :: acc)) |
| 101 | + in |
| 102 | + let new_body = |
| 103 | + Lam_bounded_vars.rewrite |
| 104 | + (Hash_ident.of_list2 (List.rev params) rev_new_params) |
| 105 | + body |
| 106 | + in |
| 107 | + Ext_list.fold_right rest_bindings new_body |
| 108 | + (fun (param, (arg : Lam.t)) l -> |
| 109 | + (match arg with |
| 110 | + | Lprim { primitive = Pmakeblock (_, _, Immutable); args } -> |
| 111 | + Hash_ident.replace meta.ident_tbl param |
| 112 | + (Lam_util.kind_of_lambda_block args) |
| 113 | + | Lprim { primitive = Psome | Psome_not_nest; args = [ v ] } -> |
| 114 | + Hash_ident.replace meta.ident_tbl param (Normal_optional v) |
| 115 | + | _ -> ()); |
| 116 | + Lam_util.refine_let ~kind:Strict param arg l) |
129 | 117 |
|
130 | 118 | let no_names_beta_reduce params body args =
|
131 |
| - match Lam_beta_reduce_util.simple_beta_reduce params body args with |
132 |
| - | Some x -> x |
133 |
| - | None -> |
134 |
| - Ext_list.fold_left2 params args body |
135 |
| - (fun param arg l -> |
136 |
| - Lam_util.refine_let ~kind:Strict param arg l) |
137 |
| - |
| 119 | + match Lam_beta_reduce_util.simple_beta_reduce params body args with |
| 120 | + | Some x -> x |
| 121 | + | None -> |
| 122 | + Ext_list.fold_left2 params args body (fun param arg l -> |
| 123 | + Lam_util.refine_let ~kind:Strict param arg l) |
0 commit comments