CodeOptimization EnggNotes
CodeOptimization EnggNotes
com
m
• Optimization should increase the speed of the program and if possible, the program
co
should demand less number of resources.
• Optimization should itself be fast and should not delay the overall compiling process.
n.
Optimization can be categorized broadly into two types: machine independent and machine
dependent.
io
at
Machine-Independent Optimization
• Intermediate code generation process introduces many inefficiencies:
uc
o Extra copies of variables, using variables instead of constants, repeated
evaluation of expressions, etc.
ed
Machine-dependent Optimization
w
Machine-dependent optimization is done after the target code has been generated and when
w
the code is transformed according to the target machine architecture. It involves CPU
registers and may have absolute memory references rather than relative references. Machine-
dependent optimizers put efforts to take maximum advantage of memory hierarchy.
Basic Blocks
www.sakshieducation.com
www.sakshieducation.com
Source codes generally have a number of instructions, which are always executed in
sequence and are considered as the basic blocks of the code. These basic blocks do not have
any jump statements among them, i.e., when the first instruction is executed, all the
instructions in the same basic block will be executed in their sequence of appearance
without losing the flow control of the program.
A program can have various constructs as basic blocks, like IF-THEN-ELSE, SWITCH-
CASE conditional statements and loops such as DO-WHILE, FOR, and REPEAT-UNTIL,
m
etc.
co
Basic Block Identification:
n.
We may use the following algorithm to find the basic blocks in a program:
• Search header statements of all the basic blocks from where a basic block starts:
io
o First statement of a program.
at
o Statements that are target of any branch (conditional/unconditional).
o Statements that follow any branch statement.
uc
• Header statements and the statements following them form a basic block.
• A basic block does not include any header statement of any other basic block.
ed
Basic blocks are important concepts from both code generation and optimization point of
view.
hi
a ks
.s
w
w
w
www.sakshieducation.com
www.sakshieducation.com
Basic blocks play an important role in identifying variables, which are being used more than
once in a single basic block. If any variable is being used more than once, the register
memory allocated to that variable need not be emptied unless the block finishes execution.
m
tool that helps in optimization by help locating any unwanted loops in the program.
co
n.
io
at
uc
ed
hi
a ks
.s
Local Optimization:
Optimizations performed exclusively within a basic block are called "local optimizations".
w
These are typically the easiest to perform since we do not consider any control flow
w
information; we just work with the statements within the block. Many of the local
optimizations we will discuss have corresponding global optimizations that operate on the
w
Loop Optimization
Most programs run as a loop in the system. It becomes necessary to optimize the loops in
order to save CPU cycles and memory. Loops can be optimized by the following techniques:
www.sakshieducation.com
www.sakshieducation.com
• Invariant code: A fragment of code that resides in the loop and computes the same
value at each iteration is called a loop-invariant code. This code can be moved out of
the loop by saving it to be computed only once, rather than with each iteration.
• Induction analysis: A variable is called an induction variable if its value is altered
within the loop by a loop-invariant value.
• Strength reduction: There are expressions that consume more CPU cycles, time, and
memory. These expressions should be replaced with cheaper expressions without
m
compromising the output of expression. For example, multiplication (x * 2) is
co
expensive in terms of CPU cycles than (x << 1) and yields the same result.
n.
Dead-code Elimination
Dead code is one or more than one code statements, which are:
io
• Either never executed or unreachable,
at
• Or if executed, their output is never used.
Thus, dead code plays no role in any program operation and therefore it can simply be
uc
eliminated.
ed
circumstances, i.e., sometimes the values are used and sometimes they are not. Such codes
ks
The above control flow graph depicts a chunk of program where variable ‘a’ is used to
assign the output of expression ‘x * y’. Let us assume that the value assigned to ‘a’ is never
used inside the loop. Immediately after the control leaves the loop, ‘a’ is assigned the value
of variable ‘z’, which would be used later in the program. We conclude here that the
assignment code of ‘a’ is never used anywhere, therefore it is eligible to be eliminated.
www.sakshieducation.com
www.sakshieducation.com
m
co
n.
Likewise, the picture above depicts that the conditional statement is always false, implying
io
that the code, written in true case, will never be executed, hence it can be removed.
at
Partial Redundancy
uc
Redundant expressions are computed more than once in parallel path, without any change in
operands whereas partial-redundant expressions are computed more than once in a path,
ed
www.sakshieducation.com
www.sakshieducation.com
If (condition)
{
a = y OP z;
}
else
{
...
m
}
co
c = y OP z;
We assume that the values of operands (y and z) are not changed from assignment of
n.
variable a to variable c. Here, if the condition statement is true, then y OP z is computed
twice, otherwise once. Code motion can be used to eliminate this redundancy, as shown
io
below:
at
If (condition)
{
uc
...
tmp = y OP z;
ed
a = tmp;
...
hi
}
ks
else
{
a
...
.s
tmp = y OP z;
}
w
c = tmp;
w
Here, whether the condition is true or false; y OP z should be computed only once.
w
www.sakshieducation.com
www.sakshieducation.com
t0 = a + b
t1 = t0 + c
d = t0 + t1
m
co
n.
[t0 = a + b]
io
at
[t1 = t0 + c]
uc
[d = t0 + t1]
ed
hi
a ks
.s
w
w
w
www.sakshieducation.com