Until 2015, LLVM just unconditionally put the function prologue at the beginning of each function, even when it wasn't needed! A friendly introduction to the shrink-wrap pass here:
miniblog.
Related Posts
Smalltalk shows a lint error if you recurse unconditionally: you've basically written a pointless infinite loop.
I've not seen lints for this elsewhere, but it's a really nice touch.