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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Blocks|                            |117924
           See Also|https://gcc.gnu.org/bugzill |
                   |a/show_bug.cgi?id=117924    |

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Longer example:
```
static inline char *a(char *b, char *e)
{
  return e - (e - b);
}

void f(short s, char *t)
{
  char *b = new char[s];
  char *e = b+s;
  if (s == 0)
    ;
  else if (s == 1)
    b[0] = t[0];
  else
    __builtin_memcpy(b,t, s);
  char *b1 = a(b,e);
  delete []b1;
}
```

With -O2, we can optimize away the whole f function but that is only because of
forwprop. if we disable forwprop we can't due to this optimization missing. 

Looking into PR 117924 further, currently DSE5 can remove the stores:
```
  Deleted dead store: MEM[(struct __as_base  &)&data] ={v} {CLOBBER(bob)};

  Deleted dead store: MEM[(struct _Bvector_impl_data *)&data] ={v}
{CLOBBER(bob)};

```

But DCE7 (which is right afterwards) does not `remove operator new/delete`
because this missed optimization and then forwprop4 (which is right after dce7)
is able to see (b+s) - (b+s - b) is just b and then later on the next DCE
optimizes away the new/delete pair.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117924
[Bug 117924] unused std::vector<bool> are not optimized out fully at gimple
level

Reply via email to