Inline functions cannot be overriden (because otherwise the implementation must be chosen at runtime) and also cannot be recursive (unless they are tail recursive).
Usually 95% of the time is spent on 5% of the code and usually it's hard to find out what code that is during static analysis. Many of the runtimes Haxe targets will perform code optimization once this information becomes available during a program's execution (e.g. for classes that no subclasses or interfaces that have only one implementor). But the compiler simply is not in the position to make an informed decision. Instead, the language offers the developer the means to granularly guide the compiler. And that shouldn't really mean to stick inline all over the place but instead put it where it has the desired effect. In JS for example the resulting code size is important. Inlining can reduce code size or increase it. So whatever you optimize for, always measure the effect.
Best,
Juraj