summaryrefslogtreecommitdiff
path: root/middle_end/flambda/find_recursive_functions.ml
diff options
context:
space:
mode:
Diffstat (limited to 'middle_end/flambda/find_recursive_functions.ml')
-rw-r--r--middle_end/flambda/find_recursive_functions.ml34
1 files changed, 34 insertions, 0 deletions
diff --git a/middle_end/flambda/find_recursive_functions.ml b/middle_end/flambda/find_recursive_functions.ml
new file mode 100644
index 0000000000..e69433039f
--- /dev/null
+++ b/middle_end/flambda/find_recursive_functions.ml
@@ -0,0 +1,34 @@
+(**************************************************************************)
+(* *)
+(* 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-66"]
+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