module Dominators: sig .. end
Compute dominators using data flow analysis
Author: George Necula   
      5/28/2004 
val computeIDom : ?doCFG:bool -> Cil.fundec -> Cil.stmt option Inthash.t
Invoke on a code after filling in the CFG info and it computes the 
 immediate dominator information. We map each statement to its immediate 
 dominator (None for the start statement, and for the unreachable 
 statements).
type 
val computeDomTree : ?doCFG:bool -> Cil.fundec -> Cil.stmt option Inthash.t * tree
returns the IDoms and a map from statement ids to 
  the set of statements that are dominated
val getIdom : Cil.stmt option Inthash.t -> Cil.stmt -> Cil.stmt option
This is like Inthash.find but gives an error if the information is 
 Not_found
val dominates : Cil.stmt option Inthash.t -> Cil.stmt -> Cil.stmt -> bool
Check whether one statement dominates another.
val children : tree -> Cil.stmt -> Cil.stmt list
Return a list of statements dominated by the argument
type 
val domTreeIter : (Cil.stmt -> unit) -> order -> tree -> unit
Iterate over a dominator tree
val findNaturalLoops : Cil.fundec -> Cil.stmt option Inthash.t -> (Cil.stmt * Cil.stmt list) list
Compute the start of the natural loops. This assumes that the "idom" 
 field has been computed. For each start, keep a list of origin of a back 
 edge. The loop consists of the loop start and all predecessors of the 
 origins of back edges, up to and including the loop start