Folien VL-04 zusammengefasst

This commit is contained in:
Marco Ammon 2020-08-11 13:17:59 +02:00
parent b280f71904
commit 5a67af60ec
2 changed files with 135 additions and 4 deletions

Binary file not shown.

View File

@ -135,11 +135,142 @@
\end{itemize}
\section{Datenflussanalyse}
\subsection{Datenabhängigkeiten}
\begin{itemize}
\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}