Changeset: a5b2bdeda546 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a5b2bdeda546 Modified Files: clients/Tests/exports.stable.out monetdb5/mal/mal_builder.c monetdb5/mal/mal_builder.h monetdb5/mal/mal_function.c monetdb5/mal/mal_function.h monetdb5/mal/mal_instruction.c monetdb5/mal/mal_instruction.h monetdb5/mal/mal_prelude.c monetdb5/optimizer/opt_mergetable.c monetdb5/optimizer/opt_mitosis.c monetdb5/optimizer/opt_multiplex.c monetdb5/optimizer/opt_projectionpath.c monetdb5/optimizer/opt_querylog.c monetdb5/optimizer/opt_remap.c sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_statement.c tools/monetdbe/monetdbe.c Branch: default Log Message:
Reduce number of reallocs during MAL plan generation. Currently there are *no* reallocations of MAL instructions (due to more than 8 arguments + return values) in the complete testweb, except for instructions created by the MAL parser and for some of the remote tests. diffs (truncated from 1389 to 300 lines): diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out --- a/clients/Tests/exports.stable.out +++ b/clients/Tests/exports.stable.out @@ -1166,6 +1166,7 @@ str connectRef; str contextRef; str convertConstant(malType type, ValPtr vr); InstrPtr copyInstruction(InstrPtr p); +InstrPtr copyInstructionArgs(InstrPtr p, int args); MalBlkPtr copyMalBlk(MalBlkPtr mb); str copyRef; str copy_fromRef; @@ -1467,11 +1468,14 @@ str multicolumnRef; str multiplexRef; str mvcRef; InstrPtr newAssignment(MalBlkPtr mb); +InstrPtr newAssignmentArgs(MalBlkPtr mb, int args); InstrPtr newCatchStmt(MalBlkPtr mb, str nme); InstrPtr newComment(MalBlkPtr mb, const char *val); InstrPtr newExitStmt(MalBlkPtr mb, str nme); InstrPtr newFcnCall(MalBlkPtr mb, char *mod, char *fcn); +InstrPtr newFcnCallArgs(MalBlkPtr mb, char *mod, char *fcn, int args); Symbol newFunction(str mod, str nme, int kind); +Symbol newFunctionArgs(str mod, str nme, int kind, int args); MalStkPtr newGlobalStack(int size); InstrPtr newInstruction(MalBlkPtr mb, str modnme, str fcnnme); InstrPtr newInstructionArgs(MalBlkPtr mb, str modnme, str fcnnme, int args); @@ -1495,7 +1499,6 @@ str not_uniqueRef; str nth_valueRef; str ntileRef; str oidRef; -void oldmoveInstruction(InstrPtr dst, InstrPtr src); str oltpRef; str openProfilerStream(Client cntxt); str openRef; diff --git a/monetdb5/mal/mal_builder.c b/monetdb5/mal/mal_builder.c --- a/monetdb5/mal/mal_builder.c +++ b/monetdb5/mal/mal_builder.c @@ -21,9 +21,9 @@ #include "mal_namespace.h" InstrPtr -newAssignment(MalBlkPtr mb) +newAssignmentArgs(MalBlkPtr mb, int args) { - InstrPtr q = newInstruction(mb,NULL,NULL); + InstrPtr q = newInstructionArgs(mb, NULL, NULL, args); int k; if (q == NULL) @@ -41,22 +41,15 @@ newAssignment(MalBlkPtr mb) } InstrPtr +newAssignment(MalBlkPtr mb) +{ + return newAssignmentArgs(mb, MAXARG); +} + +InstrPtr newStmt(MalBlkPtr mb, const char *module, const char *name) { - InstrPtr q; - str mName = putName(module), nName = putName(name); - - q = newInstruction(mb, mName, nName); - if (q == NULL) - return NULL; - setDestVar(q, newTmpVariable(mb, TYPE_any)); - if (getDestVar(q) < 0 ){ - str msg = createException(MAL, "newStmt", "Can not allocate variable"); - addMalException(mb, msg); - freeException(msg); - } - pushInstruction(mb, q); - return q; + return newStmtArgs(mb, module, name, MAXARG); } InstrPtr @@ -100,9 +93,9 @@ newReturnStmt(MalBlkPtr mb) } InstrPtr -newFcnCall(MalBlkPtr mb, char *mod, char *fcn) +newFcnCallArgs(MalBlkPtr mb, char *mod, char *fcn, int args) { - InstrPtr q = newAssignment(mb); + InstrPtr q = newAssignmentArgs(mb, args); str fcnName, modName; modName = putName(mod); @@ -113,6 +106,12 @@ newFcnCall(MalBlkPtr mb, char *mod, char } InstrPtr +newFcnCall(MalBlkPtr mb, char *mod, char *fcn) +{ + return newFcnCallArgs(mb, mod, fcn, MAXARG); +} + +InstrPtr newComment(MalBlkPtr mb, const char *val) { InstrPtr q = newInstruction(mb, NULL, NULL); diff --git a/monetdb5/mal/mal_builder.h b/monetdb5/mal/mal_builder.h --- a/monetdb5/mal/mal_builder.h +++ b/monetdb5/mal/mal_builder.h @@ -15,12 +15,14 @@ mal_export InstrPtr newStmt(MalBlkPtr mb, const char *module, const char *name); mal_export InstrPtr newStmtArgs(MalBlkPtr mb, const char *module, const char *name, int args); mal_export InstrPtr newAssignment(MalBlkPtr mb); +mal_export InstrPtr newAssignmentArgs(MalBlkPtr mb, int args); mal_export InstrPtr newComment(MalBlkPtr mb, const char *val); mal_export InstrPtr newCatchStmt(MalBlkPtr mb, str nme); mal_export InstrPtr newRaiseStmt(MalBlkPtr mb, str nme); mal_export InstrPtr newExitStmt(MalBlkPtr mb, str nme); mal_export InstrPtr newReturnStmt(MalBlkPtr mb); mal_export InstrPtr newFcnCall(MalBlkPtr mb, char *mod, char *fcn); +mal_export InstrPtr newFcnCallArgs(MalBlkPtr mb, char *mod, char *fcn, int args); mal_export InstrPtr pushSht(MalBlkPtr mb, InstrPtr q, sht val); mal_export InstrPtr pushEndInstruction(MalBlkPtr mb); mal_export InstrPtr pushInt(MalBlkPtr mb, InstrPtr q, int val); @@ -55,4 +57,3 @@ mal_export int getBitConstant(MalBlkPtr mal_export int getHgeConstant(MalBlkPtr mb, hge val); #endif #endif /* _MAL_BUILDER_ */ - diff --git a/monetdb5/mal/mal_function.c b/monetdb5/mal/mal_function.c --- a/monetdb5/mal/mal_function.c +++ b/monetdb5/mal/mal_function.c @@ -18,7 +18,8 @@ #include "mal_namespace.h" #include "mal_private.h" -Symbol newFunction(str mod, str nme,int kind){ +Symbol newFunctionArgs(str mod, str nme, int kind, int args) +{ Symbol s; InstrPtr p; int varid; @@ -36,7 +37,7 @@ Symbol newFunction(str mod, str nme,int return NULL; } - p = newInstruction(NULL, mod, nme); + p = newInstructionArgs(NULL, mod, nme, args); if (p == NULL) { freeSymbol(s); return NULL; @@ -47,6 +48,12 @@ Symbol newFunction(str mod, str nme,int pushInstruction(s->def,p); return s; } + +Symbol newFunction(str mod, str nme, int kind) +{ + return newFunctionArgs(mod, nme, kind, MAXARG); +} + /* * Optimizers may be interested in the function definition * for obtaining properties. Rather than polution of the diff --git a/monetdb5/mal/mal_function.h b/monetdb5/mal/mal_function.h --- a/monetdb5/mal/mal_function.h +++ b/monetdb5/mal/mal_function.h @@ -18,6 +18,7 @@ #define getBeginScope(L,I) ((L)->var[I].declared) mal_export Symbol newFunction(str mod, str nme,int kind); +mal_export Symbol newFunctionArgs(str mod, str nme, int kind, int args); mal_export int getPC(MalBlkPtr mb, InstrPtr p); mal_export Symbol getFunctionSymbol(Module scope, InstrPtr p); diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c --- a/monetdb5/mal/mal_instruction.c +++ b/monetdb5/mal/mal_instruction.c @@ -471,15 +471,40 @@ newInstruction(MalBlkPtr mb, str modnme, return newInstructionArgs(mb, modnme, fcnnme, MAXARG); } +/* Moving instructions around calls for care, because all dependent + * information should also be updated. */ +static void +oldmoveInstruction(InstrPtr new, InstrPtr p) +{ + int space; + + space = offsetof(InstrRecord, argv) + p->maxarg * sizeof(p->argv[0]); + memcpy((char *) new, (char *) p, space); + setFunctionId(new, getFunctionId(p)); + setModuleId(new, getModuleId(p)); + new->typechk = TYPE_UNKNOWN; +} + /* Copying an instruction is space conservative. */ InstrPtr +copyInstructionArgs(InstrPtr p, int args) +{ + if (p->maxarg > args) + args = p->maxarg; + InstrPtr new = (InstrPtr) GDKmalloc(offsetof(InstrRecord, argv) + args * sizeof(p->argv[0])); + if(new == NULL) + return new; + oldmoveInstruction(new, p); + new->maxarg = args; + if (args > p->maxarg) + memset(new->argv + p->maxarg, 0, (args - p->maxarg) * sizeof(new->argv[0])); + return new; +} + +InstrPtr copyInstruction(InstrPtr p) { - InstrPtr new = (InstrPtr) GDKmalloc(offsetof(InstrRecord, argv) + p->maxarg * sizeof(p->argv[0])); - if(new == NULL) - return new; - oldmoveInstruction(new, p); - return new; + return copyInstructionArgs(p, p->maxarg); } void @@ -506,20 +531,6 @@ freeInstruction(InstrPtr p) GDKfree(p); } -/* Moving instructions around calls for care, because all dependent - * information should also be updated. */ -void -oldmoveInstruction(InstrPtr new, InstrPtr p) -{ - int space; - - space = offsetof(InstrRecord, argv) + p->maxarg * sizeof(p->argv[0]); - memcpy((char *) new, (char *) p, space); - setFunctionId(new, getFunctionId(p)); - setModuleId(new, getModuleId(p)); - new->typechk = TYPE_UNKNOWN; -} - /* Query optimizers walk their way through a MAL program block. They * require some primitives to move instructions around and to remove * superflous instructions. The removal is based on the assumption diff --git a/monetdb5/mal/mal_instruction.h b/monetdb5/mal/mal_instruction.h --- a/monetdb5/mal/mal_instruction.h +++ b/monetdb5/mal/mal_instruction.h @@ -128,7 +128,7 @@ mal_export void mal_instruction_reset(vo mal_export InstrPtr newInstruction(MalBlkPtr mb, str modnme, str fcnnme); mal_export InstrPtr newInstructionArgs(MalBlkPtr mb, str modnme, str fcnnme, int args); mal_export InstrPtr copyInstruction(InstrPtr p); -mal_export void oldmoveInstruction(InstrPtr dst, InstrPtr src); +mal_export InstrPtr copyInstructionArgs(InstrPtr p, int args); mal_export void clrInstruction(InstrPtr p); mal_export void freeInstruction(InstrPtr p); mal_export void clrFunction(InstrPtr p); diff --git a/monetdb5/mal/mal_prelude.c b/monetdb5/mal/mal_prelude.c --- a/monetdb5/mal/mal_prelude.c +++ b/monetdb5/mal/mal_prelude.c @@ -226,7 +226,7 @@ addFunctions(mel_func *fcn){ throw(LOADER, "addFunctions", "Can not create program block for %s.%s missing", fcn->mod, fcn->fcn); if (fcn->cname && fcn->cname[0]) strcpy(mb->binding, fcn->cname); - sig= newInstruction(mb, fcn->mod, fcn->fcn); + sig= newInstructionArgs(mb, fcn->mod, fcn->fcn, fcn->argc + (fcn->retc == 0)); sig->retc = 0; sig->argc = 0; sig->token = fcn->command?COMMANDsymbol:PATTERNsymbol; @@ -338,7 +338,7 @@ melFunction(bool command, char *mod, cha freeSymbol(s); return MEL_ERR; } - sig = newInstruction(mb, mod, fcn); + sig = newInstructionArgs(mb, mod, fcn, argc + (retc == 0)); sig->retc = 0; sig->argc = 0; sig->token = command ? COMMANDsymbol:PATTERNsymbol; diff --git a/monetdb5/optimizer/opt_mergetable.c b/monetdb5/optimizer/opt_mergetable.c --- a/monetdb5/optimizer/opt_mergetable.c +++ b/monetdb5/optimizer/opt_mergetable.c @@ -164,7 +164,7 @@ mat_pack(MalBlkPtr mb, matlist_t *ml, in } else { int l; - r = newInstruction(mb, matRef, packRef); + r = newInstructionArgs(mb, matRef, packRef, ml->v[m].mi->argc); getArg(r,0) = getArg(ml->v[m].mi, 0); for(l=ml->v[m].mi->retc; l< ml->v[m].mi->argc; l++) r= addArgument(mb,r, getArg(ml->v[m].mi,l)); @@ -297,7 +297,7 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I //printf("# %s.%s(%d,%d,%d,%d)", getModuleId(p), getFunctionId(p), m, n, o, e); - if((r = newInstruction(mb, matRef,packRef)) == NULL) + if((r = newInstructionArgs(mb, matRef, packRef, mat[m].mi->argc)) == NULL) return NULL; getArg(r, 0) = getArg(p,0); tpe = getArgType(mb,p,0); @@ -414,7 +414,7 @@ mat_apply1(MalBlkPtr mb, InstrPtr p, mat is_assign = (n >= 0); } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list