When the prospective caller of an outlined function saves registers, we can save LR to one of those registers instead of the stack. This teaches the outliner to do that when possible.
This allows us to avoid bumping the stack in outlined functions in some cases. By doing this, in a later patch, we can teach the outliner to do something like this:
f1: ... bl OUTLINED_FUNCTION ... f2: ... save LR bl OUTLINED_FUNCTION restore LR ...
instead of falling back to saving LR in both cases.
An alternative sequence would be "ADR scratch, .+8; B OUTLINED_FUNCTION", and then in the outlined function "I1; I2; I3; BR scratch". Disadvantage is that every caller has to use the same register, and I guess you can't skip the save/restore in some callers like you're planning.