There are various ways of coping with this.
- SCM and Guile have an unusual interpreter, such that open-coding
(inlining) wouldn't be that significant (I think).
- MIT Scheme has a special declaration you can put at the top of your
file which explicitly gives the compiler permission to open-code
the usual suspects.
- Chez Scheme has a special notation for referring to primitive
operations directly, not through variables, making the compiler's
job trivial.
- Some folks give their module systems semantics that are easy for the
compiler to analyze.
I'm sure there are other tactics.