https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100366
--- Comment #5 from Marc Glisse <glisse at gcc dot gnu.org> --- (In reply to Martin Sebor from comment #2) > The IL looks like the warning is justified: The memcpy call is dead code, we just fail to notice it. > <bb 13> [local count: 230225493]: > # prephitmp_42 = PHI <_6(4), _7(3)> This is always _6, because in bb 3 we have _6 == _7. > pretmp_67 = vec_2(D)->D.33449._M_impl.D.32762._M_start; > _69 = prephitmp_42 - pretmp_67; Always 0. > <bb 7> [local count: 220460391]: > MEM <unsigned int> [(char * {ref-all})_155] = pretmp_72; > _50 = vec_2(D)->D.33449._M_impl.D.32762._M_finish; > _Num_51 = _50 - prephitmp_42; Always 0, in bb 4 we copy _M_start in _M_finish if they are not already equal. (sorry for the wrong FRE comment earlier) Note that if I replace operator new/delete with malloc/free inline void* operator new(std::size_t n){return __builtin_malloc(n);} inline void operator delete(void*p)noexcept{__builtin_free(p);} inline void operator delete(void*p,std::size_t)noexcept{__builtin_free(p);} we optimize quite a bit more and the warning disappears.