https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103830
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> --- To clarify myself - the testcase is invoking UB, 'volatile' doesn't make a difference here. That we get the DSE as a second-order effect is unfortunate at most, in other places we try to preserve volatile qualified accesses. But I do not think it's worth to pessimize -Og for that. If you declare MyClass::call() noinline you get the same behavior with all optimization levels: struct MyClass; struct ptr { MyClass* get() { return t; } /* line 21 */ MyClass* t; }; struct MyClass { void __attribute__((noinline)) call(); }; void MyClass::call() { *(volatile char*)(nullptr) = 1; /* line 26 */ } static void intermediate(ptr p) { p.get()->call(); /* line 29 */ } int main() { intermediate(ptr{new MyClass}); } so iff then we need to argue about the modref/ipa-pure-const behavior, not about DCE of calls at -Og.