From a90614e216b054792e8fcdbcee7f698cd3d43fe1 Mon Sep 17 00:00:00 2001 From: Allan Blanchard <allan.blanchard@cea.fr> Date: Mon, 8 Feb 2021 13:06:22 +0100 Subject: [PATCH] [wp] Reachability: less memoization --- src/plugins/wp/cfgInfos.ml | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/plugins/wp/cfgInfos.ml b/src/plugins/wp/cfgInfos.ml index 3b9ca175fec..b679aebcbff 100644 --- a/src/plugins/wp/cfgInfos.ml +++ b/src/plugins/wp/cfgInfos.ml @@ -34,7 +34,7 @@ type t = { mutable annots : bool; (* has goals to prove *) mutable doomed : WpPropId.prop_id Bag.t; mutable calls : Kernel_function.Set.t; - unreachable : bool Vhash.t ; + unreachable : bool option Vhash.t ; } (* -------------------------------------------------------------------------- *) @@ -50,19 +50,31 @@ let doomed infos = infos.doomed (* --- Reachability Analyses --- *) (* -------------------------------------------------------------------------- *) -let fixpoint h d f = +let fixpoint h f = let rec phi v = try Vhash.find h v with Not_found -> - Vhash.add h v d ; + Vhash.add h v None ; let r = f phi v in - Vhash.replace h v r ; r + if Option.is_none r + then Vhash.remove h v + else Vhash.replace h v r ; + r in phi -let unreachable infos = +let unreachable infos v = let pred = Cfg.G.pred (Option.get infos.cfg).graph in - fixpoint infos.unreachable true - begin fun phi v -> List.for_all phi (pred v) end + let do_fixpoint = fixpoint infos.unreachable + begin fun phi v -> + match List.map phi (pred v) with + | l when List.exists (fun x -> x = Some false) l -> Some false + | l when List.for_all (fun x -> x = Some true) l -> Some true + | _ -> None + end + in + match do_fixpoint v with + | Some x -> x + | None -> Vhash.add infos.unreachable v (Some false) ; false (* -------------------------------------------------------------------------- *) (* --- Selected Properties --- *) @@ -216,7 +228,7 @@ let compile Key.{ kf ; bhv ; prop } = let cfg = Option.get cfg in (* Root Reachability *) let v0 = cfg.entry_point in - Vhash.add infos.unreachable v0 false ; + Vhash.add infos.unreachable v0 (Some false) ; (* Spec Iteration *) if selected_disjoint_complete kf ~bhv ~prop || (List.exists (selected_bhv ~bhv ~prop) behaviors) -- GitLab