https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90328
Bug ID: 90328 Summary: Wrong loop distribution with aliasing Product: gcc Version: 10.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: glisse at gcc dot gnu.org Target Milestone: --- I was investigating missed loop distribution opportunities probably related to aliasing, and hit this case where gcc seems a bit too optimistic. #include <new> struct T { int* p; T(T const&t):p(t.p){} }; T* f(T* a,T* b){ for(int i=0;i<1024;++i){ a[i].~T(); new(a+i)T(b[i]); } return a; } This gets optimized to a call to memcpy. However, I believe it is legal to call f(x+1,x) where x is an array of size 1025, where it should replace every element with a copy of the first one. This seems related to "new" and the use of a constructor. It is true that this implies that a[i] and b[i] cannot alias, but not that the whole a and b cannot alias.