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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list