aside from compilation time, inlining doesn’t mean your program will run faster, because now you’re filling your icache with the inlined instructions rather than a call instruction, that might be flushed away on a missed branch prediction.
True, but less so now than a decade ago; if it's a hot path (which anything `__forceinline` presumably is, assuming the author has a reasonable understanding of optimization) inlining is usually going to be a performance win, and often a cache/code size win as well (optimizing the inlined code, avoiding register spills).
No, still.
If it's an unlikely branch and pretty big, better put it into an extra function call if possible.
icache pollution is still an issue.
The main benefit of inlining come from the additional optimizations it allows the compiler to do.
That is not a benefit of forced inlining (over allowing the compiler to decide what to inline).
It's a trade-off. Sometimes simply calling a function will flush the I cache
Also, there are function prologues/epilogues and sometimes additional instructions to satisfy the calling convention.
True, and the functions in which inlining is most effective are small non recursive functions that don't lose any debug info from omitting the frame pointer.