ocaml/middle_end/find_recursive_functions.ml

35 lines
1.8 KiB
OCaml

(**************************************************************************)
(* *)
(* OCaml *)
(* *)
(* Pierre Chambart, OCamlPro *)
(* Mark Shinwell and Leo White, Jane Street Europe *)
(* *)
(* Copyright 2013--2016 OCamlPro SAS *)
(* Copyright 2014--2016 Jane Street Group LLC *)
(* *)
(* All rights reserved. This file is distributed under the terms of *)
(* the GNU Lesser General Public License version 2.1, with the *)
(* special exception on linking described in the file LICENSE. *)
(* *)
(**************************************************************************)
[@@@ocaml.warning "+a-4-9-30-40-41-42"]
open! Int_replace_polymorphic_compare
let in_function_declarations (function_decls : Flambda.function_declarations)
~backend =
let module VCC = Strongly_connected_components.Make (Variable) in
let directed_graph =
let module B = (val backend : Backend_intf.S) in
Flambda_utils.fun_vars_referenced_in_decls function_decls
~closure_symbol:B.closure_symbol
in
let connected_components =
VCC.connected_components_sorted_from_roots_to_leaf directed_graph
in
Array.fold_left (fun rec_fun -> function
| VCC.No_loop _ -> rec_fun
| VCC.Has_loop elts -> List.fold_right Variable.Set.add elts rec_fun)
Variable.Set.empty connected_components