sig
  type 'node edge = Edge of 'node * 'node | Exit of 'node
  module type Node =
    sig
      type node
      val pretty :
        Stdlib.Format.formatter -> Region_analysis_sig.Node.node -> unit
      module Dict :
        sig
          type 'a t
          val create : int -> '-> 'Region_analysis_sig.Node.Dict.t
          val get :
            'Region_analysis_sig.Node.Dict.t ->
            Region_analysis_sig.Node.node -> 'a
          val set :
            'Region_analysis_sig.Node.Dict.t ->
            Region_analysis_sig.Node.node -> '-> unit
          val iter :
            'Region_analysis_sig.Node.Dict.t ->
            (Region_analysis_sig.Node.node -> '-> unit) -> unit
          val copy :
            'Region_analysis_sig.Node.Dict.t ->
            'Region_analysis_sig.Node.Dict.t
        end
      module Set :
        sig
          type elt = node
          type t
          val empty : t
          val is_empty : t -> bool
          val mem : elt -> t -> bool
          val add : elt -> t -> t
          val singleton : elt -> t
          val remove : elt -> t -> t
          val union : t -> t -> t
          val inter : t -> t -> t
          val disjoint : t -> t -> bool
          val diff : t -> t -> t
          val compare : t -> t -> int
          val equal : t -> t -> bool
          val subset : t -> t -> bool
          val iter : (elt -> unit) -> t -> unit
          val map : (elt -> elt) -> t -> t
          val fold : (elt -> '-> 'a) -> t -> '-> 'a
          val for_all : (elt -> bool) -> t -> bool
          val exists : (elt -> bool) -> t -> bool
          val filter : (elt -> bool) -> t -> t
          val filter_map : (elt -> elt option) -> t -> t
          val partition : (elt -> bool) -> t -> t * t
          val cardinal : t -> int
          val elements : t -> elt list
          val min_elt : t -> elt
          val min_elt_opt : t -> elt option
          val max_elt : t -> elt
          val max_elt_opt : t -> elt option
          val choose : t -> elt
          val choose_opt : t -> elt option
          val split : elt -> t -> t * bool * t
          val find : elt -> t -> elt
          val find_opt : elt -> t -> elt option
          val find_first : (elt -> bool) -> t -> elt
          val find_first_opt : (elt -> bool) -> t -> elt option
          val find_last : (elt -> bool) -> t -> elt
          val find_last_opt : (elt -> bool) -> t -> elt option
          val of_list : elt list -> t
          val to_seq_from : elt -> t -> elt Seq.t
          val to_seq : t -> elt Seq.t
          val to_rev_seq : t -> elt Seq.t
          val add_seq : elt Seq.t -> t -> t
          val of_seq : elt Seq.t -> t
        end
      module Graph :
        sig
          val iter_succs :
            Region_analysis_sig.Node.node ->
            (Region_analysis_sig.Node.node -> unit) -> unit
          val iter_preds :
            Region_analysis_sig.Node.node ->
            (Region_analysis_sig.Node.node -> unit) -> unit
          val all_nodes : Region_analysis_sig.Node.Set.t
          val entry_node : Region_analysis_sig.Node.node
          val exit_nodes : Region_analysis_sig.Node.node list
        end
      module DomTree :
        sig
          val dominates :
            Region_analysis_sig.Node.node ->
            Region_analysis_sig.Node.node -> bool
          val domtree_postfix_iter :
            (Region_analysis_sig.Node.node -> unit) -> unit
        end
      module Edge_Dict :
        sig
          type 'a t
          val set :
            'Region_analysis_sig.Node.Edge_Dict.t ->
            Region_analysis_sig.Node.node Region_analysis_sig.edge ->
            '-> unit
          val get :
            'Region_analysis_sig.Node.Edge_Dict.t ->
            Region_analysis_sig.Node.node Region_analysis_sig.edge -> 'a
          val create : unit -> 'Region_analysis_sig.Node.Edge_Dict.t
          val iter :
            'Region_analysis_sig.Node.Edge_Dict.t ->
            (Region_analysis_sig.Node.node Region_analysis_sig.edge ->
             '-> unit) ->
            unit
        end
      type abstract_value
      val compile_node :
        Region_analysis_sig.Node.node ->
        Region_analysis_sig.Node.abstract_value ->
        (Region_analysis_sig.Node.node Region_analysis_sig.edge *
         Region_analysis_sig.Node.abstract_value)
        list
      val join :
        Region_analysis_sig.Node.abstract_value list ->
        Region_analysis_sig.Node.abstract_value
      val mu :
        (Region_analysis_sig.Node.abstract_value ->
         Region_analysis_sig.Node.abstract_value) ->
        Region_analysis_sig.Node.abstract_value ->
        Region_analysis_sig.Node.abstract_value
    end
end