let process_call data_after stmt lvaloption funcexp args =
  let funcexp_dpds, called_functions =
    !Db.Value.expr_to_kernel_function ~with_alarms:CilE.warn_none_mode
      (Kstmt stmt) ~deps:(Some Data.bottom) funcexp
  in
  let used, data =
    try
      let froms = !Db.From.Callwise.find (Kstmt stmt) in
        process_one_call data_after stmt lvaloption froms
    with Not_found -> (* don't have callwise (-calldeps option) *)
      let do_call kf acc =
        (* notice that we use the same old data for each possible call *)
        (process_one_call data_after stmt lvaloption (!Db.From.get kf))::acc
      in
      let l = Kernel_function.Set.fold do_call called_functions []
      in (* in l, we have one result for each possible function called *)
        List.fold_left
           (fun (acc_u,acc_d) (u,d) -> (acc_u || u), Data.merge acc_d d)
           (falseData.bottom) l
  in if used then
    let data =
      (* no problem of order because parameters are disjoint for sure *)
      Kernel_function.Set.fold
        (fun kf data -> process_call_args data kf stmt args)
        called_functions
        data
    in
    let data =  Data.merge funcexp_dpds data in
      used, data
  else begin
    assert (R.verify (Data.equal data data_after)
              "if statement not used, data doesn't change !");
    used, data
  end