📄 opt_commonterms.c
字号:
#line 36 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_commonTerms.mx"#include "mal_config.h"#include "opt_commonTerms.h"#include "mal_interpreter.h" /* for showErrors() */#include "opt_aliases.h"#line 41 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_commonTerms.mx"#line 95 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_commonTerms.mx"static intOPTcommonTermsImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){ int i, j, k, last, n=1; InstrPtr p, q; int actions = 0; int filter[1024]; int *mask,*alias,limit; InstrPtr *old; lng c; (void) stk; (void) pci; mask= (int *) alloca(mb->stop * sizeof(int)); memset((void*) filter, 0, 1024 * sizeof(int)); alias= (int*) alloca(sizeof(int)* mb->vtop); for(i=0; i<mb->vtop; i++) alias[i]=i; setLifespan(mb); old= mb->stmt; limit= mb->stop; newMalBlkStmt(mb, mb->stop); /* a new statement stack */ for ( n= i = 0; i < limit; i++) { p = old[i]; pushInstruction(mb,p); n++;#line 125 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_commonTerms.mx" if( p->token == ENDsymbol){ for(i++; i<limit; i++) pushInstruction(mb,old[i]); break; } if( p->token == NOOPsymbol) continue; if( p->token == ASSIGNsymbol && p->argc== 2 && p->barrier==0){ if( getLastUpdate(mb,getArg(p,0)) == i && getBeginLifespan(mb,getArg(p,0)) == i && getLastUpdate(mb,getArg(p,1)) < i){ alias[getArg(p,0)]= alias[getArg(p,1)]; freeInstruction(p); mb->stop--; mb->stmt[mb->stop]=0; n--; continue; } } else { for(j=0; j<p->argc; j++) getArg(p,j)= alias[getArg(p,j)]; }#line 149 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_commonTerms.mx" c = p->argc; for(j=p->retc; j<p->argc; j++){ c *= 4; if( !isConstant(mb,getArg(p,j)) ) c += getArg(p,j); } c &= 1023; mask[n-1] = c; if (filter[c] && p->retc != p->argc){#line 165 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_commonTerms.mx" last=1; for( j = p->retc; j<p->argc; j++) if( getBeginLifespan(mb,getArg(p,j)) > last ) last = getBeginLifespan(mb,getArg(p,j)); for (j = (n-1) - 1; j >= last-(i-(n-1)) && j>0; j--) if( mask[j] == c ){ if (safetyBarrier(p, q = getInstrPtr(mb, j))) break;#ifdef DEBUG_OPT_COMMONTERMS printInstruction(GDKout, mb, q, LIST_MAL_ALL); printInstruction(GDKout, mb, p, LIST_MAL_ALL); printf("%d, %d %d %d ", i, j, hasSameSignature(p, q), hasSameArguments(mb, p, q)); printf(" :%d %d %d %d\n", !isUpdated(mb, i), !hasCommonResults(p, q), !hasSideEffects(p, TRUE), !hasSideEffects(q, TRUE));#endif if (hasSameSignature(p, q) && hasSameArguments(mb, p, q) && !isUpdated(mb, i) && !hasCommonResults(p, q) && !hasSideEffects(p, TRUE) && allTargetsVisible(mb,j,n-1) ) {#ifdef DEBUG_OPT_COMMONTERMS stream_printf(GDKout, "Found a common expression " "%d <-> %d\n", j, i);#endif clrFunction(p); p->token = ASSIGNsymbol; p->argc = p->retc + q->retc; for (k = 0; k < q->retc; k++) p->argv[p->retc + k] = q->argv[k];#ifdef DEBUG_OPT_COMMONTERMS stream_printf(GDKout, "common modified expression"); printInstruction(GDKout, mb, p, LIST_MAL_ALL);#endif actions++; if( p->argc== 2 && getLastUpdate(mb,getArg(p,0)) == i && getBeginLifespan(mb,getArg(p,0)) == i && getLastUpdate(mb,getArg(p,1)) < i){ alias[getArg(p,0)]= alias[getArg(p,1)]; freeInstruction(p); mb->stop--; mb->stmt[mb->stop]=0; n--; } j= 0; /* end of search */ } } } filter[c ]= 1; } return actions;}#line 230 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_commonTerms.mx"#line 228 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_commonTerms.mx"/* #define _DEBUG_OPTIMIZER_*/str OPTcommonTerms(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 commonTerms\n"); printFunction(GDKout,mb,LIST_MAL_ALL);#endif if( p && p->argc > 1 && getFunctionId(p) != multiplexRef){#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"locate function commonTerms\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.commonTerms",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.commonTerms",buf); }#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"commonTerms %s %d\n",modnme,fcnnme);#endif mb = s->def; stk= 0; } if( mb->errors ) return MAL_SUCCEED; addtoMalBlkHistory(mb); actions= OPTcommonTermsImplementation(mb,stk,p);#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"finished commonTerms %d\n",actions); printFunction(GDKout,mb,LIST_MAL_ALL);#endif optimizerCheck(mb, "optimizer.commonTerms", actions, GDKusec() - clk,OPT_CHECK_ALL); return MAL_SUCCEED;}#line 230 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_commonTerms.mx"#line 232 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_commonTerms.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -