https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65330
--- Comment #3 from Jan Hubicka <hubicka at ucw dot cz> --- > I was thinking of sth else first - make sure that points-to analysis processes > initializers of readonly globals (when they bind to the current def). In when ctor_for_folding returns non-NULL; > your testcase the globals are not readonly - or did you mean to write > > int * const varptr = &var; > int * const __restrict__ varptr2 = &var; > > ? Your testcase also misses a declaration of 'var'. I did not quite finish the testcase because the restrict qualifier I was interested in was ignored. Yes, they would need to be declared either const or static (so the DECL_READONLY is derived by IPA code). This should be full testcase (-fmerge-all-constants is needed to get merging done, but to expose any problems testrestrict/testrestrict2 codegen would need to differ): int var; static const int *varptr=&var; static const int *__restrict__ varptr2=&var; static int *__restrict__ varptr3 = &var; static int *__restrict__ varptr4 = &var; int * return_valptr(int i) { return varptr[i]; } int * __restrict__ return_valptr2(int i) { return varptr2[i]; } int testrestrict () { int *ptr = return_valptr (0); *ptr = 0; *varptr3 = 1; return *ptr; } int testrestrict2 () { int *ptr = return_valptr2 (0); *ptr = 0; *varptr3 = 1; return *ptr; } int testrestrict4 () { *varptr4 = 0; *varptr3 = 1; return *varptr4; }