Parsing Protobuf at 2+GB/S: How I Learned to Love Tail Calls in C
Looking at the LLVM docs for attributes I get the impression that tail call optimization (TCO) only happens when the caller and callee have basically the same kind of arguments.  You can see how that's real simple to implement: emit a `jmp` and done.  For non-compatible tail calls the compiler would have to emit instructions to fix up the current call frame, and I guess the code for that doesn't exist in LLVM.I wonder if that's typical of TCO implementations.