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

Reply via email to