https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109112
--- Comment #7 from Jason Merrill <jason at gcc dot gnu.org> --- In an email thread Jakub wrote: ---- Only the simplest assumptions in [[assume(cond)]] where there clearly aren't any side-effects no risks of them are lowered to if (!cond) __builtin_unreachable (); in the IL, anything else goes into the condition being outlined in a separate artificial function and an internal function recording the assumption in the IL. The optimizers then can optimize both the artificial function and the caller. The missed optimization thing is that currently only the value range propagation is able to take advantage of the assumptions, and VRP is only able to deal with scalars. We have interprocedural optimizations like IPA scalar replacement of aggregates etc., where we can optimize passing aggregates at function boundaries to passing just some scalars from them if the rest isn't needed etc., but because the assumptions aren't normal calls they'd need tweaks to be able to optimize the assumptions too so that VRP could take advantage of those. ---- Why don't the existing optimizations work on the artificial function the same as any other function? i.e. like struct S { bool x; }; void do_something(); inline void assumption_1 (const S& s) noexcept { if (s.x) __builtin_unreachable (); } void fn(S s) { assumption_1 (s); if (s.x) do_something(); } which is also optimized as expected.