https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96717
--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> --- Reduced: template<typename T> struct vector { using pointer = T*; pointer begin, end, end_of_storage; void pop_back() { (end--)->~T(); } }; using size_t = decltype(sizeof(0)); void pop_many(vector<int>& v, size_t n) { for (size_t i = 0; i < n; ++i) { v.pop_back(); } } With -O2 -fno-lifetime-dse we get the expected code back.