Consider the following ANSI C code segment:
z=x+3+y→f1+y→f2;
for(i=0;i<200;i=i+2){
if(z>i){
p=p+x+3;
q=q+y→f1;
}else{
p=p+y→f2;
q=q+x+3;
}
}
Assume that the variable y points to a struct (allocated on the heap) containing two fields f1 and f2, and the local variables x, y, z, p, q, and i are allotted registers. Common sub-expression elimination (CSE) optimization is applied on the code. The number of addition and dereference operations (of the form y → f1 or y → f2) in the optimized code, respectively, are :
t1=y→f1(1dereference)
t2=y→f2(1dereference)
t3=x+3(1add)
z=t3+t1+t2(2additions)
For (i = 0; i < 200; i + = 2)
{
if (z > i)
{
p = p + t3
q = q + t1(2 add)
}
else
{
p = p + p2
q = q + t3 (2 add)
}
}
If else condition ⇒
Either if is executed (or) else is executed.
⇒ At any iteration 2 addition operations will be executed.
So, in loop the iterations are (2002)=100times.
∴ In loop the number of additions = 100 × 2 = 200 additions
∴ Total additions = 200 + 1 + 2 + 100 loop additions (inside for loop) = 303
and 2 dereferences.
∴ Correct answer is 303 and 2 which is option (a).