📄 opt_mergetable.c
字号:
#line 127 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"#include "mal_config.h"#include "opt_mergetable.h"static intisMATalias(int idx, int mvar[], int top){ int i; for(i =0; i<top; i++) if( mvar[i]== idx) return i; return -1;}#line 140 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"InstrPtr MATpackAll(MalBlkPtr mb, InstrPtr r, int m, InstrPtr *mat, int *mvar, int mtop){ int l,k; for(l=mat[m]->retc; l< mat[m]->argc; l++){ k= isMATalias( getArg(mat[m],l),mvar,mtop); if( k< 0) r= pushArgument(mb,r, getArg(mat[m],l)); else r= MATpackAll(mb,r, k, mat,mvar,mtop); } return r;}void MATcollect(int m, InstrPtr *mat, int *mvar, int mtop, int *newvar, int *n){ int i,j,k; for(i= mat[m]->retc; i<mat[m]->argc; i++) if( (j= isMATalias( getArg(mat[m],i), mvar, mtop)) >= 0){ for(k=0; k<mtop; k++) if( mvar[k]== j) MATcollect(k,mat,mvar,mtop,newvar,n); } else { newvar[*n]= getArg(mat[m],i); *n = *n+1;}}intOPTmergetableImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ InstrPtr *old=0, q,r, mat[256]; int oldtop,i,j,k,m,mtop=0, mvar[256],tpe; int size,match,actions=0;#ifdef DEBUG_OPT_MERGETABLE stream_printf(GDKout,"Start MAT optimizer\n"); printFunction(GDKout, mb, 0);#endif old = mb->stmt; oldtop= mb->stop; size = (mb->stop *1.2 < mb->ssize)? mb->ssize: mb->stop *1.2; mb->stmt = (InstrPtr *) GDKzalloc(size * sizeof(InstrPtr)); mb->ssize = size ; mb->stop = 0; for( i=0; i<oldtop; i++){ p= old[i]; if( (getModuleId(p)== matRef && getFunctionId(p)==newRef) || (getModuleId(p)== matRef && getFunctionId(p)==packRef) ){ mat[mtop]= p; mvar[mtop] = getArg(p,0); mtop++; pushInstruction(mb,p); continue; }#line 193 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx" if( (getModuleId(p)== matRef && getFunctionId(p)==expandRef) && isConstant(mb,getArg(p,1)) && getVarType(mb,getArg(p,1))== TYPE_str){ openBox("pbm"); k= PBMfindPBAT(getVarConstant(mb,getArg(p,1)).val.sval); if( k< 0){ pushInstruction(mb,p); continue; } pushInstruction(mb,p); p= copyInstruction(p); p->argc--; for(; k>=0; k= partitions[k].next){ r = newInstruction(mb, ASSIGNsymbol); setModuleId(r,bbpRef); setFunctionId(r,bindRef); j= newTmpVariable(mb, partitions[k].type ); getArg(r,0)= j; pushStr(mb,r,BBPname(partitions[k].bid)); pushInstruction(mb,r); pushArgument(mb,p,j); } getFunctionId(p)=newRef; pushInstruction(mb,p); mat[mtop]= p; mvar[mtop] = getArg(p,0); mtop++; actions++; continue; }#line 227 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx" match=0; for(j=p->retc; j<p->argc; j++) if( isMATalias(getArg(p,j),mvar,mtop) >= 0) { m=i; match++; } if( match== 0 ){ pushInstruction(mb,p); continue; }#line 240 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx" if( match>1 ){ for( k= p->retc; k<p->argc && match>1; k++, match--) if( (m=isMATalias(getArg(p,k),mvar,mtop)) >= 0){#ifdef DEBUG_OPT_MERGETABLE stream_printf(GDKout,"Dependency resolution k=%d\n",k); printInstruction(GDKout,mb,p,0);#endif r = newInstruction(mb, ASSIGNsymbol); setModuleId(r,matRef); setFunctionId(r,packRef); getArg(r,0)= getArg(mat[m],0); r= MATpackAll(mb, r, m, mat, mvar, mtop); pushInstruction(mb,r); getArg(p,k)= getArg(r,0); for(j=m; j<mtop-1; j++){ mat[j]= mat[j+1]; mvar[j]= mvar[j+1]; } mtop--; } if( match== 0) pushInstruction(mb,p); }#line 274 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx" if(( (getModuleId(p)== algebraRef && getFunctionId(p)== selectRef) || (getModuleId(p)== algebraRef && getFunctionId(p)==uselectRef) || (getModuleId(p)== algebraRef && getFunctionId(p)==likeselectRef) || (getModuleId(p)== batRef && getFunctionId(p)==reverseRef) || (getModuleId(p)== batRef && getFunctionId(p)==mirrorRef) || (getModuleId(p)== algebraRef && getFunctionId(p)==markTRef) || (getModuleId(p)== algebraRef && getFunctionId(p)==kdifferenceRef) || (getModuleId(p)== algebraRef && getFunctionId(p)== joinRef) || (getModuleId(p)== algebraRef && getFunctionId(p)== semijoinRef) || (getModuleId(p)== batRef && getFunctionId(p)== setAccessRef) || (getModuleId(p)== batRef && getFunctionId(p)== appendRef) || (getModuleId(p)== batRef && getFunctionId(p)== deleteRef) || getModuleId(p)== calcRef ) && (m=isMATalias(getArg(p,1),mvar,mtop)) >= 0){ r = newInstruction(mb, ASSIGNsymbol); setModuleId(r,matRef); setFunctionId(r,newRef); getArg(r,0)= getArg(p,0); tpe= getArgType(mb,p,0); for(k=1; k< mat[m]->argc; k++){ if( k<mat[m]->argc-1 && ( getFunctionId(p)== insertRef || getFunctionId(p)== appendRef )) continue; q= copyInstruction(p); getArg(q,1) = getArg(mat[m],k); getArg(q,0) = newTmpVariable(mb, tpe); pushInstruction(mb,q); r= pushArgument(mb,r,getArg(q,0)); } if( getFunctionId(p)== insertRef || getFunctionId(p)== appendRef || getFunctionId(p)== deleteRef ) match=1; else { match =0; for(j=0;j<mtop; j++) if( mvar[j]== getArg(p,0)) match++; if( match == 0){ mvar[mtop] = getArg(p,0); mat[mtop++]= r; pushInstruction(mb,r); } } if( match) freeInstruction(r); actions++; continue; } #line 328 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx" if(getModuleId(p)== batRef && getFunctionId(p)== insertRef && (m=isMATalias(getArg(p,1),mvar,mtop)) >= 0){ getArg(p,1) = getArg(mat[m],mat[m]->argc-1); pushInstruction(mb,p); continue; } #line 337 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx" if( getModuleId(p)==algebraRef && getFunctionId(p)== joinRef && (m=isMATalias(getArg(p,2),mvar,mtop)) >= 0){ r = newInstruction(mb, ASSIGNsymbol); setModuleId(r,matRef); setFunctionId(r,newRef); getArg(r,0)= getArg(p,0); tpe= getArgType(mb,p,0); for(k=1; k< mat[m]->argc; k++){ q= copyInstruction(p); getArg(q,2) = getArg(mat[m],k); getArg(q,0) = newTmpVariable(mb, tpe); pushInstruction(mb,q); r= pushArgument(mb,r,getArg(q,0)); } match =0; for(j=0;j<mtop; j++) if( mvar[j]== getArg(p,0)) match++; if( match == 0){ mvar[mtop] = getArg(p,0); mat[mtop++]= r; pushInstruction(mb,r); } actions++; continue; } #line 366 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx" if( ((getModuleId(p)==aggrRef && getFunctionId(p)== countRef) || (getModuleId(p)==aggrRef && getFunctionId(p)==sumRef && p->argc==2)) && (m=isMATalias(getArg(p,1),mvar,mtop)) >= 0){ r = newInstruction(mb,ASSIGNsymbol); getArg(r,0)= getArg(p,0); pushInt(mb,r,0); pushInstruction(mb,r); for(k=1; k< mat[m]->argc; k++){ int v= newTmpVariable(mb,TYPE_int); q= newInstruction(mb,ASSIGNsymbol); setModuleId(q,aggrRef); setFunctionId(q,getFunctionId(p)); getArg(q,0)= v; q= pushArgument(mb,q,getArg(mat[m],k)); pushInstruction(mb,q); q= newInstruction(mb,ASSIGNsymbol); setModuleId(q,calcRef); setFunctionId(q,plusRef); getArg(q,0)= getArg(r,0); q= pushArgument(mb,q,getArg(r,0)); q= pushArgument(mb,q,v); pushInstruction(mb,q); } continue; } #line 395 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx" if( ((getModuleId(p)==aggrRef && getFunctionId(p)== maxRef) || (getModuleId(p)==aggrRef && getFunctionId(p)==minRef )) && p->argc==3 && (m=isMATalias(getArg(p,1),mvar,mtop)) >= 0){ r = newInstruction(mb,ASSIGNsymbol); getArg(r,0)= getArg(p,0); pushNil(mb,r,getArgType(mb,p,0)); pushInstruction(mb,r); for(k=1; k< mat[m]->argc; k++){ int v= newTmpVariable(mb,TYPE_int); q= newInstruction(mb,ASSIGNsymbol); setModuleId(q,aggrRef); setFunctionId(q,getFunctionId(p)); getArg(q,0)= v; q= pushArgument(mb,q,getArg(mat[m],k)); pushInstruction(mb,q); q= newInstruction(mb,ASSIGNsymbol); setModuleId(q,calcRef); setFunctionId(q,plusRef); getArg(q,0)= getArg(r,0); q= pushArgument(mb,q,getArg(r,0)); q= pushArgument(mb,q,v); pushInstruction(mb,q); } continue; } #line 427 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx" for( k= p->retc; k<p->argc; k++) if( (m=isMATalias(getArg(p,k),mvar,mtop)) >= 0){#ifdef DEBUG_OPT_MERGETABLE stream_printf(GDKout,"Dependency resolution k=%d\n",k); printInstruction(GDKout,mb,p,0);#endif r = newInstruction(mb, ASSIGNsymbol); setModuleId(r,matRef); setFunctionId(r,packRef); getArg(r,0)= getArg(mat[m],0); r= MATpackAll(mb, r, m, mat, mvar, mtop); if( !( getModuleId(p) == matRef && getFunctionId(p)== newRef) ) pushInstruction(mb,r); else freeInstruction(r); for(j=m; j<mtop-1; j++){ mat[j]= mat[j+1]; mvar[j]= mvar[j+1]; } mtop--; actions++; break; } pushInstruction(mb,p); } GDKfree(old);#line 459 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx" (void) stk; #ifdef DEBUG_OPT_MERGETABLE stream_printf(GDKout,"Result of multi table optimizer\n"); printFunction(GDKout, mb, 0);#endif return actions;}#line 471 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"#line 469 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"/* #define _DEBUG_OPTIMIZER_*/str OPTmergetable(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ str modnme; str fcnnme; Module scope=NULL; Symbol s= NULL; lng clk= GDKusec(); int actions = 0; optimizerInit(); if( p ) removeInstruction(mb, p);#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"apply mergetable\n"); printFunction(GDKout,mb,LIST_MAL_ALL);#endif if( p && p->argc > 1 && getFunctionId(p) != multiplexRef){#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"locate function mergetable\n");#endif if( getArgType(mb,p,1) != TYPE_str || getArgType(mb,p,2) != TYPE_str || !isConstant(mb,getArg(p,1)) || !isConstant(mb,getArg(p,2)) ) { char buf[1024]; snprintf(buf,1024, "Optimizer requires constant string arguments\n"); throw(MAL, "optimizer.mergetable",buf); } if( stk != 0){ modnme= (str)getArgValue(stk,p,1); fcnnme= (str)getArgValue(stk,p,2); } else { modnme= getArgDefault(mb,p,1); fcnnme= getArgDefault(mb,p,2); } scope = findModule(MCgetClient()->nspace,putName(modnme,strlen(modnme)) ); if( scope) s= findSymbolInModule(scope,putName(fcnnme,strlen(fcnnme))); if( s == NULL) { char buf[1024]; snprintf(buf,1024, "Could not find %s.%s\n",modnme,fcnnme); throw(MAL, "optimizer.mergetable",buf); }#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"mergetable %s %d\n",modnme,fcnnme);#endif mb = s->def; stk= 0; } if( mb->errors ) return MAL_SUCCEED; addtoMalBlkHistory(mb); actions= OPTmergetableImplementation(mb,stk,p);#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"finished mergetable %d\n",actions); printFunction(GDKout,mb,LIST_MAL_ALL);#endif optimizerCheck(mb, "optimizer.mergetable", actions, GDKusec() - clk,OPT_CHECK_ALL); return MAL_SUCCEED;}#line 471 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"#line 473 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_mergetable.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -