📄 opt_generators.c
字号:
#line 102 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"#include "mal_config.h"#include "opt_generators.h"static intisPBMalias(int idx, int mvar[], int top){ int i; for(i =0; i<top; i++) if( mvar[i]== idx) return i; return -1;}static void BGcloseLoop(MalBlkPtr mb, int m, InstrPtr *stmt ){ InstrPtr r; r = newInstruction(mb, ASSIGNsymbol); r->barrier= REDOsymbol; setModuleId(r, getModuleId(stmt[m])); setFunctionId(r,putName("getNextElement",14)); getArg(r,0)= getArg(stmt[m],0); pushArgument(mb,r,getArg(stmt[m],1)); pushInstruction(mb,r); r = newInstruction(mb, ASSIGNsymbol); r->barrier= EXITsymbol; getArg(r,0)= getArg(stmt[m],0); pushInstruction(mb,r);}static void BGkeepPartial(MalBlkPtr mb, int i, InstrPtr p){ InstrPtr r; char tmpname[128]; r = newInstruction(mb, ASSIGNsymbol); setModuleId(r, pbmRef); setFunctionId(r,depositRef); getArg(r,0)= newTmpVariable(mb,TYPE_any); snprintf(tmpname,128,"pbat_%s", getVarName(mb,getArg(p,0))); pushStr(mb,r,tmpname); pushArgument(mb,r,getArg(p,0)); insertInstruction(mb,r,i);}#line 146 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"#define GEN_CLOSED 0#define GEN_OPENED 1#define GEN_PARTIAL 2#define GEN_PACKED 4intOPTgeneratorsImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ InstrPtr *old=0, q,r, stmt[256]; int oldtop, keep=0,i,j,k,m=0;#ifndef NDEBUG int oldsize;#endif int iter=0,index[256]; /* active nesting level <=mtop*/ int mtop=0, mvar[256], mstatus[256]; int size,match,actions=0; char tmpname[128];#ifdef DEBUG_OPT_BATLOOPS stream_printf(GDKout,"Start generators optimizer\n"); printFunction(GDKout, mb, 0);#endif setLifespan(mb); /* to detect future variable use */ old = mb->stmt; oldtop= mb->stop;#ifndef NDEBUG oldsize= mb->ssize;#endif 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 = keep; for( i=0; i<oldtop-1; i++){ p= old[i];#line 186 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx" if( getModuleId(p)== pbmRef && getFunctionId(p)== generatorRef) { getFunctionId(p)= putName("newIterator",11); p->barrier = BARRIERsymbol; mvar[mtop] = getArg(p,0); mstatus[mtop] = GEN_CLOSED; /* not yet opened */ stmt[mtop++]= p; continue; }#line 197 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx" if( p->token== NOOPsymbol || p->token== REMsymbol){ pushInstruction(mb,p); continue; }#line 210 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx" if( getFunctionId(p) == setWriteModeRef && getModuleId(p) == batRef){ for(k=0;k<mtop;k++) if( mvar[k]== getArg(p,1)){ r= copyInstruction(stmt[m]); getArg(r,0)= getArg(p,0); getArg(r,1)= getArg(stmt[k],1); getArg(p,1)= getArg(stmt[k],1); getModuleId(p)= pbmRef; mvar[mtop] = getArg(r,0); mstatus[mtop]= GEN_CLOSED; stmt[mtop]= r; index[iter++]= mtop; mtop++; } pushInstruction(mb,p); continue; }#line 232 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.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)== kunionRef) || (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)== batRef && getFunctionId(p)== setWriteModeRef) ){#line 253 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx" match=0; for(k=p->retc; k<p->argc;k++) if( (m=isPBMalias(getArg(p,k),mvar,mtop)) >= 0) { if( mstatus[m]== GEN_CLOSED){ r= copyInstruction(stmt[m]); pushInstruction(mb,r); mstatus[m]= GEN_OPENED; index[iter++]=m; } match++; }#line 268 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx" if( match){ pushInstruction(mb,p); r = newInstruction(mb, ASSIGNsymbol); r->barrier= BARRIERsymbol; setModuleId(r,pbmRef); setFunctionId(r,putName("newIterator",11)); getArg(r,0)= getArg(p,0); snprintf(tmpname,128,"pbat_%s", getVarName(mb,getArg(p,0))); pushStr(mb,r,tmpname); mvar[mtop] = getArg(r,0); mstatus[mtop]= GEN_PARTIAL; stmt[mtop]= r; index[iter++]= mtop; mtop++; actions++; continue; } } #line 292 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx" if( ((getModuleId(p)==aggrRef && getFunctionId(p)== countRef) || (getModuleId(p)==aggrRef && getFunctionId(p)== minRef && p->argc==3) || (getModuleId(p)==aggrRef && getFunctionId(p)== maxRef && p->argc==3) || (getModuleId(p)==aggrRef && getFunctionId(p)==sumRef && p->argc==2)) && (m=isPBMalias(getArg(p,1),mvar,mtop)) >= 0){ r = newInstruction(mb,ASSIGNsymbol); getArg(r,0)= getArg(p,0); pushInt(mb,r,0);#line 309 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx" m= 0; for(k= mb->stop-1; k>0; k--){ q= getInstrPtr(mb,k); if( getModuleId(q)== pbmRef && getFunctionId(q)== putName("newIterator",11)) m=k; } insertInstruction(mb,r,m); q= copyInstruction(p); k= newTmpVariable(mb,TYPE_int); getArg(q,0)= k; pushInstruction(mb,q); q= newInstruction(mb,ASSIGNsymbol); setModuleId(q,calcRef); if( getFunctionId(p)== countRef || getFunctionId(p)== sumRef) setFunctionId(q,plusRef); else setFunctionId(q,getFunctionId(p)); getArg(q,0)= getArg(r,0); q= pushArgument(mb,q,getArg(r,0)); q= pushArgument(mb,q,k); pushInstruction(mb,q); continue; } #line 343 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx" match=0; for(j=p->retc; j<p->argc; j++) if( isPBMalias(getArg(p,j),mvar,mtop) >= GEN_OPENED) { m=i; match++; }#line 356 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx" for(k=iter-1;k>=0; k--) if(mstatus[index[k]]== GEN_OPENED) { BGcloseLoop(mb,index[k],stmt); mstatus[index[k]]= GEN_CLOSED; } else if( mstatus[index[k]]== GEN_PARTIAL){ if( getVar(mb,getArg(stmt[index[k]],0))->endLifespan>= i){ BGkeepPartial(mb,mb->stop,stmt[index[k]]); r= newInstruction(mb,ASSIGNsymbol); getModuleId(r)=pbmRef; getFunctionId(r)=putName("discard",7); getArg(r,0)= newTmpVariable(mb, TYPE_any); snprintf(tmpname,128,"pbat_%s", getVarName(mb,getArg(stmt[index[k]],0))); pushStr(mb,r,tmpname); assert(oldtop<oldsize-1); old[oldtop]= old[oldtop-1]; old[oldtop-1]=r; oldtop++; } mstatus[index[k]]= GEN_CLOSED; } else iter = 0; for( k= p->retc; k<p->argc; k++) if( (m=isPBMalias(getArg(p,k),mvar,mtop)) >= 0){#ifdef DEBUG_OPT_BATLOOPS stream_printf(GDKout,"Dependency resolution k=%d\n",k); printInstruction(GDKout,mb,p,0);#endif r = newInstruction(mb, ASSIGNsymbol); setModuleId(r,pbmRef); setFunctionId(r,packRef); getArg(r,0)= getArg(stmt[m],0); pushInstruction(mb,r); mstatus[m]= GEN_PACKED; actions++; break; } pushInstruction(mb,p); }#line 400 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx" for(i=iter-1; i>=0; i--) if( mstatus[index[i]]== GEN_OPENED){ BGcloseLoop(mb,index[i],stmt); } pushInstruction(mb,old[oldtop-1]); GDKfree(old); (void) stk; #ifdef DEBUG_OPT_BATLOOPS stream_printf(GDKout,"Result of generators optimizer\n"); printFunction(GDKout, mb, 0);#endif return actions;}#line 417 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"#line 415 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"/* #define _DEBUG_OPTIMIZER_*/str OPTgenerators(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 generators\n"); printFunction(GDKout,mb,LIST_MAL_ALL);#endif if( p && p->argc > 1 && getFunctionId(p) != multiplexRef){#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"locate function generators\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.generators",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.generators",buf); }#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"generators %s %d\n",modnme,fcnnme);#endif mb = s->def; stk= 0; } if( mb->errors ) return MAL_SUCCEED; addtoMalBlkHistory(mb); actions= OPTgeneratorsImplementation(mb,stk,p);#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"finished generators %d\n",actions); printFunction(GDKout,mb,LIST_MAL_ALL);#endif optimizerCheck(mb, "optimizer.generators", actions, GDKusec() - clk,OPT_CHECK_ALL); return MAL_SUCCEED;}#line 417 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"#line 419 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -