let choose_precise_slice fi_to_call call_info =
  let out_call = FctMarks.get_call_output_marks call_info in
  let rec find slices = match slices with
    |  [] ->
        let ff, actions = make_new_ff fi_to_call true in
          (*
        let called_kf = M.get_fi_kf fi_to_call in
        let new_actions = add_spare_call_inputs called_kf call_info in
        let actions = new_actions @ actions in
    *)

          ff, actions
    | ff :: slices ->
        let _missing_outputs, more_outputs =
          FctMarks.check_called_marks out_call ff
        in
          if more_outputs
          then (* not enough outputs in [ff] *)
            begin
              SlicingParameters.debug ~level:2 "[Fct_Slice.choose_precise_slice] %s ? not enought outputs"
                  (M.ff_name ff);
              find slices
            end
          else
            begin
              (*
              let ff_marks = FctMarks.get_ff_marks ff in
              let input_marks = FctMarks.get_all_input_marks ff_marks in
              let (caller, call) = CallInfo.get_call_id call_info in
              let pdg_caller = M.get_ff_pdg caller in
              let caller_marks = FctMarks.get_ff_marks caller in
              let _ , more_inputs =
                FctMarks.marks_for_caller_inputs pdg_caller caller_marks
                  call input_marks fi_to_call
              in
                if more_inputs
                then (* [ff] needs too many inputs *)
                  begin
                    SlicingKernel.debug ~level:2 "[Fct_Slice.choose_precise_slice] %s ? too many inputs"
                        (M.ff_name ff);
                    find slices
                  end
                else
                  *)

                  begin
                    SlicingParameters.debug ~level:2 "[Fct_Slice.choose_precise_slice] %s ? ok" (M.ff_name ff);
                    ff , []
                  end
            end
  in
  let slices = M.fi_slices fi_to_call in
    find slices