[LLVMdev] Emit code for 'unreachable'

David Chisnall David.Chisnall at cl.cam.ac.uk
Thu Apr 17 01:26:06 PDT 2014


On 15 Apr 2014, at 22:22, Reid Kleckner <rnk at google.com> wrote:

> Personally I'm in favor, but others may disagree.  Right now clang inserts calls to llvm.trap(), and that's how we get ud2's when falling off the end of a function with a return type.  That may be the preferred approach for __builtin_unreachable(), since other clients of LLVM at -O0 may actually want it to produce code quickly without inserting any debugging aids.

It would be trivial to write a pre-codegen pass that would turn all unreachable instructions into calls to llvm.trap and then unreachable.  If a front end wants to guarantee a trap, then it is also free to insert the trap (and it will be deleted later if the basic block becomes truly unreachable).  

I'd be somewhat hesitant about making it the default behaviour, because machine instruction passes may want to do some reordering of instructions and once they've got an instruction that is guaranteed to trap then it enforces hard constraints on flow control.  To preserve this, you'd need to keep it as a pseudo right up until the very last stage of compilation, which adds some complexity to back ends.

David





More information about the llvm-dev mailing list