Hi, Given the code
class C { void f(int *p); int q; }; void C::f(int * __restrict p) __restrict { q += 10; *p = 7; q += 10; } g++ 4.5.2 with -O3 generates the following for C::f() (prologue and epilogue omitted): mov 0x8(%ebp),%eax // eax = this (= &q) mov 0xc(%ebp),%ecx // ecx = p mov (%eax),%edx // edx = q movl $0x7,(%ecx) // *p = 7 add $0x14,%edx // q += 20 mov %edx,(%eax) // save q If C::f() is rearranged as void C::f(int * __restrict p) __restrict { *p = 7; q += 10; q += 10; } the following is generated instead: mov 0x8(%ebp),%eax // eax = this (= &q) mov 0xc(%ebp),%edx // edx = p movl $0x7,(%edx) // *p = 7 addl $0x14,(%eax) // q += 20 Is there some reason why GCC couldn't generate this code for the first version of C::f()? Is this a failure of optimization, or am I missing something in how __restricted works? /Ulf