https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93246
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> --- Hmm. (gdb) p alias_set_subset_of (3, 2) $52 = false (gdb) p alias_set_subset_of (2, 3) $54 = true but (gdb) p alias_sets_conflict_p (2, 3) $55 = 0 (gdb) p alias_sets_conflict_p (3, 2) $56 = 0 ah, the former is because ->has_zero_child which the latter doesn't check. So the question is why we don't record the children. Ah, it's because we record alias-set zero for InnerType and thus when recording the subsets of Optional we "stop" and have no subsets of InnerType. Bah. So the causing rev was broken, tho reverting will pessimize some stuff. It's also odd things break on the GCC 8 branch even though it doesn't have the respective rev. Martin - can you bisect again? As said, use void __attribute__((noipa)) foo(Optional<>& x) { __asm__ volatile ("":::"memory"); } (and ignore the noipa warning)