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 \rightarrow f1\) or \(y \rightarrow f2\)) in the optimized code, respectively, are:
To solve this problem, we need to apply common sub-expression elimination (CSE) optimization to the given ANSI C code and then determine the number of addition and dereference operations in the optimized code.
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;
}
}x + 3 is a common sub-expression used in the initialization of z and the assignment of p and q.y->f1 and y->f2 are repeatedly accessed.temp1 = x + 3;z = temp1 + temp2 + temp3;if branch: p = p + temp1; and q = q + temp2;else branch: p = p + temp3; and q = q + temp1;temp2 and temp3. Thus, dereferencing operations are fixed:temp2 = y->f1;temp3 = y->f2;The number of addition operations in the optimized code is 303 and the number of dereference operations is 2. Thus, the correct answer is:
303 and 2
For a statement \(S\) in a program, in the context of liveness analysis, the following sets are defined:
\(USE(S)\) : the set of variables used in \(S\)
\(IN(S)\) : the set of variables that are live at the entry of \(S\)
\(OUT(S)\) : the set of variables that are live at the exit of \(S\)
Consider a basic block that consists of two statements, \(S_1\) followed by \(S_2\). Which one of the following statements is correct?