Problem 1 --------- Draw a supergraph of the following program (i.e. a graph in which we include call and return edges to show interprocedural control flow) and observe the dumps generated by Liveness based pointer analysis pass. 1) What is the pointer information after the call made to function f and why? Do you find any pointer information missing? Why? 2) Why does the pointer information `x->p' not reach beyond the second call to function f() in main? Explain in terms of paths in the supergraph. 3) Why does the pointer information `x->q' reach beyond second call to function f() in main but is not propagated beyond the first call to f()? Explain in terms of paths in the supergraph. Program ------- int *x, *y, p, q; void f() { if(p) p++; } int main() { x = &p; f(); printf("%d",x); x = &q; f(); y = &q; printf("%d%d%d%d",x,y,p,q); } 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. Callstring represent calling context reaching `f'.