let process_froms data_after froms =
  let from_table = froms.Function_Froms.deps_table in
  let process_out_call out (default, out_dpds) (to_prop, used, new_data) =
    let exact = not default in
    (* be careful to compare out with data_after and not new_data *)
    if (Data.intersects data_after out) then
      let to_prop = if exact then Data.diff to_prop out else to_prop in
      let new_data = Data.merge new_data out_dpds in
         (to_prop, true, new_data)
    else (to_prop, used, new_data)
  in
  let to_prop = 
    (* part of data_after that we need to compute before call :
    * = data_after minus all exact outputs. 
    * Don't use [data_after - (merge out)] to avoid approximation in merge *)

    data_after in
  let new_data = Data.bottom in (* add out_dpds when out intersects data_after*)
  let used = false in (* is the call needed ? *)
  let to_prop, used, new_data =
    try Lmap_bitwise.From_Model.fold process_out_call from_table 
          (to_prop, used, new_data)
    with Lmap_bitwise.From_Model.Cannot_fold ->
      process_out_call  Locations.Zone.top (falseLocations.Zone.top)
          (to_prop, used, new_data)
  in let data = Data.merge to_prop new_data in
    (used, data)