Changeset: 9e2af4b1eb1c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9e2af4b1eb1c
Modified Files:
        gdk/gdk_calc.c
        gdk/gdk_calc_compare.h
Branch: Oct2020
Log Message:

Only call canditer_next when needed, and avoid multiplication.


diffs (truncated from 1665 to 300 lines):

diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -83,12 +83,13 @@ checkbats(BAT *b1, BAT *b2, const char *
 
 #define BINARY_3TYPE_FUNC(TYPE1, TYPE2, TYPE3, FUNC)                   \
        do {                                                            \
+               i = j = 0;                                              \
                if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
                        for (k = 0; k < ci1->ncand; k++) {              \
-                               x1 = canditer_next_dense(ci1) - candoff1; \
-                               x2 = canditer_next_dense(ci2) - candoff2; \
-                               i = x1 * incr1;                         \
-                               j = x2 * incr2;                         \
+                               if (incr1)                              \
+                                       i = canditer_next_dense(ci1) - 
candoff1; \
+                               if (incr2)                              \
+                                       j = canditer_next_dense(ci2) - 
candoff2; \
                                TYPE1 v1 = ((const TYPE1 *) lft)[i];    \
                                TYPE2 v2 = ((const TYPE2 *) rgt)[j];    \
                                if (is_##TYPE1##_nil(v1) || 
is_##TYPE2##_nil(v2)) { \
@@ -100,10 +101,10 @@ checkbats(BAT *b1, BAT *b2, const char *
                        }                                               \
                } else {                                                \
                        for (k = 0; k < ci1->ncand; k++) {              \
-                               x1 = canditer_next(ci1) - candoff1;     \
-                               x2 = canditer_next(ci2) - candoff2;     \
-                               i = x1 * incr1;                         \
-                               j = x2 * incr2;                         \
+                               if (incr1)                              \
+                                       i = canditer_next(ci1) - candoff1; \
+                               if (incr2)                              \
+                                       j = canditer_next(ci2) - candoff2; \
                                TYPE1 v1 = ((const TYPE1 *) lft)[i];    \
                                TYPE2 v2 = ((const TYPE2 *) rgt)[j];    \
                                if (is_##TYPE1##_nil(v1) || 
is_##TYPE2##_nil(v2)) { \
@@ -120,12 +121,13 @@ checkbats(BAT *b1, BAT *b2, const char *
  * when it is set */
 #define BINARY_3TYPE_FUNC_nilmatch(TYPE1, TYPE2, TYPE3, FUNC)          \
        do {                                                            \
+               i = j = 0;                                              \
                if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
                        for (k = 0; k < ci1->ncand; k++) {              \
-                               x1 = canditer_next_dense(ci1) - candoff1; \
-                               x2 = canditer_next_dense(ci2) - candoff2; \
-                               i = x1 * incr1;                         \
-                               j = x2 * incr2;                         \
+                               if (incr1)                              \
+                                       i = canditer_next_dense(ci1) - 
candoff1; \
+                               if (incr2)                              \
+                                       j = canditer_next_dense(ci2) - 
candoff2; \
                                TYPE1 v1 = ((const TYPE1 *) lft)[i];    \
                                TYPE2 v2 = ((const TYPE2 *) rgt)[j];    \
                                if (is_##TYPE1##_nil(v1) || 
is_##TYPE2##_nil(v2)) { \
@@ -136,10 +138,10 @@ checkbats(BAT *b1, BAT *b2, const char *
                        }                                               \
                } else {                                                \
                        for (k = 0; k < ci1->ncand; k++) {              \
-                               x1 = canditer_next(ci1) - candoff1;     \
-                               x2 = canditer_next(ci2) - candoff2;     \
-                               i = x1 * incr1;                         \
-                               j = x2 * incr2;                         \
+                               if (incr1)                              \
+                                       i = canditer_next(ci1) - candoff1; \
+                               if (incr2)                              \
+                                       j = canditer_next(ci2) - candoff2; \
                                TYPE1 v1 = ((const TYPE1 *) lft)[i];    \
                                TYPE2 v2 = ((const TYPE2 *) rgt)[j];    \
                                if (is_##TYPE1##_nil(v1) || 
is_##TYPE2##_nil(v2)) { \
@@ -153,22 +155,23 @@ checkbats(BAT *b1, BAT *b2, const char *
 
 #define BINARY_3TYPE_FUNC_nonil(TYPE1, TYPE2, TYPE3, FUNC)             \
        do {                                                            \
+               i = j = 0;                                              \
                if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
                        for (k = 0; k < ci1->ncand; k++) {              \
-                               x1 = canditer_next_dense(ci1) - candoff1; \
-                               x2 = canditer_next_dense(ci2) - candoff2; \
-                               i = x1 * incr1;                         \
-                               j = x2 * incr2;                         \
+                               if (incr1)                              \
+                                       i = canditer_next_dense(ci1) - 
candoff1; \
+                               if (incr2)                              \
+                                       j = canditer_next_dense(ci2) - 
candoff2; \
                                TYPE1 v1 = ((const TYPE1 *) lft)[i];    \
                                TYPE2 v2 = ((const TYPE2 *) rgt)[j];    \
                                ((TYPE3 *) dst)[k] = FUNC(v1, v2);      \
                        }                                               \
                } else {                                                \
                        for (k = 0; k < ci1->ncand; k++) {              \
-                               x1 = canditer_next(ci1) - candoff1;     \
-                               x2 = canditer_next(ci2) - candoff2;     \
-                               i = x1 * incr1;                         \
-                               j = x2 * incr2;                         \
+                               if (incr1)                              \
+                                       i = canditer_next(ci1) - candoff1; \
+                               if (incr2)                              \
+                                       j = canditer_next(ci2) - candoff2; \
                                TYPE1 v1 = ((const TYPE1 *) lft)[i];    \
                                TYPE2 v2 = ((const TYPE2 *) rgt)[j];    \
                                ((TYPE3 *) dst)[k] = FUNC(v1, v2);      \
@@ -178,12 +181,13 @@ checkbats(BAT *b1, BAT *b2, const char *
 
 #define BINARY_3TYPE_FUNC_CHECK(TYPE1, TYPE2, TYPE3, FUNC, CHECK)      \
        do {                                                            \
+               i = j = 0;                                              \
                if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
                        for (k = 0; k < ci1->ncand; k++) {              \
-                               x1 = canditer_next_dense(ci1) - candoff1; \
-                               x2 = canditer_next_dense(ci2) - candoff2; \
-                               i = x1 * incr1;                         \
-                               j = x2 * incr2;                         \
+                               if (incr1)                              \
+                                       i = canditer_next_dense(ci1) - 
candoff1; \
+                               if (incr2)                              \
+                                       j = canditer_next_dense(ci2) - 
candoff2; \
                                TYPE1 v1 = ((const TYPE1 *) lft)[i];    \
                                TYPE2 v2 = ((const TYPE2 *) rgt)[j];    \
                                if (is_##TYPE1##_nil(v1) || 
is_##TYPE2##_nil(v2)) { \
@@ -206,10 +210,10 @@ checkbats(BAT *b1, BAT *b2, const char *
                        }                                               \
                } else {                                                \
                        for (k = 0; k < ci1->ncand; k++) {              \
-                               x1 = canditer_next(ci1) - candoff1;     \
-                               x2 = canditer_next(ci2) - candoff2;     \
-                               i = x1 * incr1;                         \
-                               j = x2 * incr2;                         \
+                               if (incr1)                              \
+                                       i = canditer_next(ci1) - candoff1; \
+                               if (incr2)                              \
+                                       j = canditer_next(ci2) - candoff2; \
                                TYPE1 v1 = ((const TYPE1 *) lft)[i];    \
                                TYPE2 v2 = ((const TYPE2 *) rgt)[j];    \
                                if (is_##TYPE1##_nil(v1) || 
is_##TYPE2##_nil(v2)) { \
@@ -1700,8 +1704,8 @@ BATcalccstmax_no_nil(const ValRecord *v,
 
 #define ADD_3TYPE(TYPE1, TYPE2, TYPE3, IF)                             \
 static BUN                                                             \
-add_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, int incr1,           \
-                               const TYPE2 *rgt, int incr2,            \
+add_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1,          \
+                               const TYPE2 *rgt, bool incr2,           \
                                TYPE3 *restrict dst, TYPE3 max,         \
                                struct canditer *restrict ci1,          \
                                struct canditer *restrict ci2,          \
@@ -1709,13 +1713,14 @@ add_##TYPE1##_##TYPE2##_##TYPE3(const TY
                                bool abort_on_error)                    \
 {                                                                      \
        BUN nils = 0;                                                   \
+       BUN i = 0, j = 0;                                               \
                                                                        \
        if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) {         \
                for (BUN k = 0; k < ci1->ncand; k++) {                  \
-                       oid x1 = canditer_next_dense(ci1) - candoff1;   \
-                       oid x2 = canditer_next_dense(ci2) - candoff2;   \
-                       BUN i = x1 * incr1;                             \
-                       BUN j = x2 * incr2;                             \
+                       if (incr1)                                      \
+                               i = canditer_next_dense(ci1) - candoff1; \
+                       if (incr2)                                      \
+                               j = canditer_next_dense(ci2) - candoff2; \
                        if (is_##TYPE1##_nil(lft[i]) || 
is_##TYPE2##_nil(rgt[j])) { \
                                dst[k] = TYPE3##_nil;                   \
                                nils++;                                 \
@@ -1728,10 +1733,10 @@ add_##TYPE1##_##TYPE2##_##TYPE3(const TY
                }                                                       \
        } else {                                                        \
                for (BUN k = 0; k < ci1->ncand; k++) {                  \
-                       oid x1 = canditer_next(ci1) - candoff1;         \
-                       oid x2 = canditer_next(ci2) - candoff2;         \
-                       BUN i = x1 * incr1;                             \
-                       BUN j = x2 * incr2;                             \
+                       if (incr1)                                      \
+                               i = canditer_next(ci1) - candoff1;      \
+                       if (incr2)                                      \
+                               j = canditer_next(ci2) - candoff2; \
                        if (is_##TYPE1##_nil(lft[i]) || 
is_##TYPE2##_nil(rgt[j])) { \
                                dst[k] = TYPE3##_nil;                   \
                                nils++;                                 \
@@ -1748,8 +1753,8 @@ add_##TYPE1##_##TYPE2##_##TYPE3(const TY
 
 #define ADD_3TYPE_enlarge(TYPE1, TYPE2, TYPE3, IF)                     \
 static BUN                                                             \
-add_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, int incr1,           \
-                               const TYPE2 *rgt, int incr2,            \
+add_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1,          \
+                               const TYPE2 *rgt, bool incr2,           \
                                TYPE3 *restrict dst, TYPE3 max,         \
                                struct canditer *restrict ci1,          \
                                struct canditer *restrict ci2,          \
@@ -1757,14 +1762,15 @@ add_##TYPE1##_##TYPE2##_##TYPE3(const TY
                                bool abort_on_error)                    \
 {                                                                      \
        BUN nils = 0;                                                   \
+       BUN i = 0, j = 0;                                               \
        const bool couldoverflow = (max < (TYPE3) GDK_##TYPE1##_max + (TYPE3) 
GDK_##TYPE2##_max); \
                                                                        \
        if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) {         \
                for (BUN k = 0; k < ci1->ncand; k++) {                  \
-                       oid x1 = canditer_next_dense(ci1) - candoff1;   \
-                       oid x2 = canditer_next_dense(ci2) - candoff2;   \
-                       BUN i = x1 * incr1;                             \
-                       BUN j = x2 * incr2;                             \
+                       if (incr1)                                      \
+                               i = canditer_next_dense(ci1) - candoff1; \
+                       if (incr2)                                      \
+                               j = canditer_next_dense(ci2) - candoff2; \
                        if (is_##TYPE1##_nil(lft[i]) || 
is_##TYPE2##_nil(rgt[j])) { \
                                dst[k] = TYPE3##_nil;                   \
                                nils++;                                 \
@@ -1779,10 +1785,10 @@ add_##TYPE1##_##TYPE2##_##TYPE3(const TY
                }                                                       \
        } else {                                                        \
                for (BUN k = 0; k < ci1->ncand; k++) {                  \
-                       oid x1 = canditer_next(ci1) - candoff1;         \
-                       oid x2 = canditer_next(ci2) - candoff2;         \
-                       BUN i = x1 * incr1;                             \
-                       BUN j = x2 * incr2;                             \
+                       if (incr1)                                      \
+                               i = canditer_next(ci1) - candoff1;      \
+                       if (incr2)                                      \
+                               j = canditer_next(ci2) - candoff2;      \
                        if (is_##TYPE1##_nil(lft[i]) || 
is_##TYPE2##_nil(rgt[j])) { \
                                dst[k] = TYPE3##_nil;                   \
                                nils++;                                 \
@@ -1987,8 +1993,8 @@ ADD_3TYPE(dbl, flt, dbl, F)
 ADD_3TYPE(dbl, dbl, dbl, F)
 
 static BUN
-add_typeswitchloop(const void *lft, int tp1, int incr1,
-                  const void *rgt, int tp2, int incr2,
+add_typeswitchloop(const void *lft, int tp1, bool incr1,
+                  const void *rgt, int tp2, bool incr2,
                   void *restrict dst, int tp,
                   struct canditer *restrict ci1, struct canditer *restrict ci2,
                   oid candoff1, oid candoff2, bool abort_on_error,
@@ -3318,10 +3324,8 @@ BATcalcadd(BAT *b1, BAT *b2, BAT *s1, BA
        if (b1->ttype == TYPE_str && b2->ttype == TYPE_str && tp == TYPE_str) {
                nils = addstr_loop(b1, NULL, b2, NULL, bn, &ci1, &ci2);
        } else {
-               nils = add_typeswitchloop(Tloc(b1, 0),
-                                         b1->ttype, 1,
-                                         Tloc(b2, 0),
-                                         b2->ttype, 1,
+               nils = add_typeswitchloop(Tloc(b1, 0), b1->ttype, true,
+                                         Tloc(b2, 0), b2->ttype, true,
                                          Tloc(bn, 0), tp,
                                          &ci1, &ci2,
                                          b1->hseqbase, b2->hseqbase,
@@ -3380,8 +3384,8 @@ BATcalcaddcst(BAT *b, const ValRecord *v
        if (b->ttype == TYPE_str && v->vtype == TYPE_str && tp == TYPE_str) {
                nils = addstr_loop(b, NULL, NULL, v->val.sval, bn, &ci, 
&(struct canditer){.tpe=cand_dense, .ncand=ncand});
        } else {
-               nils = add_typeswitchloop(Tloc(b, 0), b->ttype, 1,
-                                         VALptr(v), v->vtype, 0,
+               nils = add_typeswitchloop(Tloc(b, 0), b->ttype, true,
+                                         VALptr(v), v->vtype, false,
                                          Tloc(bn, 0), tp,
                                          &ci,
                                          &(struct canditer){.tpe=cand_dense, 
.ncand=ncand},
@@ -3439,8 +3443,8 @@ BATcalccstadd(const ValRecord *v, BAT *b
        if (b->ttype == TYPE_str && v->vtype == TYPE_str && tp == TYPE_str) {
                nils = addstr_loop(NULL, v->val.sval, b, NULL, bn, &(struct 
canditer){.tpe=cand_dense, .ncand=ncand}, &ci);
        } else {
-               nils = add_typeswitchloop(VALptr(v), v->vtype, 0,
-                                         Tloc(b, 0), b->ttype, 1,
+               nils = add_typeswitchloop(VALptr(v), v->vtype, false,
+                                         Tloc(b, 0), b->ttype, true,
                                          Tloc(bn, 0), tp,
                                          &(struct canditer){.tpe=cand_dense, 
.ncand=ncand},
                                          &ci,
@@ -3478,8 +3482,8 @@ gdk_return
 VARcalcadd(ValPtr ret, const ValRecord *lft, const ValRecord *rgt,
           bool abort_on_error)
 {
-       if (add_typeswitchloop(VALptr(lft), lft->vtype, 0,
-                              VALptr(rgt), rgt->vtype, 0,
+       if (add_typeswitchloop(VALptr(lft), lft->vtype, false,
+                              VALptr(rgt), rgt->vtype, false,
                               VALget(ret), ret->vtype,
                               &(struct canditer){.tpe=cand_dense, .ncand=1},
                               &(struct canditer){.tpe=cand_dense, .ncand=1},
@@ -3490,8 +3494,8 @@ VARcalcadd(ValPtr ret, const ValRecord *
 
 static BAT *
 BATcalcincrdecr(BAT *b, BAT *s, bool abort_on_error,
-               BUN (*typeswitchloop)(const void *, int, int,
-                                     const void *, int, int,
+               BUN (*typeswitchloop)(const void *, int, bool,
+                                     const void *, int, bool,
                                      void *, int,
                                      struct canditer *restrict,
                                      struct canditer *restrict,
@@ -3516,8 +3520,8 @@ BATcalcincrdecr(BAT *b, BAT *s, bool abo
        if (ncand == 0)
                return bn;
 
-       nils = (*typeswitchloop)(Tloc(b, 0), b->ttype, 1,
-                                &(bte){1}, TYPE_bte, 0,
+       nils = (*typeswitchloop)(Tloc(b, 0), b->ttype, true,
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to