Changeset: eedc4984ccfc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/eedc4984ccfc
Modified Files:
gdk/gdk_aggr.c
gdk/gdk_calc_private.h
monetdb5/modules/mal/tablet.c
Branch: nilmask
Log Message:
Merge with default branch.
diffs (truncated from 696 to 300 lines):
diff --git a/common/utils/mstring.h b/common/utils/mstring.h
--- a/common/utils/mstring.h
+++ b/common/utils/mstring.h
@@ -83,10 +83,22 @@ strconcat_len(char *restrict dst, size_t
return i;
}
-#ifndef __GNUC__
+#ifdef __has_builtin
+#if __has_builtin(__builtin_expect)
/* __builtin_expect returns its first argument; it is expected to be
* equal to the second argument */
-#define __builtin_expect(expr, expect) (expr)
+#define unlikely(expr) __builtin_expect((expr) != 0, 0)
+#define likely(expr) __builtin_expect((expr) != 0, 1)
+#endif
+#endif
+#ifndef unlikely
+#ifdef _MSC_VER
+#define unlikely(expr) (__assume(!(expr)), (expr))
+#define likely(expr) (__assume((expr)), (expr))
+#else
+#define unlikely(expr) (expr)
+#define likely(expr) (expr)
+#endif
#endif
/*
@@ -105,12 +117,11 @@ strconcat_len(char *restrict dst, size_t
static inline bool
checkUTF8(const char *v)
{
- /* It is unlikely that this functions returns false, because
- * it is likely that the string presented is a correctly coded
- * UTF-8 string. So we annotate the tests that are very
- * unlikely to succeed, i.e. the ones that lead to a return of
- * false, as being expected to return 0 using the
- * __builtin_expect function. */
+ /* It is unlikely that this functions returns false, because it is
+ * likely that the string presented is a correctly coded UTF-8
+ * string. So we annotate the tests that are very (un)likely to
+ * succeed, i.e. the ones that lead to a return of false. This can
+ * help the compiler produce more efficient code. */
if (v != NULL) {
if (v[0] != '\200' || v[1] != '\0') {
/* check that string is correctly encoded UTF-8 */
@@ -121,30 +132,30 @@ checkUTF8(const char *v)
if ((v[i] & 0x80) == 0) {
;
} else if ((v[i] & 0xE0) == 0xC0) {
- if (__builtin_expect(((v[i] & 0x1E) ==
0), 0))
+ if (unlikely(((v[i] & 0x1E) == 0)))
return false;
- if (__builtin_expect(((v[++i] & 0xC0)
!= 0x80), 0))
+ if (unlikely(((v[++i] & 0xC0) != 0x80)))
return false;
} else if ((v[i] & 0xF0) == 0xE0) {
if ((v[i++] & 0x0F) == 0) {
- if (__builtin_expect(((v[i] &
0xE0) != 0xA0), 0))
+ if (unlikely(((v[i] & 0xE0) !=
0xA0)))
return false;
} else {
- if (__builtin_expect(((v[i] &
0xC0) != 0x80), 0))
+ if (unlikely(((v[i] & 0xC0) !=
0x80)))
return false;
}
- if (__builtin_expect(((v[++i] & 0xC0)
!= 0x80), 0))
+ if (unlikely(((v[++i] & 0xC0) != 0x80)))
return false;
- } else if (__builtin_expect(((v[i] & 0xF8) ==
0xF0), 1)) {
+ } else if (likely(((v[i] & 0xF8) == 0xF0))) {
if ((v[i++] & 0x07) == 0) {
- if (__builtin_expect(((v[i] &
0x30) == 0), 0))
+ if (unlikely(((v[i] & 0x30) ==
0)))
return false;
}
- if (__builtin_expect(((v[i] & 0xC0) !=
0x80), 0))
+ if (unlikely(((v[i] & 0xC0) != 0x80)))
return false;
- if (__builtin_expect(((v[++i] & 0xC0)
!= 0x80), 0))
+ if (unlikely(((v[++i] & 0xC0) != 0x80)))
return false;
- if (__builtin_expect(((v[++i] & 0xC0)
!= 0x80), 0))
+ if (unlikely(((v[++i] & 0xC0) != 0x80)))
return false;
} else {
return false;
@@ -222,10 +233,7 @@ reallocprintf(char **buf, size_t *pos, s
return n;
}
-
-
-#ifndef __GNUC__
-#undef __builtin_expect
-#endif
+#undef unlikely
+#undef likely
#endif
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -439,7 +439,7 @@ dofsum(const void *restrict values, oid
*seen = ci->ncand > 0; \
TIMEOUT_LOOP_IDX(i, ci->ncand, qry_ctx) { \
x = vals[ci->seq + i - seqb]; \
- ADD_WITH_CHECK(x, sum, \
+ ADDI_WITH_CHECK(x, sum, \
TYPE2, sum, \
GDK_##TYPE2##_max, \
goto overflow); \
@@ -457,7 +457,7 @@ dofsum(const void *restrict values, oid
TIMEOUT_LOOP_BREAK; \
} \
} else { \
- ADD_WITH_CHECK(x, sum, \
+ ADDI_WITH_CHECK(x, sum, \
TYPE2, sum, \
GDK_##TYPE2##_max, \
goto overflow); \
@@ -485,7 +485,7 @@ dofsum(const void *restrict values, oid
TIMEOUT_LOOP_BREAK; \
} \
} else { \
- ADD_WITH_CHECK(x, sum, \
+ ADDI_WITH_CHECK(x, sum, \
TYPE2, sum, \
GDK_##TYPE2##_max, \
goto overflow); \
@@ -516,7 +516,7 @@ dofsum(const void *restrict values, oid
sums[gid] = 0; \
} \
if
(!is_##TYPE2##_nil(sums[gid])) { \
- ADD_WITH_CHECK( \
+ ADDI_WITH_CHECK( \
x, \
sums[gid], \
TYPE2, \
@@ -550,7 +550,7 @@ dofsum(const void *restrict values, oid
sums[gid] = 0; \
} \
if
(!is_##TYPE2##_nil(sums[gid])) { \
- ADD_WITH_CHECK( \
+ ADDI_WITH_CHECK( \
x, \
sums[gid], \
TYPE2, \
@@ -1531,7 +1531,7 @@ BATsum(void *res, int tp, BAT *b, BAT *s
prods[gid] = 1; \
} \
if (!is_##TYPE2##_nil(prods[gid])) { \
- MUL4_WITH_CHECK( \
+ MULI4_WITH_CHECK( \
vals[i], \
prods[gid], \
TYPE2, prods[gid], \
@@ -3894,7 +3894,7 @@ BATgroupavg3combine(BAT *avg, BAT *rem,
x = ((const TYPE *) src)[i]; \
if (is_##TYPE##_nil(x)) \
continue; \
- ADD_WITH_CHECK(x, sum, \
+ ADDI_WITH_CHECK(x, sum, \
lng_hge, sum, \
GDK_##lng_hge##_max, \
goto overflow##TYPE); \
diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c
--- a/gdk/gdk_analytic_func.c
+++ b/gdk/gdk_analytic_func.c
@@ -1734,7 +1734,7 @@ cleanup:
if (is_##TPE2##_nil(curval)) \
curval = (TPE2) v; \
else \
- ADD_WITH_CHECK(v, curval, TPE2, curval,
GDK_##TPE2##_max, goto calc_overflow); \
+ ADDI_WITH_CHECK(v, curval, TPE2,
curval, GDK_##TPE2##_max, goto calc_overflow); \
} \
} \
for (; k < i; k++) \
@@ -2025,7 +2025,7 @@ nosupport:
if (is_##TPE2##_nil(curval)) \
curval = (TPE2) ARG; \
else \
- MUL4_WITH_CHECK(ARG, curval, TPE2, curval,
GDK_##TPE2##_max, TPE3, goto calc_overflow); \
+ MULI4_WITH_CHECK(ARG, curval, TPE2, curval,
GDK_##TPE2##_max, TPE3, goto calc_overflow); \
} \
} while(0)
@@ -2105,7 +2105,7 @@ nosupport:
if (is_##TPE2##_nil(computed)) \
computed = VAL; \
else \
- MUL4_WITH_CHECK(VAL, computed, TPE2, computed,
GDK_##TPE2##_max, TPE3, goto calc_overflow); \
+ MULI4_WITH_CHECK(VAL, computed, TPE2, computed,
GDK_##TPE2##_max, TPE3, goto calc_overflow); \
} \
} while (0)
#define FINALIZE_AGGREGATE_PROD(NOTHING1, TPE2, NOTHING2) \
diff --git a/gdk/gdk_analytic_statistics.c b/gdk/gdk_analytic_statistics.c
--- a/gdk/gdk_analytic_statistics.c
+++ b/gdk/gdk_analytic_statistics.c
@@ -29,7 +29,7 @@
#define ANALYTICAL_AVERAGE_CALC_NUM_STEP1(TPE, IMP, ARG) \
do { \
if (!is_##TPE##_nil(ARG)) { \
- ADD_WITH_CHECK(ARG, sum, LNG_HGE, sum, \
+ ADDI_WITH_CHECK(ARG, sum, LNG_HGE, sum, \
GDK_LNG_HGE_max, \
goto avg_overflow##TPE##IMP); \
/* count only when no overflow occurs */ \
diff --git a/gdk/gdk_calc_private.h b/gdk/gdk_calc_private.h
--- a/gdk/gdk_calc_private.h
+++ b/gdk/gdk_calc_private.h
@@ -35,15 +35,17 @@
#include "gdk_cand.h"
-#ifdef HAVE___BUILTIN_ADD_OVERFLOW
+#ifdef __has_builtin
+#if __has_builtin(__builtin_add_overflow)
#define OP_WITH_CHECK(lft, rgt, dst, op, max, on_overflow) \
do { \
if (__builtin_##op##_overflow(lft, rgt, &(dst)) || \
- (dst) < -(max) || (dst) > (max)) { \
+ (dst) < -(max) /*|| (dst) > (max)*/) { \
on_overflow; \
} \
} while (0)
-#endif /* HAVE___BUILTIN_ADD_OVERFLOW */
+#endif
+#endif
/* dst = lft + rgt with overflow check */
@@ -65,7 +67,7 @@
} \
} while (0)
-#ifdef HAVE___BUILTIN_ADD_OVERFLOW
+#ifdef OP_WITH_CHECK
/* integer version using Gnu CC builtin function for overflow check */
#define ADDI_WITH_CHECK(lft, rgt, TYPE3, dst, max, on_overflow)
\
OP_WITH_CHECK(lft, rgt, dst, add, max, on_overflow)
@@ -99,7 +101,7 @@
} \
} while (0)
-#ifdef HAVE___BUILTIN_ADD_OVERFLOW
+#ifdef OP_WITH_CHECK
/* integer version using Gnu CC builtin function for overflow check */
#define SUBI_WITH_CHECK(lft, rgt, TYPE3, dst, max, on_overflow)
\
OP_WITH_CHECK(lft, rgt, dst, sub, max, on_overflow)
@@ -119,15 +121,14 @@
#define MUL4_WITH_CHECK(lft, rgt, TYPE3, dst, max, TYPE4, on_overflow) \
do { \
TYPE4 c = (TYPE4) (lft) * (rgt); \
- if (c < (TYPE4) -(max) || \
- c > (TYPE4) (max)) { \
+ if (c < (TYPE4) -(max) /*|| c > (TYPE4) (max)*/) { \
on_overflow; \
} else { \
(dst) = (TYPE3) c; \
} \
} while (0)
-#ifdef HAVE___BUILTIN_ADD_OVERFLOW
+#ifdef OP_WITH_CHECK
/* integer version using Gnu CC builtin function for overflow check */
#define MULI4_WITH_CHECK(lft, rgt, TYPE3, dst, max, TYPE4, on_overflow) \
OP_WITH_CHECK(lft, rgt, dst, mul, max, on_overflow)
@@ -150,7 +151,7 @@
do { \
__int64 clo, chi; \
clo = _mul128((__int64) (lft), (__int64) (rgt), &chi); \
- if ((chi == 0 && clo >= 0 && clo <= (max)) || \
+ if ((chi == 0 && clo >= 0 /*&& clo <= (max)*/) || \
(chi == -1 && clo < 0 && clo >= -(max))) { \
(dst) = (lng) clo; \
} else { \
@@ -193,7 +194,7 @@
MUL4_WITH_CHECK(lft, rgt, TYPE3, dst, max, TYPE4, on_overflow)
#ifdef HAVE_HGE
-#ifdef HAVE___BUILTIN_ADD_OVERFLOW
+#ifdef OP_WITH_CHECK
#define HGEMUL_CHECK(lft, rgt, dst, max, on_overflow) \
OP_WITH_CHECK(lft, rgt, dst, mul, max, on_overflow)
#else
diff --git a/gdk/gdk_cand.h b/gdk/gdk_cand.h
--- a/gdk/gdk_cand.h
+++ b/gdk/gdk_cand.h
@@ -82,9 +82,14 @@ static inline int __attribute__((__const
candmask_lobit(uint32_t x)
{
assert(x != 0);
-#if defined(__GNUC__)
+#ifdef __has_builtin
+#if __has_builtin(__builtin_ctz)
return __builtin_ctz(x) /* ffs(x) - 1 */;
-#elif defined(_MSC_VER)
+#define BUILTIN_USED
+#endif
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]