Use LIKELY and UNLIKELY macros to wrap error generation.

BUG=609673

Change-Id: I247f561712e30aa10bad77fabf614501d596915e
Reviewed-on: https://chromium-review.googlesource.com/1021995
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
diff --git a/src/common/platform.h b/src/common/platform.h
index 57a2b92..1f1d85d 100644
--- a/src/common/platform.h
+++ b/src/common/platform.h
@@ -101,4 +101,15 @@
 // We will undef the macro so that the function name does not get replaced
 #undef MemoryBarrier
 
+// Macro for hinting that an expression is likely to be true/false.
+#if !defined(ANGLE_LIKELY) || !defined(ANGLE_UNLIKELY)
+#if defined(__GNUC__) || defined(__clang__)
+#define ANGLE_LIKELY(x) __builtin_expect(!!(x), 1)
+#define ANGLE_UNLIKELY(x) __builtin_expect(!!(x), 0)
+#else
+#define ANGLE_LIKELY(x) (x)
+#define ANGLE_UNLIKELY(x) (x)
+#endif  // defined(__GNUC__) || defined(__clang__)
+#endif  // !defined(ANGLE_LIKELY) || !defined(ANGLE_UNLIKELY)
+
 #endif // COMMON_PLATFORM_H_
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index d081595..2a24712 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -2453,7 +2453,7 @@
 
 void Context::handleError(const Error &error) const
 {
-    if (error.isError())
+    if (ANGLE_UNLIKELY(error.isError()))
     {
         GLenum code = error.getCode();
         mErrors.insert(code);
diff --git a/src/libANGLE/Error.h b/src/libANGLE/Error.h
index 5084e01..bf66d44 100644
--- a/src/libANGLE/Error.h
+++ b/src/libANGLE/Error.h
@@ -223,35 +223,35 @@
 #define ANGLE_CONCAT2(x, y) ANGLE_CONCAT1(x, y)
 #define ANGLE_LOCAL_VAR ANGLE_CONCAT2(_localVar, __LINE__)
 
-#define ANGLE_TRY_TEMPLATE(EXPR, FUNC) \
-    {                                  \
-        auto ANGLE_LOCAL_VAR = EXPR;   \
-        if (ANGLE_LOCAL_VAR.isError()) \
-        {                              \
-            FUNC(ANGLE_LOCAL_VAR);     \
-        }                              \
-    }                                  \
+#define ANGLE_TRY_TEMPLATE(EXPR, FUNC)                 \
+    {                                                  \
+        auto ANGLE_LOCAL_VAR = EXPR;                   \
+        if (ANGLE_UNLIKELY(ANGLE_LOCAL_VAR.isError())) \
+        {                                              \
+            FUNC(ANGLE_LOCAL_VAR);                     \
+        }                                              \
+    }                                                  \
     ANGLE_EMPTY_STATEMENT
 
 #define ANGLE_RETURN(X) return X;
 #define ANGLE_TRY(EXPR) ANGLE_TRY_TEMPLATE(EXPR, ANGLE_RETURN);
 
-#define ANGLE_TRY_RESULT(EXPR, RESULT)         \
-    {                                          \
-        auto ANGLE_LOCAL_VAR = EXPR;           \
-        if (ANGLE_LOCAL_VAR.isError())         \
-        {                                      \
-            return ANGLE_LOCAL_VAR.getError(); \
-        }                                      \
-        RESULT = ANGLE_LOCAL_VAR.getResult();  \
-    }                                          \
+#define ANGLE_TRY_RESULT(EXPR, RESULT)                 \
+    {                                                  \
+        auto ANGLE_LOCAL_VAR = EXPR;                   \
+        if (ANGLE_UNLIKELY(ANGLE_LOCAL_VAR.isError())) \
+        {                                              \
+            return ANGLE_LOCAL_VAR.getError();         \
+        }                                              \
+        RESULT = ANGLE_LOCAL_VAR.getResult();          \
+    }                                                  \
     ANGLE_EMPTY_STATEMENT
 
 // TODO(jmadill): Introduce way to store errors to a const Context.
 #define ANGLE_SWALLOW_ERR(EXPR)                                       \
     {                                                                 \
         auto ANGLE_LOCAL_VAR = EXPR;                                  \
-        if (ANGLE_LOCAL_VAR.isError())                                \
+        if (ANGLE_UNLIKELY(ANGLE_LOCAL_VAR.isError()))                \
         {                                                             \
             ERR() << "Unhandled internal error: " << ANGLE_LOCAL_VAR; \
         }                                                             \
diff --git a/src/libANGLE/renderer/vulkan/vk_utils.h b/src/libANGLE/renderer/vulkan/vk_utils.h
index 71b56a3..38be0df 100644
--- a/src/libANGLE/renderer/vulkan/vk_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_utils.h
@@ -667,7 +667,7 @@
 #define ANGLE_VK_TRY(command)                                          \
     {                                                                  \
         auto ANGLE_LOCAL_VAR = command;                                \
-        if (ANGLE_LOCAL_VAR != VK_SUCCESS)                             \
+        if (ANGLE_UNLIKELY(ANGLE_LOCAL_VAR != VK_SUCCESS))             \
         {                                                              \
             return rx::vk::Error(ANGLE_LOCAL_VAR, __FILE__, __LINE__); \
         }                                                              \