Skip to content

Commit e1fff78

Browse files
committed
More efficient implementation of CClosure that does not overallocate.
In several cases, an intermediary array was generated to be mapped over immediately. We now do everything in one pass. As a by-product, this patch also provides a little code refactoring.
1 parent e3124e0 commit e1fff78

File tree

1 file changed

+39
-22
lines changed

1 file changed

+39
-22
lines changed

kernel/cClosure.ml

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -596,23 +596,18 @@ let rec to_constr constr_fun lfts v =
596596
| FInd op -> mkIndU op
597597
| FConstruct op -> mkConstructU op
598598
| FCaseT (ci,p,c,ve,env) ->
599-
mkCase (ci, constr_fun lfts (mk_clos env p),
600-
constr_fun lfts c,
601-
Array.map (fun b -> constr_fun lfts (mk_clos env b)) ve)
599+
let fve = to_constr_array constr_fun lfts env 0 ve in
600+
mkCase (ci, constr_fun lfts (mk_clos env p), constr_fun lfts c, fve)
602601
| FFix ((op,(lna,tys,bds)),e) ->
603602
let n = Array.length bds in
604-
let ftys = CArray.Fun1.map mk_clos e tys in
605-
let fbds = CArray.Fun1.map mk_clos (subs_liftn n e) bds in
606-
let lfts' = el_liftn n lfts in
607-
mkFix (op, (lna, CArray.Fun1.map constr_fun lfts ftys,
608-
CArray.Fun1.map constr_fun lfts' fbds))
603+
let ftys = to_constr_array constr_fun lfts e 0 tys in
604+
let fbds = to_constr_array constr_fun lfts e n bds in
605+
mkFix (op, (lna, ftys, fbds))
609606
| FCoFix ((op,(lna,tys,bds)),e) ->
610607
let n = Array.length bds in
611-
let ftys = CArray.Fun1.map mk_clos e tys in
612-
let fbds = CArray.Fun1.map mk_clos (subs_liftn n e) bds in
613-
let lfts' = el_liftn (Array.length bds) lfts in
614-
mkCoFix (op, (lna, CArray.Fun1.map constr_fun lfts ftys,
615-
CArray.Fun1.map constr_fun lfts' fbds))
608+
let ftys = to_constr_array constr_fun lfts e 0 tys in
609+
let fbds = to_constr_array constr_fun lfts e n bds in
610+
mkCoFix (op, (lna, ftys, fbds))
616611
| FApp (f,ve) ->
617612
mkApp (constr_fun lfts f,
618613
CArray.Fun1.map constr_fun lfts ve)
@@ -640,6 +635,18 @@ let rec to_constr constr_fun lfts v =
640635
to_constr constr_fun lfts unfv
641636
| FLOCKED -> assert false (*mkVar(Id.of_string"_LOCK_")*)
642637

638+
and to_constr_array constr_fun lfts env n (v : constr array) =
639+
let len = Array.length v in
640+
let ans = Array.make len mkProp in
641+
let env = subs_liftn n env in
642+
let lfts = el_liftn n lfts in
643+
for i = 0 to len - 1 do
644+
let c = Array.unsafe_get v i in
645+
let c = constr_fun lfts (mk_clos env c) in
646+
Array.unsafe_set ans i c
647+
done;
648+
ans
649+
643650
(* This function defines the correspondance between constr and
644651
fconstr. When we find a closure whose substitution is the identity,
645652
then we directly return the constr to avoid possibly huge
@@ -1020,22 +1027,32 @@ and norm_head info m =
10201027
| FProd(na,dom,rng) ->
10211028
mkProd(na, kl info dom, kl info rng)
10221029
| FCoFix((n,(na,tys,bds)),e) ->
1023-
let ftys = CArray.Fun1.map mk_clos e tys in
1024-
let fbds =
1025-
CArray.Fun1.map mk_clos (subs_liftn (Array.length na) e) bds in
1026-
mkCoFix(n,(na, CArray.Fun1.map kl info ftys, CArray.Fun1.map kl info fbds))
1030+
let ftys = norm_head_array info e 0 tys in
1031+
let fbds = norm_head_array info e (Array.length na) bds in
1032+
mkCoFix(n,(na, ftys, fbds))
10271033
| FFix((n,(na,tys,bds)),e) ->
1028-
let ftys = CArray.Fun1.map mk_clos e tys in
1029-
let fbds =
1030-
CArray.Fun1.map mk_clos (subs_liftn (Array.length na) e) bds in
1031-
mkFix(n,(na, CArray.Fun1.map kl info ftys, CArray.Fun1.map kl info fbds))
1034+
let ftys = norm_head_array info e 0 tys in
1035+
let fbds = norm_head_array info e (Array.length na) bds in
1036+
mkFix(n,(na, ftys, fbds))
10321037
| FEvar((i,args),env) ->
1033-
mkEvar(i, Array.map (fun a -> kl info (mk_clos env a)) args)
1038+
let fargs = norm_head_array info env 0 args in
1039+
mkEvar(i, fargs)
10341040
| FProj (p,c) ->
10351041
mkProj (p, kl info c)
10361042
| FLOCKED | FRel _ | FAtom _ | FCast _ | FFlex _ | FInd _ | FConstruct _
10371043
| FApp _ | FCaseT _ | FLIFT _ | FCLOS _ -> term_of_fconstr m
10381044

1045+
and norm_head_array info env n (v : constr array) =
1046+
let len = Array.length v in
1047+
let ans = Array.make len mkProp in
1048+
let env = subs_liftn n env in
1049+
for i = 0 to len - 1 do
1050+
let c = Array.unsafe_get v i in
1051+
let c = kl info (mk_clos env c) in
1052+
Array.unsafe_set ans i c
1053+
done;
1054+
ans
1055+
10391056
(* Initialization and then normalization *)
10401057

10411058
(* weak reduction *)

0 commit comments

Comments
 (0)