Tail recursion optimization
If a function f calls a function g and immediately returns the result of g, the generated code can destroy f's local variables and return address before calling g
In effect, the call becomes a jump
The optimization applies to all tail calls, not just recursive ones