sig
  type 'a action =
    'Dataflow.action =
      Default
    | Done of 'a
    | Post of ('-> 'a)
  type 'a stmtaction = 'Dataflow.stmtaction = SDefault | SDone | SUse of 'a
  type 'a guardaction =
    'Dataflow.guardaction =
      GDefault
    | GUse of 'a
    | GUnreachable
  module type StmtStartData =
    sig
      type data
      val clear : unit -> unit
      val mem : int -> bool
      val find : int -> data
      val replace : int -> data -> unit
      val add : int -> data -> unit
      val iter : (int -> data -> unit) -> unit
      val length : unit -> int
    end
  module StmtStartData :
    functor (X : sig type t val size : int end->
      sig
        type data = X.t
        val clear : unit -> unit
        val mem : int -> bool
        val find : int -> data
        val replace : int -> data -> unit
        val add : int -> data -> unit
        val iter : (int -> data -> unit) -> unit
        val length : unit -> int
      end
  module type ForwardsTransfer =
    sig
      val name : string
      val debug : bool ref
      type t
      module StmtStartData :
        sig
          type data = t
          val clear : unit -> unit
          val mem : int -> bool
          val find : int -> data
          val replace : int -> data -> unit
          val add : int -> data -> unit
          val iter : (int -> data -> unit) -> unit
          val length : unit -> int
        end
      val copy : t -> t
      val pretty : Format.formatter -> t -> unit
      val computeFirstPredecessor : Cil_types.stmt -> t -> t
      val combinePredecessors : Cil_types.stmt -> old:t -> t -> t option
      val doInstr : Cil_types.stmt -> Cil_types.instr -> t -> t action
      val doGuard :
        Cil_types.stmt -> Cil_types.exp -> t -> t guardaction * t guardaction
      val doStmt : Cil_types.stmt -> t -> t stmtaction
      val filterStmt : Cil_types.stmt -> bool
      val stmt_can_reach : Cil_types.stmt -> Cil_types.stmt -> bool
      val doEdge : Cil_types.stmt -> Cil_types.stmt -> t -> t
    end
  module ForwardsDataFlow :
    functor (T : ForwardsTransfer->
      sig
        val reachedStatement :
          Cil_types.stmt -> Cil_types.stmt -> T.t -> unit
        val compute : Cil_types.stmt list -> unit
      end
  module type BackwardsTransfer =
    sig
      val name : string
      val debug : bool ref
      type t
      module StmtStartData :
        sig
          type data = t
          val clear : unit -> unit
          val mem : int -> bool
          val find : int -> data
          val replace : int -> data -> unit
          val add : int -> data -> unit
          val iter : (int -> data -> unit) -> unit
          val length : unit -> int
        end
      val pretty : Format.formatter -> t -> unit
      val funcExitData : t
      val combineStmtStartData : Cil_types.stmt -> old:t -> t -> t option
      val combineSuccessors : t -> t -> t
      val doStmt : Cil_types.stmt -> t action
      val doInstr : Cil_types.stmt -> Cil_types.instr -> t -> t action
      val filterStmt : Cil_types.stmt -> Cil_types.stmt -> bool
    end
  module BackwardsDataFlow :
    functor (T : BackwardsTransfer->
      sig val compute : Cil_types.stmt list -> unit end
  val find_stmts :
    Cil_types.fundec -> Cil_types.stmt list * Cil_types.stmt list
end