let mark_and_propagate fm ?(to_prop=empty_to_prop) select =
    let pdg, idx = fm in
    let process to_prop (sel, mark) = match sel with
      | SelNode (n, z_opt) ->
          Kernel.debug ~level:2
            "[pdgMark] mark_and_propagate start with %a@\n"
            PdgTypes.Node.pretty_with_part (n, z_opt);
          add_node_mark_rec pdg idx [(n, z_opt, mark)] to_prop
      | SelIn loc ->
          let in_key = Key.implicit_in_key loc in
          Kernel.debug ~level:2
            "[pdgMark] mark_and_propagate start with %a@\n"
            Key.pretty in_key;
          let mark_to_prop = add_mark pdg idx in_key mark in
          if M.is_bottom mark_to_prop then to_prop
          else add_to_to_prop to_prop in_key mark_to_prop
    in
    List.fold_left process to_prop select