|
@@ -112,11 +112,11 @@ We now add the instruction above the first use, and write the result in a new
|
|
|
variable. Then all occurrences of this expression can be replaced by a move of
|
|
variable. Then all occurrences of this expression can be replaced by a move of
|
|
|
from new variable into the original destination variable of the instruction.
|
|
from new variable into the original destination variable of the instruction.
|
|
|
|
|
|
|
|
-This is a less efficient method then the dag, but because the basic blocks are
|
|
|
|
|
|
|
+This is a less efficient method then the DAG, but because the basic blocks are
|
|
|
in general not very large and the execution time of the optimizer is not a
|
|
in general not very large and the execution time of the optimizer is not a
|
|
|
primary concern, this is not a big problem.
|
|
primary concern, this is not a big problem.
|
|
|
|
|
|
|
|
-\subsubsection*{Fold constants}
|
|
|
|
|
|
|
+\subsubsection*{Constant folding}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -158,7 +158,18 @@ removed by the dead code elimination.
|
|
|
|
|
|
|
|
\subsubsection*{Algebraic transformations}
|
|
\subsubsection*{Algebraic transformations}
|
|
|
|
|
|
|
|
|
|
+Some expression can easily be replaced with more simple once if you look at
|
|
|
|
|
+what they are saying algebraically. An example is the statement $x = y + 0$, or
|
|
|
|
|
+in Assembly \texttt{addu \$1, \$2, 0}. This can easily be changed into $x = y$
|
|
|
|
|
+or \texttt{move \$1, \$2}.
|
|
|
|
|
|
|
|
|
|
+Another case is the multiplication with a power of two. This can be done way
|
|
|
|
|
+more efficiently by shifting left a number of times. An example:
|
|
|
|
|
+\texttt{mult \$regA, \$regB, 4 -> sll \$regA, \$regB, 2}. We perform this
|
|
|
|
|
+optimization for any multiplication with a power of two.
|
|
|
|
|
+
|
|
|
|
|
+There are a number of such cases, all of which are once again stated in
|
|
|
|
|
+appendix \ref{opt}.
|
|
|
|
|
|
|
|
\section{Implementation}
|
|
\section{Implementation}
|
|
|
|
|
|
|
@@ -195,7 +206,7 @@ The optimizations are done in two different steps. First the global
|
|
|
optimizations are performed, which are only the optimizations on branch-jump
|
|
optimizations are performed, which are only the optimizations on branch-jump
|
|
|
constructions. This is done repeatedly until there are no more changes.
|
|
constructions. This is done repeatedly until there are no more changes.
|
|
|
|
|
|
|
|
-After all possible global optimizations are done, the program is seperated into
|
|
|
|
|
|
|
+After all possible global optimizations are done, the program is separated into
|
|
|
basic blocks. The algorithm to do this is described earlier, and means all
|
|
basic blocks. The algorithm to do this is described earlier, and means all
|
|
|
jump and branch instructions are called leaders, as are their targets. A basic
|
|
jump and branch instructions are called leaders, as are their targets. A basic
|
|
|
block then goes from leader to leader.
|
|
block then goes from leader to leader.
|
|
@@ -207,7 +218,7 @@ steps can be done to optimize something.
|
|
|
\subsection{Writing}
|
|
\subsection{Writing}
|
|
|
|
|
|
|
|
Once all the optimizations have been done, the IR needs to be rewritten into
|
|
Once all the optimizations have been done, the IR needs to be rewritten into
|
|
|
-Assembly code, so the xgcc crosscompiler can make binary code out of it.
|
|
|
|
|
|
|
+Assembly code, so the xgcc cross compiler can make binary code out of it.
|
|
|
|
|
|
|
|
The writer expects a list of statements, so first the blocks have to be
|
|
The writer expects a list of statements, so first the blocks have to be
|
|
|
concatenated again into a list. After this is done, the list is passed on to
|
|
concatenated again into a list. After this is done, the list is passed on to
|