let mark_visible_inputs ff_marks to_prop =
    let pdg, _ = ff_marks  in
    let kf = M.get_pdg_kf pdg in
    let param_list = Kernel_function.get_formals kf in
    let rec check_in_params n params = match params with
      | [] -> []
      | _ :: params ->
          let node = !Db.Pdg.find_input_node pdg n in
          let dpds = !Db.Pdg.direct_dpds pdg node in
          let get_n_mark n = get_mark ff_marks (PdgTypes.Node.elem_key n) in
          let dpds_marks = List.map get_n_mark dpds in
          let m = Marks.inter_marks dpds_marks in
          let marks = check_in_params (n+1) params in
            if not (Marks.is_bottom_mark m) then
              begin
                SlicingParameters.debug ~level:2 "[Fct_Slice.FctMarks.mark_visible_inputs] %a -> %a"
                    (!Db.Pdg.pretty_node true) node Marks.pretty_mark m;
                PdgMarks.add_node_to_select marks (node, None) m
              end
            else marks
    in let new_marks = check_in_params 1 param_list in
      mark_and_propagate ff_marks ~to_prop new_marks