https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89152
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization Status|UNCONFIRMED |NEW Last reconfirmed| |2019-02-04 CC| |hubicka at gcc dot gnu.org, | |rguenth at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- The issue here is that the abstraction includes memory objects in the GCC IL which makes it very difficult for GCC to get rid of it during IPA analysis. foo (int a) { struct Cont D.1982; struct Cont D.1983; <bb 2> : D.1983.f = bar; D.1982.f = h; g (D.1982, D.1983, a_4(D)); return; } g (struct Cont c, struct Cont d, int a) { int _1; int _2; void (*<T2f9>) (struct cont, int) _3; <bb 2> : _1 = quux (a_6(D)); if (_1 != 0) goto <bb 3>; [INV] else goto <bb 4>; [INV] <bb 3> : _2 = a_6(D) + 1; g (c, d, _2); <bb 4> : _3 = c.f; _3 (d, a_6(D)); return; } this is probably another case where knowing and exposing the ABI upfront would help - Cont is passed in a register. OTOH generally rewriting Cont into SSA (if not address-taken) might be an option as well. update_address_taken has a good idea whether accesses meet SSA requirements.