Content deleted Content added
No edit summary |
improve typesetting of constants and variables |
||
(30 intermediate revisions by 23 users not shown) | |||
Line 1:
In [[
== Example ==▼
Consider the following program:
The set of live variables
▲== Example ==
Note that the assignment to <code>a</code> may be eliminated as <code>a</code> is not used later, but there is insufficient information to justify removing all of line 3 as <code>f</code> may have [[Side effect (computer science)|side effects]] (printing <code>b * c</code>, perhaps).
▲ L1: b := 3;
▲ L2: c := 5;
▲ L3: a := f(b + c);
▲The set of live variables at line L3 is {<code>b</code>, <code>c</code>} because both are used in the addition, and thereby the call to <code>f</code> and assignment to <code>a</code>. But the set of live variables at line L1 is
== Expression in terms of dataflow equations ==
Liveness analysis is a "backwards may"
The dataflow equations used for a given basic block
:<math>
{\mbox{GEN}}[s] </math>: The set of variables that are used in s before any assignment in the same basic block.
:<math>
{\mbox{KILL}}[s] </math>: The set of variables that are assigned a value in s (in many books
:<math>
{\mbox{LIVE}}_{\mathrm{in}}[s] = {\mbox{GEN}}[s] \cup ({\mbox{LIVE}}_{\mathrm{out}}[s] - {\mbox{KILL}}[s])
</math>
:<math>
{\mbox{LIVE}}_{\mathrm{out}}[\mathit{final}] = {\emptyset}
</math>
:<math>
{\mbox{LIVE}}_{\mathrm{out}}[s] = \bigcup_{p \in \mathrm{succ}[
</math>
Line 49 ⟶ 43:
The in-state of a block is the set of variables that are live at the start of the block. Its out-state is the set of variables that are live at the end of it. The out-state is the union of the in-states of the block's successors. The transfer function of a statement is applied by making the variables that are written dead, then making the variables that are read live.
== Second example ==
{|
|
// in: {}; predecessor blocks: none
b1: a = 3;
b = 5;
Line 62 ⟶ 55:
// out: {a,b,d} //union of all (in) successors of b1 => b2: {a,b}, and b3:{b,d}
// in: {a,b}; predecessor blocks: b1
b2: c = a + b;
d = 2;
// out: {b,d}
// in: {b,d}; predecessor blocks: b1 and b2
b3: endif
c = 4;
Line 117 ⟶ 110:
==References==
{{reflist|30em}}
{{cite book|last1=Aho|first1=Alfred|last2=Lam|first2=Monica|last3=Sethi|first3=Ravi|last4=Ullman|first4=Jeffrey|year=2007|edition=2|title=Compilers: Principles, Techniques, and Tools|page=608}}
{{Compiler optimizations}}
[[Category:Compiler optimizations]]
[[Category:Data-flow analysis]]
[[Category:Static program analysis]]
|