\item Kontrollflussabhängigkeit: Bei Verzweigungsknoten $v$ mit direkten Nachfolgern $a$ und $b$: $y$ kontrollflussabhängig von $v$$\Leftrightarrow$ mindestens ein Pad von $a$ zum Exit-Knoten ohne $y$ und jeder Pfad von $b$ zum Exit-Knoten über $y$
\item mit $\mathcal{O}(\vert E\vert\vert N\vert^2)$
\item Zunächst Überapproximation der Dominatorenmenge
\item Initialisierung aller $D(n)\in N$ mit $N$ außer Startknoten $S$ mit $D(S)= S$
\item Bis Fixpunkt erreicht ist: alle $D(n)$ zu $D'(n)=\lbrace n\rbrace\cup\bigcap_{(p, n)\in E} D(p)$
\item$n$ am besten in Tiefensuchereihenfolge durchlaufen
\end{itemize}
\paragraph{Verfahren mit Spannendem Tiefenbaum $T$}
\begin{itemize}
\item Besuch des KFG in Tiefensuchereihenfolge mit zugehöriger Nummerierung: \begin{itemize}
\item\enquote{Spannende} Kanten gehen zu frisch nummerierten Knoten
\item Rückschreitende Kanten gehen zu Vorgänger (kleinere DFS-Nummer) in $T$
\item Fortschreitende Kanten gehen zu Nachfolger (größere DFS-Nummer) in $T$
\item Kreuzkanten führen in früher besuchten Ast in $T$
\end{itemize}
\item Dominatoren $D(n)$ liegen auf jeden Fall \enquote{über}$n$ in $T$
\item Berechnung der Semidominatoren $\mathrm{SemDom}\lbrack w\rbrack$ in Reihenfolge fallender DFS-Nummern: \begin{itemize}
\item Direkte Vorgänger auf $T$ sind Kandidaten
\item$\min_{u\in\mathrm{Pred}(w)}\mathrm{SemDom}\lbrack u\rbrack$ ist Kandidat
\item Minimum der Kandidaten ist $\mathrm{SemDom}\lbrack w\rbrack$
\end{itemize}
\item Berechnung von $\mathrm{ImmDom}\lbrack w\rbrack$ durch Durchlaufen in Tiefenordnung von $\mathrm{SemDom}\lbrack w\rbrack$ nach $w$:\begin{itemize}
\item Jeweils alle Vorgänger $u$ untersuchen und $u$ mit kleinstem $\mathrm{SemDom}\lbrack u\rbrack$ finden
\item\begin{equation*}
\mathrm{ImmDom}\lbrack w\rbrack = \begin{cases}
\mathrm{SemDom}\lbrack u\rbrack&\mathrm{falls}\,\mathrm{SemDom}\lbrack w\rbrack = \mathrm{SemDom}\lbrack u \rbrack\\
\mathrm{ImmDom}\lbrack u\rbrack&\mathrm{sonst}
\end{cases}
\end{equation*}
\end{itemize}
\end{itemize}
\subsubsection{Dominanzgrenze}
\begin{itemize}
\item Dominanzgrenze $DG[x]$ enthält Knoten $y$, die einen von $x$ dominierten Vorgänger besitzen, aber nicht von $x$ streng dominiert werden
\item Erkennung durch Prüfung der Reduzierbarkeit des Graphs: \begin{itemize}
\item Entfernung der Rückwärtskanten aus KFG $\rightarrow$ azyklischer Graph, in dem jeder Knoten von der Wurzel erreicht werden kann $\Leftrightarrow$ KFG frei von unnatürlichen Schleifen
\item Alternative mit Transformationen: Am Ende Graph aus einem einzigen Knoten $\Leftrightarrow$ KFG reduzierbar (ohne Zyklen) \begin{description}
\item[T1-Transformation] Selbstschleifen aus Graph löschen
\item[T2-Transformation] Knoten mit eindeutigem Vorgänger mit diesem zusammenfassen
\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