blob: be244d811dc840fae0ecaddf745e99ee87749dd6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
type cfgInfo = {
name: string; (* The function name *)
start : int;
size : int;
blocks: cfgBlock array; (** Dominating blocks must come first *)
successors: int list array; (* block indices *)
predecessors: int list array;
mutable nrRegs: int;
mutable regToVarinfo: Cil.varinfo array; (** Map register IDs to varinfo *)
}
(** A block corresponds to a statement *)
and cfgBlock = {
bstmt: Cil.stmt;
(* We abstract the statement as a list of def/use instructions *)
instrlist: instruction list;
mutable livevars: (reg * int) list;
(** For each variable ID that is live at the start of the block, the
* block whose definition reaches this point. If that block is the same
* as the current one, then the variable is a phi variable *)
mutable reachable: bool;
}
and instruction = (reg list * reg list)
(* lhs variables, variables on rhs. *)
and reg = int
type idomInfo = int array (* immediate dominator *)
and dfInfo = (int list) array (* dominance frontier *)
and oneSccInfo = {
nodes: int list;
headers: int list;
backEdges: (int*int) list;
}
and sccInfo = oneSccInfo list
val add_ssa_info: cfgInfo -> unit
val stronglyConnectedComponents: cfgInfo -> bool -> sccInfo
val prune_cfg: cfgInfo -> cfgInfo
|