\begin{algorithm}
\caption{Intraprocedural Context-Insensitive Whole-Program Pointer Analysis}
\begin{algorithmic}
\INPUT Set of statements of the input program $S$.
\OUTPUT Pointer flow graph $PFG$ and point-to set of each pointer $x$ denoted by $pt(x)$.
\STATE $WL := []$ \COMMENT{work list, initialized as empty}
\STATE $PFG := \{\}$ \COMMENT{pointer flow graph, initialized as empty}
\FOR{\textbf{each} pointer $x \in S$}
\STATE $pt(x) := \{\}$ \COMMENT{point-to set of each pointer, initialized as empty}
\ENDFOR
\STATE
\PROCEDURE{Solve}{$S$} \COMMENT{main algorithm}
\FOR{\textbf{each} $i:x = new\ T() \in S$}
\STATE add $(x, \{o_i\})$ to $WL$
\ENDFOR
\FOR{\textbf{each} $x = y \in S$}
\STATE \CALL{AddEdge}{$y, x$}
\ENDFOR
\WHILE{$WL$ \textbf{is not} empty}
\STATE remove $(n, pts)$ from $WL$
\STATE $\Delta := pts - pt(n)$
\STATE \CALL{Propagate}{$n, \Delta$}
\IF{$n$ represents a variable $x$}
\FOR{\textbf{each} $o_i \in \Delta$}
\FOR{\textbf{each} $x.f = y \in S$}
\STATE \CALL{AddEdge}{$y, o_i.f$}
\ENDFOR
\FOR{\textbf{each} $y = x.f \in S$}
\STATE \CALL{AddEdge}{$o_i.f, y$}
\ENDFOR
\ENDFOR
\ENDIF
\ENDWHILE
\ENDPROCEDURE
\STATE
\PROCEDURE{AddEdge}{$s, t$}
\IF{$s \to t \notin PFG$}
\STATE add $s \to t$ to $PFG$
\IF{$pt(s)$ \textbf{is not} empty}
\STATE add $(t, pt(s))$ to $WL$
\ENDIF
\ENDIF
\ENDPROCEDURE
\STATE
\PROCEDURE{Propagate}{$n, pts$}
\IF{$pts$ \textbf{is not} empty}
\STATE $pt(n) = pt(n) \cup pts$
\FOR{\textbf{each} $n\to s\in PFG$}
\STATE add $(s, pts)$ to $WL$
\ENDFOR
\ENDIF
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}