Problem 3 --------- Observe the dumps generated by Liveness based pointer analysis pass for the two programs given below : 1) Why is the occurrence of variable `q' removed from the code in basic block 2 of program 1? Which optimization is this and why it it correct? 2) Why is the optimization that you observed in program 1 (ref: question 2 above) suppressed in program 2 for pointer `q'? Program 1 --------- #include int main () { int w, x, y, z; int *p, *q, *r, *s; q = &z; if (*q) p = &x; else if (y>2) p = &y; else p = &z; y = *p; printf ("%d%d%d%d%d%d", w, x, y, z, p, q, r, s); } Program 2 --------- int main () { int w, x, y, z; int *p, *q, *r, *s; if(x) q = &z; else q = &y; if (*q) p = &x; else if (y>2) p = &y; else p = &z; y = *p; printf ("%d%d%d%d%d%d", w, x, y, z, p, q, r, s); } Procedure --------- 1) Compile the test program with following command $(INSTALL)/bin/gcc -O2 -flipta -fdump-ipa-lipta test.c 2) Observe the *.lipta dump generated 3) `livein' and `liveout' represent the liveness information at a basic block. `mayin' and `mayout' represent the pointer information of the basic block.