https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110137

--- Comment #23 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I've just tried:
int i, j, k;

void *
foo ()
{
  i = 1;
  j = 2;
  void *p = __builtin_operator_new (32);
  j = 3;
  k = i;
  return p;
}

void *
bar ()
{
  i = 1;
  j = 2;
  void *p = __builtin_malloc (32);
  j = 3;
  k = i;
  return p;
}

void *
baz ()
{
  i = 1;
  j = 2;
  void *p = ::operator new (32);
  j = 3;
  k = i;
  return p;
}
and it seems that both g++ and clang++ for the malloc case optimize j = 2; away
and k = i; into k = 1;, i.e. malloc is assumed not to read nor write global
state visible to the program except the allocation itself.
While __builtin_operator_new results just in k = i; to k = 1; optimization and
not the removal of j = 2; (i.e. __builtin_operator_new is assumed not to modify
global state but is assumed to read it).
And ::operator new isn't optimized either way, no matter whether with
-fassume-sane-operator-new or -fno-assume-sane-operator-new (those flags don't
change foo behavior either).
So I wonder if we really should follow what clang++ does because it doesn't
make much sense, lacks consistency and design.

Reply via email to