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

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
The question now comes should this be handled too:
```
typedef int type;

#define size (4)
type *foo ()
{
  type *p = (type *)__builtin_malloc (size*sizeof(type));
  type tmp[size] = {};
  __builtin_memcpy(p,tmp,sizeof(tmp));
  return p;
}
```

MY patch does not handle this because we get:
```
  p_3 = __builtin_malloc (16);
  MEM <uint128_t> [(char * {ref-all})p_3] = 0;
```

I am thinking that is ok here.

What is interesting is that change the type to char and then do a non-power of
2, clang will transform it into calloc (my patch too) but if you have a power
of 2 up to 8, clang will not do the transformation (at least for aarch64).

I am not 100% sure if we want to have a lower limit for the size of memset
either. clang acts similar enough to my patch though.

Reply via email to