https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105748
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Last reconfirmed| |2022-05-27 Keywords| |missed-optimization CC| |rguenth at gcc dot gnu.org Status|UNCONFIRMED |NEW --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- It works fine with the C frontend so I suspect PRE (which does the transform there) is confused by the fact that g_value isn't marked as to not throwing. const int g_value() __attribute__((pure,nothrow)); int bar(int n) { int s = 0; for (int i=0; i<n; ++i) { s += g_value() * i; } return s; } makes the case work. Basically the number of times g_value is called depends on whether one of it might throw. That might be overly conservative for pure (or const) functions.