https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97605
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed| |2020-10-28 Status|UNCONFIRMED |NEW Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. This is partial dead code elimination which we do not perform. You can think of partial dead code elimination as sinking & duplicating code to N places where dataflow determines that in M < N places the sunk code is dead (it's usually done for stores, but calls work as well of course). For malloc/free pairs it actually requires eliding the whole pair while classically for stores only the sunk store is. Thus int g; void f (int i) { g = 1; if (i) g = 2; } becomes int g; void f (int i) { if (i) g = 2; else g = 1; } in your case you'd sink the malloc and elide the malloc/free pair. It might be tempting to implement this in two-steps and only do the sinking, relying on followup DCE/DSE but that will likely run into cases where we just ended up duplicating code.