let find_call_out_nodes_to_select pdg_called called_selected_nodes
    pdg_caller call_stmt  =
  Pdg_parameters.debug ~level:2
    "[pdg:find_call_out_nodes_to_select] for call sid:%d@."
    call_stmt.sid;
  let _, call_sgn = 
    FI.find_call (PdgTypes.Pdg.get_index pdg_caller) call_stmt 
  in
  let called_selected_nodes_set =
    PdgTypes.NodeSet.add_list called_selected_nodes in
  let test_out acc (out_key, call_out_node) =
    let called_out_nodes, _undef = find_output_nodes pdg_called out_key in
    (* undef can be ignored in this case because it is taken into account in
     * the call part. *)

    let intersect =
      List.exists
        (fun (n,_z) -> PdgTypes.NodeSet.mem n called_selected_nodes_set)
        called_out_nodes
    in
    if intersect then begin
      Pdg_parameters.debug ~level:2
        "\t+ n_%a@." Macros.pretty_node call_out_node;
      call_out_node::acc
    end else
      acc
  in
  PdgIndex.Signature.fold_all_outputs test_out [] call_sgn