Skip to content

Commit 0d56b2a

Browse files
authored
[Bennet] Conditional lazy generation (#497)
1 parent 677c317 commit 0d56b2a

File tree

4 files changed

+34
-20
lines changed

4 files changed

+34
-20
lines changed

lib/testGeneration/bennet/stage3/instantiate.ml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,11 @@ module Make (AD : Domain.T) = struct
6767
an instantiate before its first use in the continuation. *)
6868
let next_instantiated =
6969
match gt1 with
70+
| GenTerms.Annot (`Lazy, _, _, _) -> instantiated'
7071
| GenTerms.Annot (`Arbitrary, _, _, _)
71-
| GenTerms.Annot (`Symbolic, _, _, _)
72-
| GenTerms.Annot (`Lazy, _, _, _) ->
73-
instantiated'
7472
| Annot ((`Call _ | `Return _ | `Map _), _, _, _) ->
7573
Sym.Set.add x instantiated'
74+
| GenTerms.Annot (`Symbolic, _, _, _) -> failwith ("unsupported @ " ^ __LOC__)
7675
| _ -> failwith ("unreachable @ " ^ __LOC__)
7776
in
7877
`LetStar ((x, gt1), aux next_instantiated gt2)

lib/testGeneration/bennet/stage3/lazify.ml

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,46 @@
1+
module IT = IndexTerms
2+
module LC = LogicalConstraints
3+
14
module Make (AD : Domain.T) = struct
25
module Ctx = Ctx.Make (AD)
36
module Def = Def.Make (AD)
47
module Term = Term.Make (AD)
58

9+
let is_locally_constrained (x : Sym.t) (gt : Term.t) : bool =
10+
let rec aux (gt : Term.t) : bool =
11+
let (Annot (gt_, _, _, _)) = gt in
12+
match gt_ with
13+
| `Arbitrary | `Symbolic | `Lazy -> false
14+
| `Return it_val -> Sym.Set.mem x (IT.free_vars it_val)
15+
| `Asgn ((it_addr, _), _, gt_rest) ->
16+
Sym.Set.mem x (IT.free_vars it_addr) || aux gt_rest
17+
| `Assert (lc, gt_rest) -> Sym.Set.mem x (LC.free_vars lc) || aux gt_rest
18+
| `Call _ -> false
19+
| `LetStar
20+
((_, Annot ((`Arbitrary | `Symbolic | `Lazy | `Call _), _, _, _)), gt_rest) ->
21+
aux gt_rest
22+
| `LetStar ((_, Annot (`Map ((y, _y_bt, _it_perm), gt_inner), _, _, _)), gt_rest) ->
23+
((not (Sym.equal x y)) && aux gt_inner) || aux gt_rest
24+
| `LetStar ((_, Annot (`Return it, _, _, _)), gt_rest) ->
25+
Sym.Set.mem x (IT.free_vars it) || aux gt_rest
26+
| `LetStar ((_, _), _) -> failwith ("unreachable @ " ^ __LOC__)
27+
| `ITE (it_if, gt_then, gt_else) ->
28+
Sym.Set.mem x (IT.free_vars it_if) || aux gt_then || aux gt_else
29+
| `Map ((_, _, it_perm), gt') -> Sym.Set.mem x (IT.free_vars it_perm) || aux gt'
30+
| `Instantiate _ -> failwith ("unreachable @ " ^ __LOC__)
31+
| `Pick gts -> List.exists aux gts
32+
in
33+
aux gt
34+
35+
636
let rec transform_gt (gt : Term.t) : Term.t =
737
let (GenTerms.Annot (gt_, _tag, bt, loc)) = gt in
838
match gt_ with
939
| `Arbitrary | `Lazy | `Symbolic | `Call _ | `Return _ -> gt
1040
| `Asgn ((it_addr, sct), it_val, gt_rest) ->
1141
Term.asgn_ ((it_addr, sct), it_val, transform_gt gt_rest) () loc
12-
| `LetStar
13-
((x, (GenTerms.Annot (`Arbitrary, _, inner_bt, inner_loc) as _gt_inner)), gt_rest)
14-
->
42+
| `LetStar ((x, GenTerms.Annot (`Arbitrary, _, inner_bt, inner_loc)), gt_rest)
43+
when not (is_locally_constrained x gt_rest) ->
1544
Term.let_star_ ((x, Term.lazy_ () inner_bt inner_loc), transform_gt gt_rest) () loc
1645
| `LetStar ((x, gt_inner), gt_rest) ->
1746
Term.let_star_ ((x, transform_gt gt_inner), transform_gt gt_rest) () loc

lib/testGeneration/bennet/stage6/convert.ml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,6 @@ module Make (AD : Domain.T) = struct
6868
let gt_inner = aux vars path_vars gt_inner in
6969
let gt_rest = aux vars path_vars gt_rest in
7070
GenTerms.Annot (`LetStar ((x, gt_inner), gt_rest), (path_vars, last_var), bt, loc)
71-
| `LetStar
72-
( ( x,
73-
(Annot ((`Arbitrary | `ArbitraryDomain _ | `ArbitrarySpecialized _), _, _, _)
74-
as gt_inner) ),
75-
gt_rest )
76-
when TestGenConfig.is_lazy_gen () ->
77-
let gt_inner = aux vars path_vars gt_inner in
78-
let gt_rest = aux vars path_vars gt_rest in
79-
GenTerms.Annot (`LetStar ((x, gt_inner), gt_rest), (path_vars, last_var), bt, loc)
8071
| `LetStar ((x, gt_inner), gt_rest) ->
8172
let gt_inner = aux vars path_vars gt_inner in
8273
let gt_rest = aux (x :: vars) path_vars gt_rest in

tests/run-cn-test-gen.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,6 @@ def get_test_type(test_file, config):
4343
return 'PASS'
4444
else:
4545
return 'SKIP'
46-
elif test_file.endswith('tutorial_queue.pass.c'):
47-
if '--lazy-gen' in config:
48-
return 'SKIP'
49-
else:
50-
return 'PASS'
5146
elif test_file.endswith('.pass.c'):
5247
return 'PASS'
5348
elif test_file.endswith('.fail.c'):

0 commit comments

Comments
 (0)