Dave Korn wrote: > Andrew Haley wrote: >> eCos@ wrote: > >>> =============================================== >>> int *p; >>> >>> int main(void) >>> { >>> p++; >>> __asm__ __volatile__ (""::); >>> p++; >>> } >>> =============================================== > >>> assembly code is like: >>> 'addl $4, %eax' >>> 'addl $4, %eax' > >>> =============================================== >>> int *p; >>> >>> int main(void) >>> { >>> p++; >>> __asm__ __volatile__ (""::); >>> p+=8; >>> } >>> =============================================== > >>> According to the assembly code, we found that gcc merge the 'p++' & 'p+=8' >>> and generate 'addl $36, p' > >> If you really need a memory barrier, you have to use one: > > So, this is a real bug then - but it's a missed optimisation in the first > case, not a bogus one in the second case?
There's certainly something seriously screwy about it. Both of these are optimized identically until the very last tree optimization pass, where they diverge. p.c.122t.uncprop: ;; Function main (main) main () { int * p.1; int * p.0; <bb 2>: p.0_1 = p; p.1_2 = p.0_1 + 4; __asm__ __volatile__(""); p.1_4 = p.1_2 + 4; p = p.1_4; return; } ;; Function main2 (main2) main2 () { int * p.4; int * p.3; int * p.2; <bb 2>: p.2_1 = p; p.3_2 = p.2_1 + 4; __asm__ __volatile__(""); p.4_4 = p.3_2 + 8; p = p.4_4; return; } p.c.123t.optimized: ;; Function main (main) Analyzing Edge Insertions. main () { int * p.1; <bb 2>: p.1 = p + 4; __asm__ __volatile__(""); p = [pointer_plus_expr] p.1 + 4; return; } ;; Function main2 (main2) Analyzing Edge Insertions. main2 () { <bb 2>: __asm__ __volatile__(""); p = [pointer_plus_expr] (p + 4) + 8; return; } Andrew.