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.tInvoke 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 tree
val computeDomTree : ?doCFG:bool -> Cil.fundec -> Cil.stmt option Inthash.t * treereturns 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 optionThis 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 -> boolCheck whether one statement dominates another.
val children : tree -> Cil.stmt -> Cil.stmt listReturn a list of statements dominated by the argument
type order =
| |
PreOrder |
| |
PostOrder |
val domTreeIter : (Cil.stmt -> unit) -> order -> tree -> unitIterate over a dominator tree
val findNaturalLoops : Cil.fundec -> Cil.stmt option Inthash.t -> (Cil.stmt * Cil.stmt list) listCompute 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