https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102571
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Workaround committed, so for OpenMP it shouldn't trigger anymore. But for int foo (char *p) { long double l = 0.0; __builtin_clear_padding (&l); return __builtin_memcpy (&l, p, sizeof (l)); } it still can, similarly for <atomic> APIs on long double, _Complex long double etc. Related to PR93270 which was also about DSE, but the other order, something clearing the memory and then writing a long double over it (which due to hw leaves the padding bits unchanged) and DSE removing the clearing before it. Here it is a long double store of initializer_zerop followed by clearing of the padding bits and removes the clearing of the padding bits.