Skip to content

Commit aa68509

Browse files
Use Seq instead of constructing from scratch
1 parent 35bec2d commit aa68509

3 files changed

Lines changed: 30 additions & 9 deletions

File tree

src/analyses/pthreadBarriers.ml

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,19 @@ struct
5252
Queries.AD.to_var_may (a.f (Queries.MayPointTo barrier))
5353

5454
let special man (lval: lval option) (f:varinfo) (arglist:exp list) : D.t =
55+
let exists_k pred k waiters =
56+
let k_product elems =
57+
let rec doit k =
58+
if k = 1 then
59+
Seq.map (Seq.return) elems
60+
else
61+
let arg = doit (k-1) in
62+
Seq.map_product (Seq.cons) elems arg
63+
in
64+
doit k
65+
in
66+
Seq.exists pred (k_product (Waiters.to_seq waiters))
67+
in
5568
let desc = LF.find f in
5669
match desc.special arglist with
5770
| BarrierWait barrier ->
@@ -88,16 +101,14 @@ struct
88101
let must =
89102
let waiters = Waiters.elements relevant_waiters in
90103
let min_cap = Z.to_int min_cap in
91-
let lists = List.init (min_cap - 1) (fun _ -> waiters) in
92-
let candidates = BatList.n_cartesian_product lists in
93-
let can_proceed = List.exists (fun candidate ->
94-
let rec do_it = function
95-
| [] -> true
96-
| x::xs -> List.for_all (fun y -> MHPplusLock.mhp x y) xs && do_it xs
97-
in
98-
do_it candidate
99-
) candidates
104+
let can_proceed_pred seq =
105+
let rec doit seq = match Seq.uncons seq with
106+
| None -> true
107+
| Some (h, t) -> Seq.for_all (MHPplusLock.mhp h) t && doit t
108+
in
109+
doit seq
100110
in
111+
let can_proceed = exists_k can_proceed_pred (min_cap - 1) relevant_waiters in
101112
if not can_proceed then raise Analyses.Deadcode;
102113
(* limit to this case to avoid having to construct all permutations above *)
103114
if BatList.compare_length_with waiters (min_cap - 1) = 0 then

src/domain/disjointDomain.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ struct
117117
add e acc
118118
) (empty ()) es
119119
let elements m = fold List.cons m [] (* no intermediate per-bucket lists *)
120+
let to_seq m = fold Seq.cons m Seq.empty
120121
let map f m = fold (fun e acc ->
121122
add (f e) acc
122123
) m (empty ()) (* no intermediate lists *)
@@ -323,6 +324,7 @@ struct
323324
add e acc
324325
) (empty ()) es
325326
let elements m = fold List.cons m [] (* no intermediate per-bucket lists *)
327+
let to_seq m = fold Seq.cons m Seq.empty
326328
let map f s = fold (fun e acc ->
327329
add (f e) acc
328330
) s (empty ()) (* no intermediate lists *)

src/domain/setDomain.ml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@ sig
9595
On set abstractions this lists only canonical elements,
9696
not all subsumed elements. *)
9797

98+
val to_seq: t -> elt Seq.t
99+
(** See {!Set.S.to_seq}.
100+
101+
On set abstractions this lists only canonical elements,
102+
not all subsumed elements. *)
103+
98104
val of_list: elt list -> t
99105

100106
val min_elt: t -> elt
@@ -332,6 +338,7 @@ struct
332338
let exists f = schema_default true (S.exists f)
333339
let filter f = schema (fun t -> `Lifted (S.filter f t)) "filter on `Top"
334340
let elements = schema S.elements "elements on `Top"
341+
let to_seq = schema S.to_seq "to_seq on `Top"
335342
let of_list xs = `Lifted (S.of_list xs)
336343
let cardinal = schema S.cardinal "cardinal on `Top"
337344
let min_elt = schema S.min_elt "min_elt on `Top"
@@ -471,6 +478,7 @@ struct
471478
let mem e e' = E.leq e e'
472479
let choose e = e
473480
let elements e = [e]
481+
let to_seq e = Seq.return e
474482
let remove e e' =
475483
if E.leq e' e then
476484
E.bot () (* NB! strong removal *)

0 commit comments

Comments
 (0)