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 = 
        (* notice that we use the same old data for each possible call *)
        process_one_call data_after stmt lvaloption (!Db.From.get kf) 
      in
      let l = List.map 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 *)
      List.fold_left (fun data kf -> process_call_args data kf stmt args)
        data called_functions 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