let widen wh =
let (_, wh_k_v) = wh in
let widen_map =
let decide k v1 v2 =
let v1 = match v1 with
None -> V.bottom
| Some v1 -> v1
in
let v2 = match v2 with
None -> V.bottom
| Some v2 -> v2
in
V.widen (wh_k_v k) v1 v2
in
M.generic_merge
~cache:("map_Lattice.widen",0)
~decide
in
fun m1 m2 ->
match m1, m2 with
| _ , Top _ -> m2
| Top _, _ -> assert false (* m2 should be larger than m1 *)
| Map m1, Map m2 ->
Map (widen_map m1 m2)