let choose_f_to_call fbase_to_call call_info =
  SlicingParameters.debug ~level:2 "[Fct_Slice.choose_f_to_call]";
  let choose_min_slice fi_to_call =
    SlicingParameters.debug ~level:2 "MinimizeNbSlice -> choose_min_slice";
    let slices = M.fi_slices fi_to_call in
      match slices with
        | [] -> make_new_ff fi_to_call true
        | ff :: [] -> ff, []
        | _ -> (* TODO : choose a slice *)
            Extlib.not_yet_implemented "choose_min_slice with several slices"
  in
  let choose_full_slice fi_to_call =
    SlicingParameters.debug ~level:2 "PropagateMarksOnly -> choose_full_slice";
      match M.fi_slices fi_to_call with
        | [] -> make_new_ff fi_to_call true
               (* the signature is computed in [apply_choose_call]
                * (missing_outputs) *)

        | ff :: [] -> ff, []
        | _ -> (* TODO : choose a slice *)
            Extlib.not_yet_implemented "choose_full_slice with several slices"
  in
  let to_call, new_filters = match fbase_to_call with
    | None ->
        (* if we don't know the called function :
           either it is a call through a pointer or an external or
           variadic function
               => we don't try to slice it, so we keep the source call *)

        SlicingParameters.debug ~level:1 "unknown called function -> keep src";
        T.CallSrc None, []
    | Some fi_to_call ->
        try
          let slicing_level = M.fi_slicing_level fi_to_call in
            SlicingParameters.debug ~level:1 "choose_call with level %s"
                (M.str_level_option slicing_level);
            match slicing_level with
            | T.DontSlice ->
                SlicingParameters.debug ~level:2 "DontSliceCalls -> call src";
                T.CallSrc fbase_to_call, []
            | T.DontSliceButComputeMarks ->
                let ff_to_call, new_filters = choose_full_slice fi_to_call in
                  (T.CallSlice ff_to_call), new_filters
            | T.MinNbSlice ->
                let ff_to_call, new_filters = choose_min_slice fi_to_call in
                  (T.CallSlice ff_to_call), new_filters
            | T.MaxNbSlice ->
                let ff_to_call, new_filters =
                  choose_precise_slice fi_to_call call_info in
                  (T.CallSlice ff_to_call), new_filters
        with SlicingTypes.NoPdg ->
          SlicingParameters.feedback
            "unable to compute %s PDG : call source function"
            (M.fi_name fi_to_call);
          T.CallSrc None, []
  in to_call, new_filters