Can you explain this more? Surely the compiler can reason about p being able to point to i's address.
int *p = rand();
or that code could be in a function int f(int *p)
which may be called from completely different compilation units (or even across a dynamic library boundary) meaning there's no way for the compiler to know what p is.