[LLVMdev] [patch] Change llvm_unreachable to use __builtin_unreachable() in -asserts
Jim Grosbach
grosbach at apple.com
Fri Mar 11 19:45:11 PST 2011
Such an awesome change it was worth saying twice! :)
Sounds great, and I completely agree it's a nice enhancement to what we can effectively express to help the compiler optimize more effectively. Thanks for doing this.
-Jim
On Mar 11, 2011, at 6:55 PM, John McCall wrote:
> This patch implements the current consensus of PR8973:
> http://llvm.org/bugs/show_bug.cgi?id=8973.
>
> The macro llvm_unreachable is used in LLVM to indicate that
> a particular place in a function is not supposed to be reachable
> during execution. Like an assert macro, it takes a string
> argument. In +Asserts builds, this string argument, together with
> some location information, is passed to a function which prints
> the information and calls abort(). In -Asserts builds, this string
> argument is dropped (to minimize code size impact), and
> instead a bunch of zero arguments are passed to the same
> function.
>
> The problem is that that's still not very good for code size, as it
> leaves a somewhat bulky function call in the emitted code. It
> also doesn't let give the compiler any opportunity to optimize
> based on our assertion that the code is unreachable. A much
> better alternative is to use an intrinsic, provided by Clang and
> GCC 4.5, called __builtin_unreachable; it has the semantics
> of being undefined behavior if reached, much like LLVM's own
> "unreachable" instruction, which incidentally is what Clang
> generates for it.
>
> This patch keeps the old behavior of llvm_unreachable in
> +Asserts (!defined(NDEBUG)) builds, but changes the behavior
> in -Asserts builds to call __builtin_unreachable() (in GCC 4.5
> and Clang) or abort() (in everything else).
>
> This is effectively a change in the practical semantics of
> llvm_unreachable: if the call is actually reachable, then you
> will get some really crazy behavior in -Asserts builds. If you've
> been using this macro in places that can logically be reached —
> e.g., after you've tested for all the instructions you've actually
> implemented in your backend — then you've been violating the
> spirit of this macro, as communicated by its name, and you
> should change your code to handle unexpected patterns
> more responsibly.
>
> John.
>
> <unreachable.patch.txt>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110311/d52b46fb/attachment.html>
More information about the llvm-dev
mailing list