diff --git a/verfahren.pdf b/verfahren.pdf index 9520abc..9497bde 100644 Binary files a/verfahren.pdf and b/verfahren.pdf differ diff --git a/verfahren.tex b/verfahren.tex index 82f2e6a..5709fe1 100644 --- a/verfahren.tex +++ b/verfahren.tex @@ -135,11 +135,142 @@ \end{itemize} \section{Datenflussanalyse} -\subsection{Datenabhängigkeiten} \begin{itemize} - \item Schreiben vor Lesen: - \item Schreiben vor Schreiben: Ausgabeabhängigkeit - \item Lesen vor Schreiben: Anti-Abhängigkeit + \item Datenabhängigkeiten: \begin{itemize} + \item Schreiben vor Lesen: + \item Schreiben vor Schreiben: Ausgabeabhängigkeit + \item Lesen vor Schreiben: Anti-Abhängigkeit + \end{itemize} + \item Starke Variablendefinition: sichere Zuweisung zu einer Variablen + \item Schwache Variablendefinition: mögliche Zuweisung zu einer Variablen (etwa über Zeiger oder Referenz, die möglicherweise auf Variable zeigen) +\end{itemize} + +\subsection{Berechnung von Datenflusswissen} +\begin{itemize} + \item Funktion pro Grundblock: \begin{itemize} + \item Eingabe: bei Vorwärtsproblem (Rückwärtsproblem) Datenflusswissen der Vorgängerknoten (Nachfolgerknoten) + \item Vorverarbeitung: logische Operationen oder Mengenoperationen \begin{itemize} + \item sicher (must): Eigenschaft muss auf allen Eingangskanten erfüllt sein + \item möglich (may): Eigenschaft muss auf mindestens einer Eingangskante erfüllt sein + \end{itemize} + \item Ausgabe: auf Eingabe und in Grundblock enthaltenen Befehlen basierendes, aktualisiertes Datenflusswissen + \end{itemize} + \item Iterativer Fixpunkt-Algorithmus für Vorwärtsproblem: optimal Besuch in Reihenfolge des spannenden Tiefenbaums \begin{algorithmic}[] + \State $\mathrm{in}(\mathrm{Entry}) \gets \mathrm{Init}$ + \ForAll{$n \in N \setminus \lbrace \mathrm{Entry}\rbrace$} + \State $\mathrm{in}(n) \gets \bot$ + \EndFor + \State $\mathrm{WL} \gets N\setminus \lbrace \mathrm{Entry}\rbrace$ + \While{$\mathrm{WL} \neq \emptyset$} + \State $B \gets \mathrm{pop}(\mathrm{WL})$ + \State $\mathrm{out} \gets f_B(\mathrm{in}(B))$ + \ForAll{$B' \in \mathrm{Succ}(B)$} + \State $\mathrm{in}(B') \gets \mathrm{in}(B') \sqcup \mathrm{out}$ + \If{$\mathrm{out} \neq \mathrm{out}(B)$} + \State $\mathrm{WL} \gets \mathrm{WL} \cup \lbrace B'\rbrace$ + \State $\mathrm{out}(B) \gets \mathrm{out}$ + \EndIf + \EndFor + \EndWhile + \end{algorithmic} + \item Probleme bei Verwendung von Bitvektoren:\begin{itemize} + \item Transformation erfordert komplettes Neuberechnen + \item Bitvektoren oft zu groß für jeweilige Nutzungsstelle + \end{itemize} + \item Alternative Datenstrukturen: \begin{itemize} + \item Definitions-Nutzungs-Graph für erreichbare Nutzungen + \item Nutzungs-Definitions-Graph für erreichenden Definitionen + \item Variablen-Netz als Vereinigung aller sich schneidenden DU-Graphen + \item Single Static-Assignment (SSA) + \end{itemize} +\end{itemize} + +\subsection{Typische Datenflussprobleme} +\begin{itemize} + \item Erreichende Definitionen: \begin{itemize} + \item mindestens ein Pfad, auf dem Variable nicht erneut schwach definiert wird + \item Optimierungen: \begin{itemize} + \item Keine erreichende Definition $\rightarrow$ Variable nicht initialisiert + \item Genau eine oder gleiche Definition $\rightarrow$ Konstantenweitergabe oder Kopienfortschreibung möglich + \item Alle Variablen nur außerhalb einer Schleife definiert $\rightarrow$ Ausdruck schleifeninvariant + \end{itemize} + \item Umsetzung: \begin{itemize} + \item Eine Bitposition pro Variablendefinition + \item Setzen bei Definition der Variable + \item Zurücksetzen bei mindestens schwacher Definition + \item Anfangsbelegung: false + \item Vorverarbeitung: oder + \end{itemize} + \end{itemize} + \item Konstantenweitergabe: \begin{itemize} + \item Eine Bitposition plus Wert pro Variable + \item Setzen von Bit und Wert bei konstanter Definition + \item Zurücksetzen von Bit bei mindestens schwacher oder nicht konstanter Definition + \item Anfangsbelegung: false, ? + \item Vorverarbeitung: und sowie Wertgleichheit + \end{itemize} + \item Kopienfortschreibung: \begin{itemize} + \item Eine Bitposition pro aus Kopieren entstandener Wergleichtheitsbeziehung + \item Setzen bei Kopieroperation + \item Zurücksetzen wenn Original oder Kopie mindestens schwach definiert wird + \item Anfangsbelegung: false + \item Vorverarbeitung: und + \end{itemize} + \item Verfügbare Ausdrücke: \begin{itemize} + \item auf allen Pfaden von Entry-Knoten aus wird Ausdruck bestimmt und verwendete Variablen anschließend nicht mehr schwach definiert + \item Optimierungen: \begin{itemize} + \item Elimination gleicher Teilausdrücke + \item Wiederverwendung statt Neuberechnung + \end{itemize} + \item Umsetzung: \begin{itemize} + \item Eine Bitposition pro wertnummeriertem (Teil-)Ausdruck + \item Setzen wenn Ausdruck ausgewertet wird + \item Zurücksetzen wenn vorkommende Variable mindestens schwach definiert wird + \item Anfangsbelegung: false + \item Vorverarbeitung: und sowie Ausdruck muss auf allen Pfaden verfügbar sein + \end{itemize} + \end{itemize} + \item Lebendige Variablen: \begin{itemize} + \item lebendig in Knoten $D$, wenn es einen Pfad von $D$ zum Exit-Knoten gibt, auf der die Variable ohne vorherige Redefinition schwach benutzt wird; sonst tot + \item Optimierungen: \begin{itemize} + \item Tote Variablen müssen nicht ausgerechnet werden + \item Weniger Registerdruck + \item Elimination redudanter Schleifenlaufvariablen nach der Schleife + \end{itemize} + \item Umsetzung: \begin{itemize} + \item Eine Bitposition pro Variable + \item Setzen bei Verwendung der Variable + \item Zurücksetzen bei starker Redefinition + \item Anfangsbelegung: false + \item Vorverarbeitung: oder + \end{itemize} + \end{itemize} + \item Erreichbare Nutzungen: \begin{itemize} + \item Alle Nutzungen einer Variable durch Bestimmen der Pfade, auf denen Variable ohne vorherige Redefinition verwendet wird + \item Zweck: Hilfreich für Lebendigkeitsspannen und Registerallokation + \end{itemize} + \item Vorhersehbare Ausdrücke: \begin{itemize} + \item auf allen Pfaden zum Exit-Knoten wird Ausdruck bestimmt und verwendete Variablen werden nicht vorher schwach redefiniert + \item Optimierungen: \begin{itemize} + \item Vorziehen der Ausdrucksberechnung zur Verkleinerung der Code-Größe + \item Geringerer Registerdruck in folgenden Zweigen + \end{itemize} + \item Umsetzung: \begin{itemize} + \item Eine Bitposition pro (Teil-)Ausdruck + \item Setzen bei Auswertung des Audrucks + \item Zurücksetzen bei mindestens schwacher Redefinition einer der verwendeten Variablen + \item Anfangsbelegung: false + \item Vorverarbeitung: und + \end{itemize} + \end{itemize} +\end{itemize} + +\section{Wertnummerierung in Grundblock} +\begin{itemize} + \item Post-Order-Traversierung des Ausdrucksbaums + \item Jede referenzierte Variable bekommt eindeutige Id + \item Kombination aus Operator und beiden Argumenten bekommt entweder frische Id oder bei Duplikat (auch kommutativ) bereits verwendete + \item Gleiche Ids $\Leftrightarrow$ gleicher Ausdruck \end{itemize} \section{Aliasanalyse}