diff --git a/verfahren.pdf b/verfahren.pdf index 9497bde..0a70ad1 100644 Binary files a/verfahren.pdf and b/verfahren.pdf differ diff --git a/verfahren.tex b/verfahren.tex index 5709fe1..da861b8 100644 --- a/verfahren.tex +++ b/verfahren.tex @@ -273,6 +273,61 @@ \item Gleiche Ids $\Leftrightarrow$ gleicher Ausdruck \end{itemize} +\section{Static Single Assignment (SSA)} +\begin{itemize} + \item Jede Variable hat exakt eine starke und keine schwache Definition + \item erfordert Verwendung von $\phi$-Funktionen, die verschiedene Variablen zusammenführt +\end{itemize} + +\subsection{Konstruktion der SSA-Form} +\begin{itemize} + \item In isoliertem Grundblock trivial: Erzeugung einer neuen Variable $x_i$ bei jeder Definition + \item $\phi$-Funktionen sollten möglichst sparsam nur wenn notwendig eingefügt werden +\end{itemize} + +\subsubsection{Iteratives Dominanzgrenzenverfahren nach Cytron ($\mathcal{O}(N^2)$)} +\begin{itemize} + \item Dominanzgrenzenkriterium: Aus Definition von $v$ in Grundblock $X$ folgt eine $\phi$-Funktion für $v$ in jedem Grundblock der Dominanzgrenze von $X$ + \item Eingefügte $\phi$-Funktionen werden Variablen zugewiesen, für die das Dominanzgrenzenkriterium erneut angewendet werden muss +\end{itemize} + +\subsubsection{Wertnummerierungsverfahren nach Click} +\begin{itemize} + \item Wertnummerierung für jeden Grundblock $Z$ durchführen: \begin{itemize} + \item $\mathrm{wn}_Z(\mathrm{const}) = \mathrm{const}$ + \item Wenn $Z$ Entry-Knoten, alle Wertnummern der Tupel in $Z$ auf ungültig setzen + \item Bei zwei Vorgängern $X, Y$ von $Z$, welche beide bereits besucht sind:\begin{itemize} + \item Wenn $\mathrm{wn}_X(t) \neq \mathrm{wn}_Y(t)$, dann neue Wertnummer $x$ für $\mathrm{wn}_Z(t)$ einführen und $\mathrm{wn}_Z(t) = \phi(\mathrm{wn}_X(t), \mathrm{wn}_Y(t))$ generieren + \item Ansonsten: $\mathrm{wn}_Z(t) = \mathrm{wn}_X(t)$ + \end{itemize} + \item Bei einem Vorgänger $X$ mit undefiniertem $\mathrm{wn}_X(t)$ diesen rekursiv initialisieren + \item Bei zwei Vorgängern $X, Y$ von $Z$, wobei nur $X$ noch unbesucht ist:\begin{itemize} + \item Neue Wertnummer für $\mathrm{wn}_Z(t)$ einführen + \item Neue besondere Wertnummer für $\mathrm{wn}_X(t)$ einführen + \item Vorläufige $\phi'$-Funktion $\mathrm{wn}_Z(t) = \phi'(\mathrm{wn}_X(t), \mathrm{wn}_Y(t))$ generieren + \end{itemize} + \end{itemize} + \item Wertnummerierung für alle Tupel $t$ in $Z$ durchführen + \item Nach Durchführung für alle Blöcke, $\phi'$-Funktionen korrigieren: \begin{itemize} + \item Besondere Wertnummern in $X$ durch letzte in $X$ gültige Wertnummer ersetzen + \item Offene $\phi'$-Funktionen durch abgeschlossene $\phi$-Funktion mit ersetzten Werten ersetzen + \item Falls $t$ in unbesuchten Blöcken nicht geändert wurde, $\mathrm{wn}_Z(t) = \phi'(\mathrm{wn}_X(t),\mathrm{wn}_Y(t))$ löschen und alle Verwendungen von $\mathrm{wn}_Z(t)$ durch $\mathrm{wn}_X(t)$ ersetzen + \end{itemize} +\end{itemize} + +\subsection{Optimierungen auf SSA-Form} +\begin{itemize} + \item Konstantenweitergabe: \begin{itemize} + \item Aus $v_i = c$ können alle Verwendungen von $v_i$ durch die Konstante $c$ ersetzt werden + \item Aus $v_i = \phi(c_1, c_2, \textellipsis)$ kann $v_i$ durch $c_1$ ersetzt werden, wenn alle $c_i$ gleich sind + \item Datenflussanalyse muss nach Ersetzung nicht wiederholt werden, Worklist-Algorithmus reicht aus + \end{itemize} + \item Kopienfortschreibung: Aus $v_i = y_j$ kann jede Verwendung von $v_i$ durch $y_j$ ersetzt werden + \item Lebendigkeit einer Variable lässt sich direkt aus weiterem lesenden Zugriff erkennen + \item Gemeinsame Teilausdrücke, verfügbare Ausdrücke und vorhersehbare Ausdrücke lassen sich durch Wertnummerierung in gesamter Prozedur leicht erkennen +\end{itemize} +\subsection{Rücktransformation aus SSA-Form} + \section{Aliasanalyse} \section{Induktionsvarianten und schleifeninvarianter Code}