diff --git a/report/report.tex b/report/report.tex index ebd10515178a7e1d76fa6f09bef6c8c25cbeb04b..b1bad2a0d8e7ad2a695f2f410109d19a6a0ff300 100644 --- a/report/report.tex +++ b/report/report.tex @@ -118,7 +118,21 @@ primary concern, this is not a big problem. \subsubsection*{Constant folding} +Another optimization is to do constant folding. Constant folding is replacing +a expensive step like addition with a more simple step like loading a constant. +Of course, this is not always possible. It is possible in cases where you apply +an operation on two constants, or a constant and a variable of which you know +for sure that it always has a certain value at that point. For example: +\begin{verbatim} +li $regA, 1 li $regA, 1 +addu $regB, $regA, 2 -> li $regB, 3 +\end{verbatim} +Of course, if \texttt{\$regA} is not used after this, it can be removed, which +will be done by the dead code elimination. +One problem we encountered with this is that the use of a \texttt{li} is that +the program often also stores this in the memory, so we had to check whether +this was necessary here as well. \subsubsection*{Copy propagation} @@ -145,12 +159,11 @@ of the move operation. An example would be the following: \begin{verbatim} -move $regA, $regB move $regA, $regB -... ... -Code not writing $regA, -> ... -$regB ... -... ... -addu $regC, $regA, ... addu $regC, $regB, ... +move $regA, $regB move $regA, $regB +... ... +Code not writing $regA, $regB -> ... +... ... +addu $regC, $regA, ... addu $regC, $regB, ... \end{verbatim} This code shows that \texttt{\$regA} is replaced with \texttt{\$regB}. This way, the move instruction might have become useless, and it will then be diff --git a/src/optimize/advanced.py b/src/optimize/advanced.py index 7e3a297cf8f41e6591a61b9def43522d027c4548..a182e5f81cb0980498918cc1a744f252e74137e5 100644 --- a/src/optimize/advanced.py +++ b/src/optimize/advanced.py @@ -137,7 +137,7 @@ def fold_constants(block): if reg_from in register: # Other value is also known, copy its value - register[reg_to] = register[reg_to] + register[reg_to] = register[reg_from] else: # Other value is unknown, delete the value del register[reg_to]