The following code segment is executed on a processor which allows only register operands in its instructions. Each instruction can have atmost two source operands and one destination operand. Assume that all variables are dead after this code segment.
c = a + b;
d = c * a;
e = c + a;
x = c * c;
if (x > a) {
y = a * a;
}
else {
d = d * d;
e = e * e;
}
What is the minimum number of registers needed in the instruction set architecture of the processor to compile this code segment without any spill to memory? Do not apply any optimization other than optimizing register allocation.
View worked solution
Answer: B
To find the minimum number of registers required without any memory spill, we analyze the liveness of variables at each step of the code segment:
- Initially: and must be in registers. Let and .
c = a + b;
Since is dead after this instruction, we can reuse its register for .
Live variables: → Register assignment: , .d = c * a;
We need a new register for because is used later in theelseblock.
Live variables: → Register assignment: , , .e = c + a;
We need a new register for because is used later in theelseblock.
Live variables: → Register assignment: , , , .x = c * c;
Since is dead after this instruction, we can reuse its register for .
Live variables: → Register assignment: , , , .
At the point right before x = c * c, the four variables and are simultaneously live, which requires at least 4 registers. As shown in the step-by-step allocation, 4 registers are also sufficient to complete the execution of both branches without any spill.
Free practice · Your answers on this page are not saved.
