On Sun, May 16, 2021 at 8:57 AM Uecker, Martin <martin.uec...@med.uni-goettingen.de> wrote: > > > > Hi Richard, > > I noticed that GCC 11 has different behavior in the following > example relative to 10.2 with -O2. I wonder whether this > is an intentional change and if yes, what are the rules?
Yes, this is a fix for the long-standing PR57359 where we failed to preserve the order of stores when applying store-motion. The basic rule is that stores may not be re-ordered based on TBAA since a store changes the dynamic type of a memory location. That notably happens for C/C++ programs re-using allocated storage and for C++ programs using placement new. It looked like a not so important bug since all other compilers fall into the same trap, nevertheless they are all wrong in doing so (and so was GCC). All work fine at -O0 of course. Richard. > Thanks! > Martin > > https://godbolt.org/z/57res7ax1 > > #include <stdio.h> > #include <stdlib.h> > > > __attribute__((__noinline__, __weak__)) > void f(long unk, void *pa, void *pa2, void *pb, long *x) { > for (long i = 0; i < unk; ++i) { > int oldy = *(int *)pa; > *(float *)pb = 42; > *(int *)pa2 = oldy ^ x[i]; > } > } > > int main(void) { > void *p = malloc(sizeof(int)); > *(int *)p = 13; > f(1, p, p, p, (long []){ 0 }); > printf("*pa(%d)\n", *(int *)p); > }