https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118570
--- Comment #4 from Jan Hubicka <hubicka at ucw dot cz> --- I was thinking of this especially WRT situations where we have user specified const/pure which we may not be able to detect ourself. Since we do no optimization before early inline, we throw away those hints quite aggressively. (In case of autodetected const/pure, like in this testcase, of course gimple passes has all the info to do the job, but clearly this is not always easy.) We used to have way to mark code of inline const/pure function in RTL via notes which enabled some optimizations, like invariant motion, to threat the whole block as a single "instruction". This was nasty to keep intact across optimizations and removed once we got better on tree optimization. I don't think we want to revive this on gimple level. I was not able to come with something smarter. In SSA form perhaps one can keep have builtin "this SSA name depends only on those SSA names" which can wrap return value of const/pure function. I.e. wrapped_retval = __builtin_depends_on (retval, a, b) wrapped_retval = __builtin_depends_on (retval, a, c) in this testcase which means that wrapped_retval is a copy of retval, but really can be computed as soon as ssa name a,b (or b,c) are ready. That would be more transparent to optimizers, and make easy to discover that the values are loop invariants. But then we would need to move relevant computation out of loop...