Changeset: a08f1e1d5db3 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a08f1e1d5db3
Modified Files:
gdk/gdk_select.c
Branch: default
Log Message:
full predicate expansion for scan-select
to avoid redundant loop-invariant comparisons and
further simplify inner-most loops for compiler optimization
diffs (91 lines):
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -204,26 +204,43 @@ do {
\
} while (0)
/* scan select predicate switch */
-#define scantest(CAND,READ,COMP) \
-do { \
- if (equi) { \
- scanloop ( CAND , READ , COMP(v,==,vl) ); \
- } else \
- if (anti) { \
- scanloop ( CAND , READ , \
- (b->T->nonil || COMP(v,!=,nil)) && \
- ((lval && (COMP(v,<,vl) || \
- (!li && COMP(v,==,vl)))) || \
- (hval && (COMP(v,>,vh) || \
- (!hi && COMP(v,==,vh))))) ); \
- } else { \
- scanloop ( CAND , READ , \
- (b->T->nonil || COMP(v,!=,nil)) && \
- ((!lval || COMP(v,>,vl) || \
- (li && COMP(v,==,vl))) && \
- (!hval || COMP(v,<,vh) || \
- (hi && COMP(v,==,vh)))) ); \
- } \
+#define scantest(CAND,READ,COMP,NIL1,NIL2) \
+do { \
+if (equi ) { scanloop ( CAND ,
READ , COMP(v,==,vl) ); } else \
+if ( anti && b->T->nonil && lval && !li && hval && !hi) { scanloop ( CAND ,
READ , (COMP(v,<=,vl) || COMP(v,>=,vh)) ); } else \
+if ( anti && b->T->nonil && lval && !li && hval && hi) { scanloop ( CAND ,
READ , (COMP(v,<=,vl) || COMP(v,> ,vh)) ); } else \
+if ( anti && b->T->nonil && lval && li && hval && !hi) { scanloop ( CAND ,
READ , (COMP(v,< ,vl) || COMP(v,>=,vh)) ); } else \
+if ( anti && b->T->nonil && lval && li && hval && hi) { scanloop ( CAND ,
READ , (COMP(v,< ,vl) || COMP(v,> ,vh)) ); } else \
+if ( anti && b->T->nonil && lval && !li && !hval ) { scanloop ( CAND ,
READ , (COMP(v,<=,vl) ) ); } else \
+if ( anti && b->T->nonil && lval && li && !hval ) { scanloop ( CAND ,
READ , (COMP(v,< ,vl) ) ); } else \
+if ( anti && b->T->nonil && !lval && hval && !hi) { scanloop ( CAND ,
READ , ( COMP(v,>=,vh)) ); } else \
+if ( anti && b->T->nonil && !lval && hval && hi) { scanloop ( CAND ,
READ , ( COMP(v,> ,vh)) ); } else \
+if ( anti && !b->T->nonil && lval && !li && hval && !hi) { scanloop ( CAND ,
READ , (COMP(v,<=,vl) || COMP(v,>=,vh)) NIL1(v) ); } else \
+if ( anti && !b->T->nonil && lval && !li && hval && hi) { scanloop ( CAND ,
READ , (COMP(v,<=,vl) || COMP(v,> ,vh)) NIL1(v) ); } else \
+if ( anti && !b->T->nonil && lval && li && hval && !hi) { scanloop ( CAND ,
READ , (COMP(v,< ,vl) || COMP(v,>=,vh)) NIL1(v) ); } else \
+if ( anti && !b->T->nonil && lval && li && hval && hi) { scanloop ( CAND ,
READ , (COMP(v,< ,vl) || COMP(v,> ,vh)) NIL1(v) ); } else \
+if ( anti && !b->T->nonil && lval && !li && !hval ) { scanloop ( CAND ,
READ , (COMP(v,<=,vl) ) NIL1(v) ); } else \
+if ( anti && !b->T->nonil && lval && li && !hval ) { scanloop ( CAND ,
READ , (COMP(v,< ,vl) ) NIL1(v) ); } else \
+if ( anti && !b->T->nonil && !lval && hval && !hi) { scanloop ( CAND ,
READ , ( COMP(v,>=,vh)) NIL2(v) ); } else \
+if ( anti && !b->T->nonil && !lval && hval && hi) { scanloop ( CAND ,
READ , ( COMP(v,> ,vh)) NIL2(v) ); } else \
+if (!anti && b->T->nonil && lval && !li && hval && !hi) { scanloop ( CAND ,
READ , (COMP(v,> ,vl) && COMP(v,< ,vh)) ); } else \
+if (!anti && b->T->nonil && lval && !li && hval && hi) { scanloop ( CAND ,
READ , (COMP(v,> ,vl) && COMP(v,<=,vh)) ); } else \
+if (!anti && b->T->nonil && lval && li && hval && !hi) { scanloop ( CAND ,
READ , (COMP(v,>=,vl) && COMP(v,< ,vh)) ); } else \
+if (!anti && b->T->nonil && lval && li && hval && hi) { scanloop ( CAND ,
READ , (COMP(v,>=,vl) && COMP(v,<=,vh)) ); } else \
+if (!anti && b->T->nonil && lval && !li && !hval ) { scanloop ( CAND ,
READ , (COMP(v,> ,vl) ) ); } else \
+if (!anti && b->T->nonil && lval && li && !hval ) { scanloop ( CAND ,
READ , (COMP(v,>=,vl) ) ); } else \
+if (!anti && b->T->nonil && !lval && hval && !hi) { scanloop ( CAND ,
READ , ( COMP(v,< ,vh)) ); } else \
+if (!anti && b->T->nonil && !lval && hval && hi) { scanloop ( CAND ,
READ , ( COMP(v,<=,vh)) ); } else \
+if (!anti && !b->T->nonil && lval && !li && hval && !hi) { scanloop ( CAND ,
READ , (COMP(v,> ,vl) && COMP(v,< ,vh)) NIL2(v) ); } else \
+if (!anti && !b->T->nonil && lval && !li && hval && hi) { scanloop ( CAND ,
READ , (COMP(v,> ,vl) && COMP(v,<=,vh)) NIL2(v) ); } else \
+if (!anti && !b->T->nonil && lval && li && hval && !hi) { scanloop ( CAND ,
READ , (COMP(v,>=,vl) && COMP(v,< ,vh)) NIL2(v) ); } else \
+if (!anti && !b->T->nonil && lval && li && hval && hi) { scanloop ( CAND ,
READ , (COMP(v,>=,vl) && COMP(v,<=,vh)) NIL2(v) ); } else \
+if (!anti && !b->T->nonil && lval && !li && !hval ) { scanloop ( CAND ,
READ , (COMP(v,> ,vl) ) NIL2(v) ); } else \
+if (!anti && !b->T->nonil && lval && li && !hval ) { scanloop ( CAND ,
READ , (COMP(v,>=,vl) ) NIL2(v) ); } else \
+if (!anti && !b->T->nonil && !lval && hval && !hi) { scanloop ( CAND ,
READ , ( COMP(v,< ,vh)) NIL1(v) ); } else \
+if (!anti && !b->T->nonil && !lval && hval && hi) { scanloop ( CAND ,
READ , ( COMP(v,<=,vh)) NIL1(v) ); } else \
+if (!anti && !b->T->nonil && !lval && !hval ) { scanloop ( CAND ,
READ , COMP(v,!=,nil) ); } else \
+assert(0); \
} while (0)
/* local variables for known fixed-width types */
@@ -245,9 +262,13 @@ do {
\
/* various comparison calls for known fixed-width types */
#define scancomp_fix(l,o,r) (l) o (r)
+#define scannil1_fix(v) && scancomp_fix(v,!=,nil)
+#define scannil2_fix(v)
/* various comparison calls for generic types */
#define scancomp_var(l,o,r) (*cmp)((l),(r)) o 0
+#define scannil1_var(v) && scancomp_var(v,!=,nil)
+#define scannil2_var(v) scannil1_var(v)
/* argument list for type-specific core scan select function call */
#define scanargs \
@@ -266,7 +287,8 @@ NAME##_##TYPE (BAT *b, BAT *s, BAT *bn,
oid o; \
BUN p = r; \
(void) candlist; \
- scantest(CAND, READ, scancomp_##WHAT); \
+ scantest(CAND, READ, scancomp_##WHAT, \
+ scannil1_##WHAT, scannil2_##WHAT); \
return cnt; \
}
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list