# ssa form without dominators

## muth@cs.arizona.edu (Robert M. Muth)16 May 1999 15:14:17 -0400

From comp.compilers

Related articles
ssa form without dominators muth@cs.arizona.edu (1999-05-16)
| List of all articles for this month |

 From: muth@cs.arizona.edu (Robert M. Muth) Newsgroups: comp.compilers Date: 16 May 1999 15:14:17 -0400 Organization: University of Arizona, Computer Science Keywords: analysis, question

I have been playing with SSA forms for a while and found it cumbersome
to compute dominators and dominator frontiers in order to determine
the insertion points for phi definitions.

Recently, I came up with a simple algorithm that will do without
explicitly computing dominators and dominator frontiers. It works
quite well in practice even though it might not be quite as efficient.

I am curious whether this is a new idea. If not I would appreciate
pointers to the literature.

A short description (simplified for presentation)
of the algorithm follows

Thanks,

Robert
====================================================

STEP 1: Propagate defintions through CFG using a
data flow analysis

The meet lattice is depicted below:

top
/ | \
def1 def2 ...
\ | /
bot

def1, def2, ... are definitions of (assignments to) the
variable which is to be transformed into SSA form.
They can be thought of as program points inside
of basic blocks where the assignment occurs.
phi definitions are also considered to be definitions.
We assume that there is a definition in the init node
and that all node are reachable from the init node.

The fixpoint computation is initialized as follows
n denotes a node (basic block) of the CFG.

In[n] := bot
Def[n] := last definition of the variable in n or bot otherwise
Out[n] := bot

The fixpoint equations are shown below

Out[n] := IF Def[n] = bot THEN In[n] ELSE Def[n] ENDIF
In[n] := Meet { Out[p] | p is Predecessor of n}

After the fixpoint computation Out[n] != bot and In[n] != bot
for all n (with exception of the init and exit node).

STEP 2: Determine confluence points and insert new definitions

We insert new (phi) definitions at the beginning of
those nodes with In[n]=top where at least real defintion (from the middle
of the lattice) is propagated from one of the predecessor nodes:

FOREACH n WITH In[n] = top DO
FOREACH p WITH p is predecessor of n DO
IF Out[p] != top THEN
/* n is a confluence point */
Add new (phi) definition at the
beginning of n if there is none already
BREAK;
END
END
END

STEP 3: Repeat steps 1 and 2 until no more new definition

Sanity check:
Eventually all nodes with In[n] = top should have a phi definition
at the beginning, this means that from a data flow point of view "top"
is kept from reaching any "use" of the variable to be transformed
into SSA form.
To verify this assume the contrary. Ie. after termination of step 3
there is a node with In[n] = top and without a phi definition, ie.
for all its predecessor we have Out[p] = top.
Consider a path from the init node to n. WLOG we assume that n
is the first node on the path with the said property.
Now, by construction for the previous node in the path we must
have Out[p] != top a contradiction.

Post a followup to this message