https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82224
--- Comment #11 from Alexander Cherepanov <ch3root at openwall dot com> --- When I was converting the original testcase to malloc I started with a simple assignment with a cast. Clang optimized it as well (and I posted it to the clang bug) bug gcc didn't. Essentially this example: void f(long long *p) { *(long *)p = *p; } tree optimization turns to f (long long int * p) { long long int _1; <bb 2> [100.00%] [count: INV]: _1 = *p_3(D); MEM[(long int *)p_3(D)] = _1; return; } The same happens with "new (p) long (*p);". So the question: why is that? If this result is intended then perhaps memcpys and assignment of union members from this bug report could be converted by gcc to the same form? It would solve the problem.