@@ -92,7 +92,64 @@ To be documented.
92
92
93
93
\subsection analyses-dependence-graph Data- and control-dependence analysis (dependence_grapht)
94
94
95
- To be documented.
95
+ ### Dependence graph
96
+
97
+ Implemented in ` src/analyses/dependence_graph.h(cpp) ` . It is a graph and an
98
+ abstract interpreter in the same time. The abstract interpretation nature
99
+ allows a dependence graph to build itself (the graph) from a given GOTO program.
100
+
101
+ A dependence graph extends the class ` grapht ` with ` dep_nodet ` as the type of
102
+ nodes (see ` src/util/graph.h ` for more details about
103
+ [ graph representation] ( ../util/README.md ) ).
104
+ The ` dep_nodet ` extends ` graph_nodet<dep_edget> ` by an iterator to a GOTO
105
+ program instruction. It means that each graph node corresponds to a particular
106
+ program instruction. A labelled edge ` (u, v) ` of a dependence graph expresses
107
+ a dependency of the program instruction corresponding to node ` u ` on the program
108
+ instruction corresponding to node ` v ` . The label of the edge (i.e. data of the
109
+ type ` dep_edget ` attached to the edge) denotes the kind of dependency. It can be
110
+ ` control-dependency ` , ` data-dependency ` , or both.
111
+
112
+ #### Control dependency
113
+
114
+ An instruction ` j ` corresponding to node ` v ` is control-dependent on instruction
115
+ ` i ` corresponding to node ` u ` if and only if ` j ` post-dominates at least one
116
+ but not all successors instructions of ` i ` .
117
+
118
+ An instruction ` j ` post-dominates an instruction ` i ` if and only if each
119
+ execution path going through ` i ` eventually reaches ` j ` .
120
+
121
+ Post-dominators analysis is implemented in ` src/analyses/cfg_dominators.h(cpp) ` .
122
+
123
+ #### Data dependency
124
+
125
+ The instruction ` j ` corresponding to node ` v ` is data-dependent on the
126
+ instruction ` i ` corresponding to node ` u ` if and only if ` j ` may read data from
127
+ memory location defined (i.e. written) by ` i ` .
128
+
129
+ Reaching definitions analysis together with read-write ranges analysis are used
130
+ to check whether one instruction may read data writen by another instruction.
131
+ For more details see ` src/analyses/reaching_definitions.h(cpp) ` and
132
+ ` src/analyses/goto_rw.h(cpp) ` .
133
+
134
+ #### Construction
135
+
136
+ The dependence graph extends the standard abstract interpreter class ` ait `
137
+ with post-dominators analysis and reaching definitions analysis. The domain of
138
+ the abstract interpreter is defined in the class ` dep_graph_domaint ` .
139
+
140
+ For each instruction ` i ` there is created an instance of ` dep_graph_domaint `
141
+ associated with ` i ` . The instance stores a set ` control_deps ` of program
142
+ instructions the instruction ` i ` depends on via control-dependency, and a set
143
+ ` data_deps ` of program instructions the instruction ` i ` depends on via
144
+ data-dependency. These sets are updated (increased) during the computation,
145
+ until a fix-point is reached.
146
+
147
+ The construction of a dependence graph is started by calling its ` initialize `
148
+ method and then, once a fix-point is reached by the abstract interpreter, the
149
+ method ` finalize ` converts data in the interpreter's domain (i.e. from
150
+ ` dep_graph_domaint ` instances) into edges of the graph. Nodes of the graph are
151
+ created during the run of the abstract interpreter; they are linked to the
152
+ corresponding program instructions.
96
153
97
154
\subsection analyses-dirtyt Address-taken lvalue analysis (dirtyt)
98
155
0 commit comments