diff --git a/llvm/include/llvm/Support/MathExtras.h b/llvm/include/llvm/Support/MathExtras.h --- a/llvm/include/llvm/Support/MathExtras.h +++ b/llvm/include/llvm/Support/MathExtras.h @@ -860,6 +860,9 @@ template typename std::enable_if::value, T>::type AddOverflow(T X, T Y, T &Result) { +#if __has_builtin(__builtin_add_overflow) + return __builtin_add_overflow(X, Y, &Result); +#else // Perform the unsigned addition. using U = typename std::make_unsigned::type; const U UX = static_cast(X); @@ -876,6 +879,7 @@ if (X < 0 && Y < 0) return Result >= 0; return false; +#endif } /// Subtract two signed integers, computing the two's complement truncated @@ -883,6 +887,9 @@ template typename std::enable_if::value, T>::type SubOverflow(T X, T Y, T &Result) { +#if __has_builtin(__builtin_sub_overflow) + return __builtin_sub_overflow(X, Y, &Result); +#else // Perform the unsigned addition. using U = typename std::make_unsigned::type; const U UX = static_cast(X); @@ -899,6 +906,7 @@ if (X >= 0 && Y < 0) return Result <= 0; return false; +#endif } @@ -907,6 +915,9 @@ template typename std::enable_if::value, T>::type MulOverflow(T X, T Y, T &Result) { +#if __has_builtin(__builtin_mul_overflow) + return __builtin_mul_overflow(X, Y, &Result); +#else // Perform the unsigned multiplication on absolute values. using U = typename std::make_unsigned::type; const U UX = X < 0 ? (0 - static_cast(X)) : static_cast(X); @@ -928,6 +939,7 @@ return UX > (static_cast(std::numeric_limits::max()) + U(1)) / UY; else return UX > (static_cast(std::numeric_limits::max())) / UY; +#endif } } // End llvm namespace