diff --git a/verfahren.pdf b/verfahren.pdf index 8711c52..e505110 100644 Binary files a/verfahren.pdf and b/verfahren.pdf differ diff --git a/verfahren.tex b/verfahren.tex index 09d4146..af38f72 100644 --- a/verfahren.tex +++ b/verfahren.tex @@ -488,12 +488,90 @@ \end{itemize} \end{enumerate} +\section{Schleifen} +\subsection{Schleifeninvariante Anweisungen} +\begin{itemize} + \item schleifeninvariante Instruktion: alle Operanden $v$ sind \begin{itemize} + \item konstant oder + \item nur außerhalb der Schleife berechnet oder + \item innerhalb der Schleife in \emph{einer} schleifeninvarianten Instruktion berechnet + \end{itemize} + \item Auffinden schleifeninvarianter Instruktionen: \begin{enumerate} + \item Identifikation natürlicher Schleifen + \item Berechnung der erreichenden Definitionen + \item Konstantenfaltung + \item Markierung aller konstanten Ausdrücke und Variablen, sowie alle Markierung, deren erreichende Definitionen außerhalb der Schleife liegen, als schleifeninvariant + \item Solange neue Markierungen auftreten: alle Instruktionen/Variablen als schleifeninvariant markieren, wenn \begin{itemize} + \item sie konstant sind oder + \item wenn alle erreichenden Definitionen außerhalb der Schleife liegen oder + \item wenn genau eine erreichende Definition existiert und diese als schleifeninvariant markiert ist + \end{itemize} + \end{enumerate} + \item Herausziehen von schleifeninvarianten (Teil-)Ausdrücken vor den Schleifenkopf unter Beachtung von Seiteneffekten/Fehlern immer möglich + \item Auswahl von herausziehbaren Zuweisungen: \begin{enumerate} + \item Berechnung der Dominanz, erreichenden Definitionen und Anwendung von Konstantenfaltung + \item Berechnung der invarianten Instruktionen + \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 schleifeninvariant + \item in Grundblock, der alle Schleifenausgänge dominiert und alle die Variable nutzenden Blöcke strikt dominiert + \item einzige Zuweisung zu Variable in der ganzen Schleife + \end{itemize} + \item Herausziehen vor den Schleifenkopf in Breitensuchreihenfolge zur Bewahrung der Datenabhängigkeiten zwischen herausgezogenen Zuweisungen + \end{enumerate} + \item Sonderfall while-Schleife: Schleifenausgang wird von keinem anderen Grundblock in der Schleife dominiert, also keine herausziehbaren Zuweisungen in der Schleife $\rightarrow$ erst Umbau zu do-while-Schleife + \item Optimierung bei invariantem Test: Generierung einer eigenen Schleife für jeden Fall +\end{itemize} -\section{Induktionsvarianten und schleifeninvarianter Code} +\subsection{Induktionsvariablen} +\begin{itemize} + \item Induktionsvariable: Variable, die bei jeder Schleifeniteration um konstanten Wert inkrementiert oder dekrementiert wird + \item Einfache Induktionsvariable: Variable $x$, die nur durch $x = x \pm c$ mit schleifeninvariantem $c$ verändert wird + \item Abhängige Induktionsvariable: Variable $y$, die in der Schleife durch $y = a \cdot x \pm b$ mit schleifeninvarianten $a$ und $b$ als lineare Funktion aus Induktionsvariable $x$ berechnet wird + \item Berechnung der Familie einer einfachen Induktionsvariable $x$: Menge der Induktionsvariablen $y$, die mit linearer Funktion $y = c_1 \cdot x \pm c_2$ von $x$ mit schleifeninvarianten $c_1$ und $c_2$ abhängen: \begin{itemize} + \item Zuweisung der Form $y = c_1 \cdot x \pm c_2$ + \item Zuweisung der Form $y = c_1 \cdot z \pm c_2$, wobei $z \in \mathrm{Familie}(x)$ und \begin{itemize} + \item keine Veränderung von $x$ zwischen Zuweisung zu $z$ und Zuweisung zu $y$ + \item keine von außerhalb der Schleife erreichende Definition von $z$ erreicht Zuweisung zu $y$ + \end{itemize} + \end{itemize} + \item Berechnungen der Tripel $(x, c_1, c_2)$ für alle Induktionsvariablen $y$ einer Schleife:\begin{enumerate} + \item Berechnung von Schleifeninvarianz und erreichenden Definitionen + \item Bestimmung aller einfachen Induktionsvariablen durch Code-Inspektion (\enquote{Pattern Matching}) + \item Bestimmung aller Variablen $y$ mit einziger (oder identischen) Zuweisung der Form $y = x \pm c$ oder $y = c \cdot x$ mit $x$ Induktionsvariable und $c$ schleifeninvariant:\begin{itemize} + \item $x$ ist einfache Induktionsvariable: + \begin{equation*} + \mathrm{Tripel}(y) = \begin{cases*} + (x, 1, c) & falls $y = x + c$ oder $y = c + x$\\ + (x, 1, -c)& falls $y = x - c$\\ + (x, c, 0)& sonst ($y = x \cdot c$ oder $y = c \cdot x$) + \end{cases*} + \end{equation*} + \item $x$ ist abhängige Induktionsvariable mit Tupel $(u, d_1, d_2)$: + \begin{equation*} + \mathrm{Tripel}(y) = \begin{cases*} + (u, d_1, d_2 + c) & falls $y = x + c$ oder $y = c + x$\\ + (u, d_1, d_2 - c) & falls $y = x - c$\\ + (u, d_1 \cdot c, d_2 \cdot c_2) & sonst ($y = c \cdot x$ oder $y = x \cdot c$) + \end{cases*} + \end{equation*} + \end{itemize} + \end{enumerate} + \item Vereinfachung der Berechnungsvorschrift von Schleifenlaufvariablen pro Iteration (Reduktion der Ausdrucksstärke, \enquote{Strength Reduction}) für jede einfache Induktionsvariable $x$: \begin{enumerate} + \item Für jede von $x$ abhängige Induktionsvariable $y$ mit Tripel $(x, a, b)$:\begin{enumerate} + \item Einführung neuer Variable $y'$ + \item Ersetzung der Zuweisung zu $y$ durch $y = y'$ + \item Einfügen der Zuweisung $y' = y' \pm (a \cdot c)$ nach jeder Zuweisung $x = x \pm c$ + \item Einfügen der Zuweisung $y' = x\cdot a + b$ vor dem Schleifenkopf + \end{enumerate} + \end{enumerate} + \item Modifikation von bedingten Sprüngen ggf. möglich + \item Verringerung der Anzahl von Array-Bereichstests ggf. möglich +\end{itemize} -\section{Schleifen und Arrays} +\subsection{Schleifen und Arrays} -\section{Schleifentransformationen} +\subsection{Schleifentransformationen} -\section{Schleifenrestrukturierungen} +\subsection{Schleifenrestrukturierungen} \end{document}