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.