From f37eb27e87a84843d6c928d4153265a15b1ac891 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Fri, 21 Jul 2023 17:42:20 +0200
Subject: [PATCH] [Eva] Multidim domain: optimizes the oracle function of the
 join.

Caches calls to the oracle by saving the resulting valuation and reusing it
on next calls.
---
 .../eva/domains/multidim/multidim_domain.ml   | 21 ++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/plugins/eva/domains/multidim/multidim_domain.ml b/src/plugins/eva/domains/multidim/multidim_domain.ml
index 55b457e1695..26d4bab6710 100644
--- a/src/plugins/eva/domains/multidim/multidim_domain.ml
+++ b/src/plugins/eva/domains/multidim/multidim_domain.ml
@@ -918,15 +918,22 @@ let multidim_hook (module Abstract: Abstractions.S) : (module Abstractions.S) =
 
       let join a b =
         let r = join (set key Domain.top a) (set key Domain.top b) in
-        let oracle state exp = (* TODO: cache results *)
-          let v, _alarms = Eval.evaluate state exp in
-          match v with
-          | `Bottom -> Cvalue.V.top
-          | `Value (_valuation,v) -> get_cval v
+        let oracle state =
+          let valuation_ref = ref Eval.Valuation.empty in
+          fun exp ->
+            let valuation = !valuation_ref in
+            let v, _alarms = Eval.evaluate ~valuation state exp in
+            match v with
+            | `Bottom -> Cvalue.V.top
+            | `Value (valuation, v) ->
+              valuation_ref := valuation;
+              get_cval v
         in
+        let left_oracle = oracle a
+        and right_oracle = oracle b in
         let oracle = function
-          | Abstract_memory.Left ->  convert_oracle (oracle a)
-          | Abstract_memory.Right -> convert_oracle (oracle b)
+          | Abstract_memory.Left ->  convert_oracle left_oracle
+          | Abstract_memory.Right -> convert_oracle right_oracle
         in
         let multidim = Domain.join' ~oracle (get_multidim a) (get_multidim b) in
         set key multidim r
-- 
GitLab