📄 opt_qep.c
字号:
#line 107 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_qep.mx"#include "mal_config.h"#include "opt_qep.h"static QEPQEPnew(int p, int c){ QEP qep; qep = (QEP) GDKmalloc( sizeof(struct QEPrecord)); qep->mb= NULL; qep->p = NULL; qep->plimit = p; if( p ) qep->parents = (QEP*) GDKzalloc( sizeof(QEP) * p); qep->climit = c; if( c) qep->children = (QEP *) GDKzalloc( sizeof(QEP) * c); return qep;}static QEPQEPnewNode(MalBlkPtr mb,InstrPtr p){ QEP q; q= QEPnew(p->retc,p->argc-p->retc+1); q->mb= mb; q->p = p; return q;}static QEPQEPexpandChildren(QEP qep, int extra){ int i; /*extend node */ qep->children = (QEP*) GDKrealloc( (char*) qep->children, sizeof(QEP) * (qep->climit + extra)); for(i=qep->climit;i <qep->climit + extra; i++) qep->children[i]=0; qep->climit = qep->climit + extra; return qep;}#if 0static QEPQEPfree(QEP qep){ GDKfree(qep->children); GDKfree(qep->parents); GDKfree(qep); return NULL;}#endif#line 156 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_qep.mx"#if 0static QEPQEPdelete(QEP qep, int pos){ int i; QEP q= NULL; for(i=0; i<qep->climit && qep->children[i]; i++){ if(pos-- == 0) q = qep->children[i]; if( pos <0 ) qep->children[i]= qep->children[i+1]; if( i< qep->climit-1) q->children[i]= NULL; } return q;}#endifQEPQEPappend(QEP qep, QEP child){ int i; for( i=0; i< qep->climit-1; i++) if( qep->children[i] == NULL) break; if(qep->climit== 0 || qep->children[i]!= NULL ) qep= QEPexpandChildren(qep,MAXCHILD); qep->children[i]= child; if( child) child->parents[0]= qep; return qep;}#if 0static QEPQEPinsert(QEP qep, int pos, QEP child){ int i; QEP q= NULL, qn; for( i=0; i< qep->climit; i++){ if( pos-- == 0){ q= qep->children[i]; qep->children[i]= child; child->parents[0] =qep; } if( pos < 0 && i<qep->climit-1){ qn= qep->children[i+1]; qep->children[i+1] = q; q= qn; } } if( q != NULL) qep = QEPappend(qep,q); return qep;}#endif#line 209 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_qep.mx"#define LEAFNODE 2#define TOPNODE 3static QEPQEPbuilt(MalBlkPtr mb){ QEP qroot= NULL, q= NULL, *vq; InstrPtr p; int i, j, k, *status; vq= (QEP*) GDKmalloc( mb->vtop * sizeof(QEP)); status= (int*) GDKmalloc( mb->vtop * sizeof(int)); for(i=0; i<mb->vtop; i++) { status[i]= 0; vq[i] = 0; } for(i=1; i< mb->stop-1; i++){ p= getInstrPtr(mb,i); q= QEPnewNode(mb,p); for( k=p->retc; k<p->argc; k++) if( ! isConstant(mb, getArg(p,k)) ){ status[getArg(p,k)]= LEAFNODE; if( vq[getArg(p,k)] ) QEPappend(q, vq[getArg(p,k)]); } for( k=0; k<p->retc; k++){ if( vq[getArg(p,k)] == 0) vq[getArg(p,k)] = q; status[getArg(p,k)]= TOPNODE; } }#line 244 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_qep.mx" qroot= QEPnew(MAXPARENT,mb->stop); for(i=1; i< mb->stop-1; i++){ p= getInstrPtr(mb,i); k=0; if( p->barrier){ k++; q= QEPnewNode(mb,p); } else for( j=0; j< p->retc; j++) if( status[getArg(p,j)] == TOPNODE){ q= vq[getArg(p,j)]; k++; break; } if(k) QEPappend(qroot,q); } GDKfree(vq); GDKfree(status); return qroot;}#line 270 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_qep.mx"static voidQEPdump(stream *f, QEP qep, int indent){ int i,inc = 0; str s; if( qep->p){ for(i=0;i<indent; i++) stream_printf(f," "); s= instruction2str(qep->mb,qep->p,0); stream_printf(f,"%s\n",s+1); GDKfree(s); inc = 4; } for(i=0; i< qep->climit; i++) if( qep->children[i]) QEPdump(f,qep->children[i], indent+ inc);}static intOPTdumpQEPImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ QEP qep; (void) stk; (void) p; qep= QEPbuilt(mb); QEPdump(GDKout,qep,0); return 1;}#line 299 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_qep.mx"#line 297 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_qep.mx"/* #define _DEBUG_OPTIMIZER_*/str OPTdumpQEP(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 dumpQEP\n"); printFunction(GDKout,mb,LIST_MAL_ALL);#endif if( p && p->argc > 1 && getFunctionId(p) != multiplexRef){#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"locate function dumpQEP\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.dumpQEP",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.dumpQEP",buf); }#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"dumpQEP %s %d\n",modnme,fcnnme);#endif mb = s->def; stk= 0; } if( mb->errors ) return MAL_SUCCEED; addtoMalBlkHistory(mb); actions= OPTdumpQEPImplementation(mb,stk,p);#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"finished dumpQEP %d\n",actions); printFunction(GDKout,mb,LIST_MAL_ALL);#endif optimizerCheck(mb, "optimizer.dumpQEP", actions, GDKusec() - clk,OPT_CHECK_ALL); return MAL_SUCCEED;}#line 299 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_qep.mx"#line 301 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_qep.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -