LARA

Phi Functions in SSA Form

Consider translating

s = y
if (x < 0) {
  res = - x
  s = s -1
} else {
  res = x
  s = s + 1
}
p = res * s

We could rename each block:

s0 = y
if (x < 0) {
  res0 = - x
  s1 = s0 -1
} else {
  res1 = x
  s2 = s0 + 1
}
p = res? * s?

We need to express somehow that either res0 or res1 can be used in m, and similarly either s1 or s2. We use $\phi$ functions for this purpose.

Translate

m(res,s)

into

res2 = phi(res0,res1)
s3 = phi(s1,s2)
p = res2 * s3

This denotes that the value of res2 will be res0 when the control comes from one branch and res1 if it comes from another branch. Similarly for s.

(Suppose we have a loop around this. What is the resulting CFG with phi nodes?)

For Which Variables to Insert Phi Functions

If a variable is not assigned on some path, we need not insert a phi function for it

We insert phi function for variable 'a' in the “first” node z where paths from different assignments to 'a' merge, i.e.

  • there is a definition of 'a' in two different nodes, x, y, with two non-empty paths Pxz, Pyz
  • the paths Pxz, Pyz have no node in common except z
  • in at least one of Pxz,Pyz z appears only as the last node

Inserted phi function becomes a new assignment, so we need to apply the criterion again (until we reach fixpoint)

Most efficient algorithms (nearly linear) for SSA form use dominator nodes in graphs