Author: Carl Friedrich Bolz <cfb...@gmx.de> Branch: extradoc Changeset: r4669:e6cb979d4a9c Date: 2012-08-17 12:27 +0200 http://bitbucket.org/pypy/extradoc/changeset/e6cb979d4a9c/
Log: merge diff --git a/talk/dls2012/paper.tex b/talk/dls2012/paper.tex --- a/talk/dls2012/paper.tex +++ b/talk/dls2012/paper.tex @@ -424,7 +424,7 @@ set($p_{5}$, intval, $i_{4}$) jump($L_0$, $p_{0}$, $p_{5}$) \end{lstlisting} -\caption{An Unoptimized Trace of the Example Interpreter} +\caption{An Unoptimized Trace of the example interpreter} \label{fig:unopt-trace} \end{figure} @@ -742,6 +742,17 @@ In the optimized trace $J$ is replaced by $\hat J$ and $K$ by $\hat K$. +It is interesting to note that the described approach automatically deals with +implicit control dependencies correctly, whereas in other approaches this needs +to be carefully programmed in. A commonly used example for a control dependency +is a division operation that needs to be preceded by a check for the second +argument being 0. In a trace, such a check would be done with a guard. The +division operation must not be moved before that guard, and indeed, this is +never done. If the division is loop invariant, the result computed in copy of +the division operation in the preamble is reused. This division operation is +preceded by a copy of the non-null guard, which ensures that it can be executed +correctly. + \subsection{Allocation Removal} \label{sub:allocation} @@ -870,7 +881,7 @@ $i_{8}$ = $i_{4}+i_{3}$ jump($L_1$, $p_{0}$, $i_{3}$, $i_8$) \end{lstlisting} -\caption{The fully optimized loop of the Example Interpreter} +\caption{The fully optimized loop of the example interpreter} \label{fig:opt-trace} \end{figure} _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit