Changeset: 0c31de1be82a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0c31de1be82a Modified Files: monetdb5/scheduler/mut_pack.c Branch: mutation Log Message:
Better handle pack followed by partitioning diffs (121 lines): diff --git a/monetdb5/scheduler/mut_pack.c b/monetdb5/scheduler/mut_pack.c --- a/monetdb5/scheduler/mut_pack.c +++ b/monetdb5/scheduler/mut_pack.c @@ -61,10 +61,14 @@ validswitch(InstrPtr p, InstrPtr q) void mutationPack(Client cntxt, Mutant m){ MalBlkPtr mb = m->src; - int pc = m->target, i, j, mvar, svar, dvar, limit, packpc=0; + int pc = m->target, i, j, mvar, limit, packpc=0; InstrPtr p=0, *old= mb->stmt, q, newpack = 0, newpack1=0, newpack2 = 0; int profiler=0; + DEBUG_MULTICORE { + mnstr_printf(cntxt->fdout,"#MUTATIONPACK\n"); + printFunction(cntxt->fdout, mb, 0, LIST_MAL_ALL); + } (void) cntxt; limit= mb->stop; if ( newMalBlkStmt(mb, mb->ssize) < 0) @@ -72,7 +76,7 @@ mutationPack(Client cntxt, Mutant m){ pushInstruction(mb,old[0]);//needed for debugging // first phase, see if we need to undo a bat.partition - svar = -1; mvar = -1; dvar = -1; + mvar = -1; for (i = 1; i < limit; i++) { p= old[i]; if ( i == pc){ @@ -80,41 +84,59 @@ mutationPack(Client cntxt, Mutant m){ continue; mvar = getArg(p,0); + DEBUG_MULTICORE mnstr_printf(cntxt->fdout,"#MUTATIONPACK move %d ",pc); // move ahead to first candidate for consolidation for(i++ ; i < limit && validswitch(old[pc],old[i]); i++){ old[pc] = old[i]; old[i] = p; pc = i; } + packpc = pc; + newpack = p; + old[pc]= 0; + + DEBUG_MULTICORE mnstr_printf(cntxt->fdout," to %d\n",i-1); q = old[i]; - - // we found a partition to be removed - if (getModuleId(q) == batRef && getFunctionId(q) == partitionRef && getArgPos(p,mvar) >=0){ - svar = getArg(q,0); + if (getModuleId(q) == batRef && getFunctionId(q) == partitionRef && getArgPos(q,mvar) >=0){ + // we bounced upon a partition over a packed variable + // this means we replace the partitions by the matpack components + + int partitions = getVarConstant(mb,getArg(q,2)).val.ival; + for(j =i; j< limit; j++) + if (getModuleId(q= old[j]) == batRef && getFunctionId(q) == partitionRef && getArgPos(q,mvar) >=0){ + partitions --; + if ( partitions == 0 && p->argc > p->retc){ + getArg(p,0)= getArg(q,0); + old[j] = p; + freeInstruction(q); + } else + if ( partitions > 0 && p->argc > p->retc){ + clrFunction(q); + q->argc= q->retc; + q = pushArgument(mb, q, getArg(p,1)); + delArgument(p,1); + } else{ + // inject an empty partition + clrFunction(q); + q = pushArgument(mb,q,newTmpVariable(mb,getArgType(mb,q,0))); + } + } + packpc = 0; + newpack = 0; } - packpc = i-1; - newpack = p; - old[i-1]= 0; m->comment = GDKstrdup("mutationPack"); - } else - // rollback all but one partitioned instruction - if (svar >= 0 && getArgPos(p,mvar) >= 0){ - if (dvar == -1){ - getArg(p, getArgPos(p,svar)) = mvar; - dvar = getArg(p,0); - } } } - DEBUG_MULTICORE - mnstr_printf(cntxt->fdout,"#mutationPack mvar %d svar %d dvar %d leftover %d\n", mvar,svar,dvar,limit); + DEBUG_MULTICORE mnstr_printf(cntxt->fdout,"#mutationPack mvar %d packpc %d\n", mvar,packpc); // second phase, replace matpack with its successor for (i = 1; i < limit; i++) if ( (p= old[i])){ profiler = mb->profiler[i].trace; - if ( packpc == i && getArgPos(old[i+1],mvar) < 0){ + if ( packpc == i && getArgPos(p,mvar) < 0){ + pushInstruction(mb,newpack); pushInstruction(mb,p); continue; } @@ -156,10 +178,10 @@ mutationPack(Client cntxt, Mutant m){ } else // handle non-partitioned operators pushInstruction(mb,p); - } - DEBUG_MULTICORE { - mnstr_printf(cntxt->fdout,"#mutationPack mvar %d svar %d dvar %d leftover %d\n", mvar,svar,dvar,limit); - //printFunction(cntxt->fdout, mb, 0, LIST_MAL_ALL); - } + } else + if ( packpc == i ) + pushInstruction(mb,newpack); + DEBUG_MULTICORE + printFunction(cntxt->fdout, mb, 0, LIST_MAL_ALL); GDKfree(old); } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list