L1: goto L1
in[n] = ∪ out[p] where p ∈ pred[n] out[n] = gen[n] ∪ (in[n] - kill[n])(where ∪ is the "big cup" - see p. 355)
t1 ← i * 4 t2 ← a + t1 t3 ← i * 4 t4 ← a + t3 z ← t2 * t4
in[n] = ∩ out[p] for p ∈ pred[n] out[n] = gen[n] ∪ (in[n] - kill[n])
in[n] = gen[n] ∪ (out[n] - kill[n]) out[n] = ∪ in[s] for s ∈ succ[n]
n: w ← x ⊕ y n': v ← w
s: t ← w
s : a ← b ⊕ cor
s : a ← M[x]where a is not live-out from s, then s can be deleted
a(x) + b(y)
(in C, C++, most languages)
might execute a
before or after b
x++ + ++x
has no defined value - there is no ordering on
the computation of the x++
vs. the ++x
or
which value is used for x
when computing the other subterm
p.x ← 5 q.x ← 7 a ← p.x
M[a] ← b gen: {} kill: {M[x] | a may alias x at s}
1: u ← M[t] 2: M[x] ← r 3: w ← M[t] 4: b ← u + wif can show t may-alias x is false at statement 2; this means u and w are the same, so can apply copy-propagation to get
1: z ← M[t] 2: M[x] ← r 4: b ← z + z