Update of /cvsroot/monetdb/MonetDB5/src/optimizer
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv20403/src/optimizer
Modified Files:
opt_mergetable.mx
Log Message:
fixes and cleanup
fixed aligning of mat/batcalc operations
cleanup mat_reuse is now integrated into mat_apply (ie this handles up
till 3 arguments and reuse)
Index: opt_mergetable.mx
===================================================================
RCS file: /cvsroot/monetdb/MonetDB5/src/optimizer/opt_mergetable.mx,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -d -r1.25 -r1.26
--- opt_mergetable.mx 9 Dec 2007 16:21:12 -0000 1.25
+++ opt_mergetable.mx 9 Dec 2007 21:46:57 -0000 1.26
@@ -175,6 +175,23 @@
return 1;
}
+int Hoverlap( MalBlkPtr mb, int lv, int rv)
+{
+ VarPtr llb = varGetProp(mb, lv, hlbProp);
+ VarPtr lub = varGetProp(mb, lv, hubProp);
+ VarPtr rlb = varGetProp(mb, rv, hlbProp);
+ VarPtr rub = varGetProp(mb, rv, hubProp);
+ if (!llb || !rlb) {
+ /* unknown ie overlap */
+ return 1;
+ }
+ if (rub->value.val.lval <= llb->value.val.lval ||
+ lub->value.val.lval <= rlb->value.val.lval)
+ return 0;
+ return 1;
+}
+
+
static void
propagateProp(MalBlkPtr mb, InstrPtr q, int ivar)
{
@@ -261,33 +278,15 @@
return mtop+1;
}
-static void
-mat_reuse(MalBlkPtr mb, InstrPtr p, mat_t *mat, int m, int a1, int a2, int a3)
-{
- int k;
-
- for(k=1; k<mat[m].mi->argc; k++) {
- InstrPtr q = copyInstruction(p);
- getArg(q,0) = getArg(mat[m].mi,k);
-
- if (a1 >= 0)
- getArg(q,1) = getArg(mat[a1].mi,k);
- if (a2 >= 0)
- getArg(q,2) = getArg(mat[a2].mi,k);
- if (a3 >= 0)
- getArg(q,3) = getArg(mat[a3].mi,k);
- pushInstruction(mb,q);
- }
- freeInstruction(p);
-}
-
/* mat_apply1 handles both apply and reduce cases */
static InstrPtr
-mat_apply1(MalBlkPtr mb, InstrPtr p, mat_t *mat, int m, int var)
+mat_apply1(MalBlkPtr mb, InstrPtr p, mat_t *mat, int m, int var, int reuse)
{
int tpe, k;
InstrPtr r = NULL;
+ assert(reuse == 0);
+ (void)reuse;
if (isaBatType(getVarType(mb,getArg(p,0)))){
r = newInstruction(mb, ASSIGNsymbol);
setModuleId(r,matRef);
@@ -313,15 +312,27 @@
}
static InstrPtr
-mat_apply2(MalBlkPtr mb, InstrPtr p, mat_t *mat, int a1, int a2, int a3)
+mat_apply2(MalBlkPtr mb, InstrPtr p, mat_t *mat, int a1, int a2, int a3, int
reuse)
{
int tpe = getArgType(mb,p,0);
- int k,j;
+ int k,j,m,n,Am,An;
InstrPtr r = newInstruction(mb, ASSIGNsymbol);
- int m = (a1>=0)?a1:a2;
- int n = (a3>=0)?a3:a2;
- int Am = (a1>=0)?1:2;
- int An = (a3>=0)?3:2;
+
+ if (reuse) {
+ if (a1 == a2) {
+ a2 = -1;
+ reuse = 2;
+ }
+ if (a1 == a3) {
+ a3 = -1;
+ reuse = 3;
+ }
+ }
+
+ m = (a1>=0)?a1:a2;
+ n = (a3>=0)?a3:a2;
+ Am = (a1>=0)?1:2;
+ An = (a3>=0)?3:2;
setModuleId(r,matRef);
setFunctionId(r,newRef);
@@ -331,13 +342,20 @@
int vm = getArg(mat[m].mi, j);
for(k=1; k<mat[n].mi->argc; k++) {
int vn = getArg(mat[n].mi, k);
- if (overlap(mb, vm, vn)) {
+ if (Hoverlap(mb, vm, vn)) {
InstrPtr q = copyInstruction(p);
- getArg(q,0) = newTmpVariable(mb, tpe);
+ if (!reuse)
+ getArg(q,0) = newTmpVariable(mb, tpe);
+ else
+ getArg(q,0) = vm;
getArg(q,Am) = vm;
getArg(q,An) = vn;
+ if (reuse)
+ getArg(q,reuse) = vm;
pushInstruction(mb,q);
- propagateProp(mb, q, vm);
+
+ if (!reuse)
+ propagateProp(mb, q, vm);
/* add result to mat */
r = pushArgument(mb,r,getArg(q,0));
@@ -350,7 +368,7 @@
}
static InstrPtr
-mat_apply3(MalBlkPtr mb, InstrPtr p, mat_t *mat, int a1, int a2, int a3)
+mat_apply3(MalBlkPtr mb, InstrPtr p, mat_t *mat, int a1, int a2, int a3, int
reuse)
{
int tpe = getArgType(mb,p,0);
int k,j,i;
@@ -364,17 +382,22 @@
int vi = getArg(mat[a1].mi, i);
for(j=1; j<mat[a2].mi->argc; j++) {
int vj = getArg(mat[a2].mi, j);
- if (overlap(mb, vi, vj)) {
+ if (Hoverlap(mb, vi, vj)) {
for(k=1; k<mat[a3].mi->argc; k++) {
int vk = getArg(mat[a3].mi, k);
- if (overlap(mb, vi, vk)) {
+ if (Hoverlap(mb, vi, vk)) {
InstrPtr q = copyInstruction(p);
- getArg(q,0) =
newTmpVariable(mb, tpe);
+ if (!reuse)
+ getArg(q,0) =
newTmpVariable(mb, tpe);
+ else
+ getArg(q,0) = vi;
+
getArg(q,1) = vi;
getArg(q,2) = vj;
getArg(q,3) = vk;
pushInstruction(mb,q);
- propagateProp(mb, q, vi);
+ if (!reuse)
+ propagateProp(mb, q,
vi);
/* add result to mat */
r =
pushArgument(mb,r,getArg(q,0));
@@ -389,21 +412,22 @@
}
static InstrPtr
-mat_apply(MalBlkPtr mb, InstrPtr p, mat_t *mat, int a1, int a2, int a3)
+mat_apply(MalBlkPtr mb, InstrPtr p, mat_t *mat, int a1, int a2, int a3, int
reuse)
{
if (a1>=0 && a2<0 && a3<0)
- return mat_apply1(mb, p, mat, a1, 1);
+ return mat_apply1(mb, p, mat, a1, 1, reuse);
if (a1<0 && a2>=0 && a3<0)
- return mat_apply1(mb, p, mat, a2, 2);
+ return mat_apply1(mb, p, mat, a2, 2, reuse);
if (a1<0 && a2<0 && a3>=0)
- return mat_apply1(mb, p, mat, a3, 3);
+ return mat_apply1(mb, p, mat, a3, 3, reuse);
- if (a1<0 || a2<0 || a3<0)
- return mat_apply2(mb, p, mat, a1, a2, a3);
+ if (a1<0 || a2<0 || a3<0 || (a1 == a2) || (a1 == a3))
+ return mat_apply2(mb, p, mat, a1, a2, a3, reuse);
- return mat_apply3(mb, p, mat, a1, a2, a3);
+ return mat_apply3(mb, p, mat, a1, a2, a3, reuse);
}
+
/* join 2 mats, also handles the case that mat[m].mm is set, ie that we
have the extend available */
@@ -733,7 +757,7 @@
/* we need overlapping ranges */
for(i=1; i<mat[ext].mi->argc; i++) {
for(k=1; k<mat[attr].mi->argc; k++) {
- if (overlap(mb, getArg(mat[ext].mi, i), getArg(mat[attr].mi,
k))){
+ if (Hoverlap(mb, getArg(mat[ext].mi, i), getArg(mat[attr].mi,
k))){
InstrPtr q = copyInstruction(p);
getArg(q,0) = newTmpVariable(mb, tp0);
getArg(q,1) = newTmpVariable(mb, tp1);
@@ -952,8 +976,9 @@
n = isMATalias(getArg(p,1), mat, mtop);
o = isMATalias(getArg(p,2), mat, mtop);
x = isMATalias(getArg(p,3), mat, mtop);
+ assert(m==n);
}
- mat_reuse(mb, p, mat, m, n, o, x);
+ mat_apply(mb, p, mat, m, o, x, 1);
actions++;
continue;
}
@@ -995,7 +1020,7 @@
n = isMATalias(getArg(p,2), mat, mtop);
if (p->argc >= 4)
o = isMATalias(getArg(p,3), mat, mtop);
- bc = mat_apply(mb, p, mat, m, n, o);
+ bc = mat_apply(mb, p, mat, m, n, o, 0);
mtop = mat_add(mat, mtop, bc, mat_none );
actions++;
continue;
@@ -1143,7 +1168,7 @@
if (getFunctionId(p) == mirrorRef &&
mat[m].type == mat_hist)
pack_mirror = 1;
- if ((r = mat_apply1(mb, p, mat, m, fm)) != NULL)
+ if ((r = mat_apply1(mb, p, mat, m, fm, 0)) != NULL)
mtop = mat_add(mat, mtop, r, mat_none);
/* packed group should include the mirror statement */
if (pack_mirror) {
-------------------------------------------------------------------------
SF.Net email is sponsored by:
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Monetdb-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-checkins