From 61cbcef3628999d214d5a1b4b2f5cfd8a905b85d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr> Date: Wed, 9 Jan 2019 13:39:36 +0100 Subject: [PATCH] [Eva] Uses the period (instead of delay) to postpone the widening of nested loops. Also adds some comments. --- src/plugins/value/engine/basic_partitioning.ml | 2 +- src/plugins/value/engine/legacy_partitioning.ml | 3 ++- src/plugins/value/engine/loop_partitioning.ml | 4 +++- src/plugins/value/engine/partitioned_dataflow.ml | 4 +++- src/plugins/value/engine/state_partitioning.mli | 5 +++++ 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/plugins/value/engine/basic_partitioning.ml b/src/plugins/value/engine/basic_partitioning.ml index ca14677cc57..ae99cfef5dc 100644 --- a/src/plugins/value/engine/basic_partitioning.ml +++ b/src/plugins/value/engine/basic_partitioning.ml @@ -183,7 +183,7 @@ struct w.widening_counter <- widening_delay let reset_widening_counter (w : widening) : unit = - w.widening_counter <- widening_delay + w.widening_counter <- max w.widening_counter (widening_period - 1) (* Operators *) diff --git a/src/plugins/value/engine/legacy_partitioning.ml b/src/plugins/value/engine/legacy_partitioning.ml index 29552b96f66..bee9eba706b 100644 --- a/src/plugins/value/engine/legacy_partitioning.ml +++ b/src/plugins/value/engine/legacy_partitioning.ml @@ -141,7 +141,8 @@ struct w.previous_state <- `Bottom; w.widening_counter <- widening_delay - let reset_widening_counter w = w.widening_counter <- widening_delay + let reset_widening_counter w = + w.widening_counter <- max w.widening_counter (widening_period - 1) (* Operators *) diff --git a/src/plugins/value/engine/loop_partitioning.ml b/src/plugins/value/engine/loop_partitioning.ml index 3036e5bd5a3..a6700d0c890 100644 --- a/src/plugins/value/engine/loop_partitioning.ml +++ b/src/plugins/value/engine/loop_partitioning.ml @@ -360,7 +360,9 @@ struct Tree.iter reset w.widening_tree let reset_widening_counter (w : widening) : unit = - let reset w = w.widening_counter <- widening_delay in + let reset w = + w.widening_counter <- max w.widening_counter (widening_period - 1) + in Tree.iter reset w.widening_tree (* Operators *) diff --git a/src/plugins/value/engine/partitioned_dataflow.ml b/src/plugins/value/engine/partitioned_dataflow.ml index 8a7d4a1be7d..aa0be86c0bb 100644 --- a/src/plugins/value/engine/partitioned_dataflow.ml +++ b/src/plugins/value/engine/partitioned_dataflow.ml @@ -623,7 +623,9 @@ module Make_Dataflow | Wto.Node v -> ignore (process_vertex v) | Wto.Component (v, w) as component -> - (* Reset the component if hierachical_convergence is set *) + (* Reset the component if hierachical_convergence is set. + Otherwise, only resets the widening counter for this component. This + is especially useful for nested loops. *) if hierachical_convergence then reset_component (v :: Wto.flatten w) else Partition.reset_widening_counter (get_vertex_widening v); diff --git a/src/plugins/value/engine/state_partitioning.mli b/src/plugins/value/engine/state_partitioning.mli index a7b54408b6a..a76253bb3b3 100644 --- a/src/plugins/value/engine/state_partitioning.mli +++ b/src/plugins/value/engine/state_partitioning.mli @@ -90,6 +90,11 @@ sig val reset_propagation : propagation -> unit val reset_shadow : shadow -> unit val reset_widening : widening -> unit + + (** Resets (or just delays) the widening counter. Used on nested loops, to + postpone the widening of the inner loop when iterating on the outer + loops. This is especially useful when the inner loop fixpoint does not + depend on the outer loop. *) val reset_widening_counter : widening -> unit -- GitLab