HOME

TheInfoList



OR:

In
compiler theory In computing, a compiler is a computer program that Translator (computing), translates computer code written in one programming language (the ''source'' language) into another language (the ''target'' language). The name "compiler" is primaril ...
, dependence analysis produces execution-order constraints between statements/instructions. Broadly speaking, a statement ''S2'' depends on ''S1'' if ''S1'' must be executed before ''S2''. Broadly, there are two classes of dependencies--control dependencies and data dependencies. Dependence analysis determines whether it is safe to reorder or parallelize statements.


Control dependencies

Control dependency is a situation in which a program instruction executes if the previous instruction evaluates in a way that allows its execution. A statement ''S2'' is ''control dependent'' on ''S1'' (written S1\ \delta^c\ S2) if and only if ''S2s execution is conditionally guarded by ''S1''. ''S2'' is ''control dependent'' on ''S1'' if and only if S1 \in PDF(S2) where PDF(S) is the post dominance frontier of statement S. The following is an example of such a control dependence: S1 if x > 2 goto L1 S2 y := 3 S3 L1: z := y + 1 Here, ''S2'' only runs if the predicate in ''S1'' is false.


Data dependencies

A data dependence arises from two statements which access or modify the same resource.


Flow(True) dependence

A statement ''S2'' is flow dependent on ''S1'' (written S1\ \delta^f\ S2) if and only if ''S1'' modifies a resource that ''S2'' reads and ''S1'' precedes ''S2'' in execution. The following is an example of a flow dependence (RAW: Read After Write): S1 x := 10 S2 y := x + c


Antidependence

A statement ''S2'' is antidependent on ''S1'' (written S1\ \delta^a\ S2) if and only if ''S2'' modifies a resource that ''S1'' reads and ''S1'' precedes ''S2'' in execution. The following is an example of an antidependence (WAR: Write After Read): S1 x := y + c S2 y := 10 Here, ''S2'' sets the value of y but ''S1'' reads a prior value of y.


Output dependence

A statement ''S2'' is output dependent on ''S1'' (written S1\ \delta^o\ S2) if and only if ''S1'' and ''S2'' modify the same resource and ''S1'' precedes ''S2'' in execution. The following is an example of an output dependence (WAW: Write After Write): S1 x := 10 S2 x := 20 Here, ''S2'' and ''S1'' both set the variable x.


Input dependence

A statement ''S2'' is input dependent on ''S1'' (written S1\ \delta^i\ S2) if and only if ''S1'' and ''S2'' read the same resource and ''S1'' precedes ''S2'' in execution. The following is an example of an input dependence (RAR: Read-After-Read): S1 y := x + 3 S2 z := x + 5 Here, ''S2'' and ''S1'' both access the variable x. This dependence does not prohibit reordering.


Loop dependencies

The problem of computing dependencies within loops, which is a significant and nontrivial problem, is tackled by loop dependence analysis, which extends the dependence framework given here.


See also

* Program analysis (computer science) * Automatic parallelization *
Automatic vectorization Automatic vectorization, in parallel computing, is a special case of automatic parallelization, where a computer program is converted from a scalar implementation, which processes a single pair of operands at a time, to a vector implementatio ...
* Loop dependence analysis * Frameworks supporting the polyhedral model *
Hazard (computer architecture) In the domain of central processing unit (CPU) design, hazards are problems with the instruction pipeline in CPU microarchitectures when the next instruction cannot execute in the following clock cycle, and can potentially lead to incorrect compu ...
* Program slicing *
Dead code elimination In compiler theory, dead-code elimination (DCE, dead-code removal, dead-code stripping, or dead-code strip) is a compiler optimization to remove dead code (code that does not affect the program results). Removing such code has several benefits: i ...


Further reading

* * * {{Program analysis Static program analysis