X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2FLikely.h;h=bdab72b817c2d621649c6bc28f27127aab6715be;hp=9a5aea99abd4ea6c69b25c9d086364527bc0e3db;hb=3579ddb46bf91312e7c1d24389ad60fd96fad776;hpb=dee8a5180aa542d98d1b71c74f83a006e4627952 diff --git a/folly/Likely.h b/folly/Likely.h index 9a5aea99..bdab72b8 100644 --- a/folly/Likely.h +++ b/folly/Likely.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2012-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,19 +14,33 @@ * limitations under the License. */ -/** - * Compiler hints to indicate the fast path of an "if" branch: whether - * the if condition is likely to be true or false. - * - * @author Tudor Bosman (tudorb@fb.com) - */ - #pragma once +#if __GNUC__ +#define FOLLY_DETAIL_BUILTIN_EXPECT(b, t) (__builtin_expect(b, t)) +#else +#define FOLLY_DETAIL_BUILTIN_EXPECT(b, t) b +#endif + +// Likeliness annotations +// +// Useful when the author has better knowledge than the compiler of whether +// the branch condition is overwhelmingly likely to take a specific value. +// +// Useful when the author has better knowledge than the compiler of which code +// paths are designed as the fast path and which are designed as the slow path, +// and to force the compiler to optimize for the fast path, even when it is not +// overwhelmingly likely. + +#define FOLLY_LIKELY(x) FOLLY_DETAIL_BUILTIN_EXPECT((x), 1) +#define FOLLY_UNLIKELY(x) FOLLY_DETAIL_BUILTIN_EXPECT((x), 0) + +// Un-namespaced annotations + #undef LIKELY #undef UNLIKELY -#if defined(__GNUC__) && __GNUC__ >= 4 +#if defined(__GNUC__) #define LIKELY(x) (__builtin_expect((x), 1)) #define UNLIKELY(x) (__builtin_expect((x), 0)) #else