That's going to be implementation dependent, and compiler dependent - but the fact is, it could be used for any tail call, not only recursive one.
Inlining a method can be easily done for any recursive call, even if it's not the method itself.
A special benefit for it would be for mutual recursive calls:
f(n): //some code g(n) g(n): //some more code f(n-1)
The question is "what and how to optimize", should we just "cancel" g, and make f recursive?
Fortunately, this problem is relatively simple and is solveable by simple graph algorithms, thanks to the fact that if each method is a node - it has at most one outgoing edge (the single tail call). This means that the graph is actually a series of chains, that form a simple cycle (single cycle in each connected component) at the "worst case", which is easy to handle.