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