let final_cleanup kf froms =
let f k intervs =
if Db.accept_base ~with_formals:true ~with_locals:false kf k
then Zone.inject k intervs
else Zone.bottom
in
let joiner = Zone.join in
let projection base =
match Base.validity base with
| Base.Periodic (min_valid, max_valid, _)
| Base.Known (min_valid,max_valid)
| Base.Unknown (min_valid,max_valid)->
Int_Intervals.inject_bounds min_valid max_valid
| Base.All -> assert false
in
let zone_substitution =
Zone.cached_fold ~cache:("from cleanup", 331) ~temporary:true
~f ~joiner ~empty:Zone.bottom ~projection
in
let zone_substitution x =
try
zone_substitution x
with Zone.Error_Top -> Zone.top
in
{ Function_Froms.deps_table =
Lmap_bitwise.From_Model.map_and_merge
zone_substitution
froms.Function_Froms.deps_table
Lmap_bitwise.From_Model.empty;
deps_return =
Lmap_bitwise.From_Model.LOffset.map
(function b, d -> b, zone_substitution d)
froms.Function_Froms.deps_return;
}