Compare commits

..

6 Commits

Author SHA1 Message Date
Marco Ammon
189efa44a0 DFA-Aliasanalyse erweitert 2020-08-15 16:12:21 +02:00
Marco Ammon
90c056842b Wertnummerierungsverfahren aus Übung hinzugefügt 2020-08-15 12:47:34 +02:00
Marco Ammon
32597233c6 Kleinere Fehler behoben 2020-08-15 11:21:55 +02:00
Marco Ammon
09ecc56528 Fixes 2020-08-14 18:12:23 +02:00
Marco Ammon
94ef4dd194 Korrektur Herausziehbarkeit 2020-08-14 15:02:26 +02:00
Marco Ammon
a0347487b1 Steensgard konkretisiert 2020-08-14 13:04:33 +02:00
2 changed files with 80 additions and 16 deletions

Binary file not shown.

View File

@@ -212,7 +212,7 @@
\item Vorverarbeitung: und sowie Wertgleichheit \item Vorverarbeitung: und sowie Wertgleichheit
\end{itemize} \end{itemize}
\item Kopienfortschreibung: \begin{itemize} \item Kopienfortschreibung: \begin{itemize}
\item Eine Bitposition pro aus Kopieren entstandener Wergleichtheitsbeziehung \item Eine Bitposition pro aus Kopieren entstandener Wertgleichtheitsbeziehung
\item Setzen bei Kopieroperation \item Setzen bei Kopieroperation
\item Zurücksetzen wenn Original oder Kopie mindestens schwach definiert wird \item Zurücksetzen wenn Original oder Kopie mindestens schwach definiert wird
\item Anfangsbelegung: false \item Anfangsbelegung: false
@@ -316,6 +316,51 @@
\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 \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}
\end{itemize} \end{itemize}
\newpage
\subsubsection{Wertnummerierungsverfahren nach Click/Braun (aus Übung)}
\begin{algorithmic}
\Function{Visit}{Basisblock $b$}
\State Wertnummerierung mit ReadVar/WriteVar durchführen
\ForAll{KFG-Nachfolger $s$ von $b$}
\If{$b$ ist letzter Vorgänger (höchste Tiefensuchnummer) von $s$}
\State \Call{Seal}{$s$}
\EndIf
\If{$s$ noch nicht besucht}
\State \Call{Visit}{$s$}
\EndIf
\EndFor
\EndFunction
\Statex
\Function{Seal}{Basisblock $b$}
\ForAll{vorläufige $\phi$-Funktion für Variable $v$ in $b$}
\ForAll{KFG-Vorgänger $p$ von $b$}
\State \Call{ReadVar}{$v$, $p$} als Operand zu $\phi$-Funktion hinzufügen
\EndFor
\EndFor
\EndFunction
\Statex
\Function{WriteVar}{Variable $v$, Basisblock $b$}
\State \Return nächste frische Wertnummer für $v$
\EndFunction
\Statex
\Function{ReadVar}{Variable $v$, Basisblock $b$}
\If{$b$ enthält bereits Wertnummer für $v$}
\State \Return Wertnummer für $v$ in $b$
\EndIf
\If{$b$ ist noch nicht versiegelt}
\State vorläufige $\phi$-Funktion mit nächster Wertnummer für $v$ in $b$ einfügen
\State \Return Wertnummer der $\phi$-Funktion
\ElsIf{$b$ hat nur einen Vorgänger $p$}
\State \Return \Call{ReadVar}{$v$, $p$}
\Else
\State $phi$-Funktion mit nächster Wertnummer für $v$ in $b$ in einfügen
\ForAll{KFG-Vorgänger $p$ von $b$}
\State \Call{ReadVar}{$v$, $p$} als Operand zu $\phi$-Funktion hinzufügen
\EndFor
\State \Return Wertnummer der $\phi$-Funktion
\EndIf
\EndFunction
\end{algorithmic}
\subsection{Optimierungen auf SSA-Form} \subsection{Optimierungen auf SSA-Form}
\begin{itemize} \begin{itemize}
@@ -449,6 +494,7 @@
\mathit{Ptr}(P',x) & sonst \mathit{Ptr}(P',x) & sonst
\end{cases*} \end{cases*}
\end{equation*} \end{equation*}
\item Bei Flussfunktion $\mathit{ptr}_P(*c)$ für alle $k \in \mathit{Ptr}(P, c)$ Wissen $\mathit{Ptr}(P, k)$ berechnen
\end{itemize} \end{itemize}
\end{itemize} \end{itemize}
@@ -510,19 +556,19 @@
\item $a = \&b$: Kante zwischen $a$ und $b$ einfügen; sofern bereits Kante zwischen $a$ und $x$ existiert, rekursives Verschmelzen von $x$ und $b$ \item $a = \&b$: Kante zwischen $a$ und $b$ einfügen; sofern bereits Kante zwischen $a$ und $x$ existiert, rekursives Verschmelzen von $x$ und $b$
\item $a = b$:\begin{itemize} \item $a = b$:\begin{itemize}
\item $b$ ist Zeiger: Verschmelzen der Ziele von $a$ und $b$, anschließend zeigen beide auf diesen Knoten \item $b$ ist Zeiger: Verschmelzen der Ziele von $a$ und $b$, anschließend zeigen beide auf diesen Knoten
\item $b$ ist kein Zeiger bzw. noch nicht erkannt: Annotiere $b$ mit $(a:b)$ (Falls später Zeigerziel $y$ von $b$ entdeckt wird, muss Kante von $a$ nach $y$ ergänzt werden) \item $b$ ist kein Zeiger bzw. noch nicht erkannt: Annotiere $b$ mit $\lbrace a = b\rbrace$ (Falls später Zeigerziel $y$ von $b$ entdeckt wird, muss Kante von $a$ nach $y$ ergänzt werden)
\end{itemize} \end{itemize}
\item $a = *b$: \begin{itemize} \item $a = *b$: \begin{itemize}
\item $b$, $*b$ haben bereits ausgehende Kanten: Kante zwischen $a$ und $**b$ ergänzen \item $b$, $*b$ haben bereits ausgehende Kanten: Kante zwischen $a$ und $**b$ ergänzen
\item sonst: analog zu $a = b$ mit adäquaten Annotationen (TODO: Übung) \item sonst: analog zu $a = b$ mit adäquaten Annotationen
\end{itemize} \end{itemize}
\item $*a = b$: \begin{itemize} \item $*a = b$: \begin{itemize}
\item $a$, $*a$ mit ausgehenden Kanten: rekursives Verschmelzen von $*b$ und $**a$ \item $a$, $*a$ mit ausgehenden Kanten: rekursives Verschmelzen von $*b$ und $**a$
\item $a$ noch ohne ausgehende Kante: Annotation von $a$ mit $(b:*a)$ \item $a$ noch ohne ausgehende Kante: Annotation von $a$ mit $\lbrace *a = b\rbrace$
\end{itemize} \end{itemize}
\item $a = b \oplus c$ mit $\oplus$ binärer Operation: \begin{itemize} \item $a = b \oplus c$ mit $\oplus$ binärer Operation: \begin{itemize}
\item $a$, $b$, $c$ keine Zeiger: Annotation von $b$ und $c$ mit $(a:b)$ bzw. $(a:c)$ \item $a$, $b$, $c$ nicht als Zeiger erkannt: Annotation von $b$ und $c$ mit $\lbrace a= b\rbrace$ bzw. $\lbrace a= c\rbrace$
\item $b$ oder $c$ Zeiger: Kante von $a$ nach $*b$ hinzufügen, $c$ mit $(a:c)$ annotieren \item $b$ oder $c$ Zeiger: Kante von $a$ nach $*b$ hinzufügen, $c$ mit $\lbrace a = b\rbrace$ annotieren
\end{itemize} \end{itemize}
\item $x = p(y_1, \textellipsis, y_n)$ mit Funktion $p(z_1, \textellipsis, z_n)$ \begin{enumerate} \item $x = p(y_1, \textellipsis, y_n)$ mit Funktion $p(z_1, \textellipsis, z_n)$ \begin{enumerate}
\item Zuweisungsregeln $z_i = y_i$ verwenden \item Zuweisungsregeln $z_i = y_i$ verwenden
@@ -559,7 +605,7 @@
\item Bestimmung der Schleifenausgänge, also Knoten, die KFG-Nachfolger außerhalb der natürlichen Schleife besitzen \item Bestimmung der Schleifenausgänge, also Knoten, die KFG-Nachfolger außerhalb der natürlichen Schleife besitzen
\item Alle Anforderungen an Zuweisungen müssen für Herausziehbarkeit gelten:\begin{itemize} \item Alle Anforderungen an Zuweisungen müssen für Herausziehbarkeit gelten:\begin{itemize}
\item schleifeninvariant \item schleifeninvariant
\item in Grundblock, der alle Schleifenausgänge dominiert und alle die Variable nutzenden Blöcke strikt dominiert \item in Grundblock, der alle Schleifenausgänge, nach denen die Variable lebendig ist, dominiert und alle die Variable nutzenden Blöcke strikt dominiert (oder in definierendem Block nach Definition auftritt)
\item einzige Zuweisung zu Variable in der ganzen Schleife \item einzige Zuweisung zu Variable in der ganzen Schleife
\end{itemize} \end{itemize}
\item Herausziehen vor den Schleifenkopf in Breitensuchreihenfolge zur Bewahrung der Datenabhängigkeiten zwischen herausgezogenen Zuweisungen \item Herausziehen vor den Schleifenkopf in Breitensuchreihenfolge zur Bewahrung der Datenabhängigkeiten zwischen herausgezogenen Zuweisungen
@@ -665,7 +711,8 @@
\subsection{Indexanalyse} \subsection{Indexanalyse}
\begin{itemize} \begin{itemize}
\item Bestimmung, ob 2 Array-Zugriffe selbe bzw. unterschiedliche Elemente ansprechen: Grundannahme pessimistisch (gleiches Element) \item Bestimmung, ob 2 Array-Zugriffe selbe bzw. unterschiedliche Elemente ansprechen: Grundannahme pessimistisch (gleiches Element)
\item Für 2 Array-Zugriffe $S1: A[f_1(i_1, \textellipsis, i_d), \textellipsis, f_m(i_1, \textellipsis, i_d)]$ und $S2: A[f_1(i_1, \textellipsis, i_d), \textellipsis, f_m(i_1, \textellipsis, i_d)]$ gilt $S1 \delta S2$ $\Leftrightarrow$:\begin{itemize} \item Für 2 Array-Zugriffe $S1$ $A[f_1(i_1, \textellipsis, i_d), \textellipsis, f_m(i_1, \textellipsis, i_d)]$ und\\
$S2$ $A[g_1(i_1, \textellipsis, i_d), \textellipsis, g_m(i_1, \textellipsis, i_d)]$ gilt $S1 \delta S2$ $\Leftrightarrow$:\begin{itemize}
\item mindestens ein Schreibzugriff \item mindestens ein Schreibzugriff
\item $\exists I, J: I=(i_1, \textellipsis, i_d) \angle J =(j_1, \textellipsis, j_d)$ mit $I, J$ innerhalb der Schleifengrenzen (Ungleichunssystem mit Nebenbedingungen) \item $\exists I, J: I=(i_1, \textellipsis, i_d) \angle J =(j_1, \textellipsis, j_d)$ mit $I, J$ innerhalb der Schleifengrenzen (Ungleichunssystem mit Nebenbedingungen)
\item $\forall p: f_p(I) = g_p(J)$ (Gleichungssystem mit Schleifenlaufvariablen als Variablen und Konstanten aus linearem Index-Ausdruck als Koeffizienten) \item $\forall p: f_p(I) = g_p(J)$ (Gleichungssystem mit Schleifenlaufvariablen als Variablen und Konstanten aus linearem Index-Ausdruck als Koeffizienten)
@@ -678,13 +725,16 @@
\item Für verschiedene Arten der Abhängigkeit in obige Kriterien einsetzen \item Für verschiedene Arten der Abhängigkeit in obige Kriterien einsetzen
\end{enumerate} \end{enumerate}
\item Ungleichungstest:\begin{enumerate} \item Ungleichungstest:\begin{enumerate}
\item Ungleichungen für verwendete Variablen aufstellen \item Ungleichungen für im Code verwendete Variablen $i$ mit $i_\mathrm{w}$, $i_\mathrm{r}$ für Schreib- und Lesezugriff aufstellen:\begin{enumerate}
\item Ungleichungen für Schleifengrenzen
\item Ungleichungen für relative Beziehung von $i_\mathrm{w}$ und $i_\mathrm{r}$
\end{enumerate}
\item Gleichung für Zugriff aufstellen und so umstellen, dass 0 auf einer Seite steht \item Gleichung für Zugriff aufstellen und so umstellen, dass 0 auf einer Seite steht
\item In Gleichung jeweils untere und obere Grenzwerte einsetzen und damit ein Intervall bestimmen \item In Gleichung jeweils untere und obere Grenzwerte einsetzen und damit ein Intervall bestimmen
\item Sofern Intervall nicht 0 enthält, keine Abhängigkeit \item Sofern Intervall nicht 0 enthält, keine Abhängigkeit
\end{enumerate} \end{enumerate}
\item Fourier-Motzkin-Test: \begin{itemize} \item Fourier-Motzkin-Test: \begin{itemize}
\item Ungleichungssystem in kanonische Form überführen: \begin{itemize} \item Ungleichungssystem in kanonische Form ($\le c$, $c$ Konstante) überführen \begin{itemize}
\item $\beta < b \cdot z$ untere Schranke für $z$ mit $\beta > 0$ \item $\beta < b \cdot z$ untere Schranke für $z$ mit $\beta > 0$
\item $a \cdot z < \alpha$ obere Schranke für $z$ mit $\alpha > 0$ \item $a \cdot z < \alpha$ obere Schranke für $z$ mit $\alpha > 0$
\end{itemize} \end{itemize}
@@ -692,6 +742,22 @@
\begin{equation*} \begin{equation*}
a\cdot \beta \leq a \cdot z \cdot b \leq b\cdot \alpha \rightarrow a\cdot \beta \leq b\cdot \alpha a\cdot \beta \leq a \cdot z \cdot b \leq b\cdot \alpha \rightarrow a\cdot \beta \leq b\cdot \alpha
\end{equation*} \end{equation*}
\item Algorithmus aus Übung: \begin{algorithmic}
\Repeat
\State Unbekannte $x_j$ auswählen
\State $L \gets \lbrace i \mid a_{ij} < 0 \rbrace$
\State $U \gets \lbrace i \mid a_{ij} > 0 \rbrace$
\ForAll{$i \in L \cup U$}
\State Reihe $i$ mit $\vert a_{ij}\vert$ normalisieren
\EndFor
\ForAll{$i \in L$}
\ForAll{$k \in U$}
\State Füge Ungleichung $A_{[i]} + A {[k]} \leq b_i + b_k$ hinzu
\EndFor
\EndFor
\State Ignoriere/Lösche alle Reihen aus $L \cup U$
\Until{System aus trivialen Ungleichungen}
\end{algorithmic}
\item Kleineres Problem $a\cdot \beta \leq b\cdot \alpha$ rekursiv lösen:\begin{itemize} \item Kleineres Problem $a\cdot \beta \leq b\cdot \alpha$ rekursiv lösen:\begin{itemize}
\item keine Lösung $\rightarrow$ unabhängig \item keine Lösung $\rightarrow$ unabhängig
\item Lösung existiert $\rightarrow$ Prüfung, ob auch ganzzahlige Lösung für $a\cdot z\cdot b$ existiert \item Lösung existiert $\rightarrow$ Prüfung, ob auch ganzzahlige Lösung für $a\cdot z\cdot b$ existiert
@@ -703,7 +769,7 @@
\subsection{Entfernung von schleifengetragenen Datenabhängigkeiten} \subsection{Entfernung von schleifengetragenen Datenabhängigkeiten}
\begin{itemize} \begin{itemize}
\item Legalität: Für jede Datenabhängigkeit muss die relative Reihenfolge auch nach Anwendung der Transformation bzw. Restrukturierung erhalten bleiben, die entstehenden Abhängigkeitsdistanzvektoren nicht lexikographisch sein \item Legalität: Für jede Datenabhängigkeit muss die relative Reihenfolge auch nach Anwendung der Transformation bzw. Restrukturierung erhalten bleiben, d.h. die entstehenden Abhängigkeits\-distanz\-vektoren dürfen nicht lexikographisch negativ sein und müssen ihre Datenabhängigkeitsart behalten
\end{itemize} \end{itemize}
\subsubsection{Schleifentransformationen} \subsubsection{Schleifentransformationen}
@@ -794,11 +860,9 @@
\item ggf. Ermöglichung weiterer Optimierungen wie Verschmelzung \item ggf. Ermöglichung weiterer Optimierungen wie Verschmelzung
\end{itemize} \end{itemize}
\item Neigen:\begin{itemize} \item Neigen:\begin{itemize}
\item Schleifenneigen:\begin{itemize} \item Verschiebung des Array-Indexbereichs der inneren Schleife um $f \cdot i$ mit $f$ Neigungsfaktor und $i$ Iterationsvariable der äußeren Schleife
\item Verschiebung des Array-Indexbereichs der inneren Schleife um $f \cdot i$ mit $f$ Neigungsfaktor und $i$ Iterationsvariable der äußeren Schleife \item Abzug von $f \cdot i$ bei Verwendungen der inneren Iterationsvariable
\item Abzug von $f \cdot i$ bei Verwendungen der inneren Iterationsvariable \item Abhängigkeit $(d_1, d_2)$ wird zu $(d_1, d_2 + f \cdot d_1)$ $\rightarrow$ Ermöglichung weiterer Restrukturierungen
\item Abhängigkeit $(d_1, d_2)$ wird zu $(d_1, d_2 + f \cdot d_1)$ $\rightarrow$ Ermöglichung weiterer Restrukturierungen
\end{itemize}
\end{itemize} \end{itemize}
\item Allgemeiner Fall:\begin{itemize} \item Allgemeiner Fall:\begin{itemize}
\item Transformation der Indexvektoren mit Matrix $U$ mit Eigenschaften (unimodular):\begin{itemize} \item Transformation der Indexvektoren mit Matrix $U$ mit Eigenschaften (unimodular):\begin{itemize}