📄 opt_support.c
字号:
#line 546 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"#include "mal_config.h"#include "opt_prelude.h"#include "opt_support.h"#include "mal_interpreter.h"#include "mal_debugger.h"#line 565 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"intoptimizerCheck(MalBlkPtr mb, str name, int actions, lng usec, int flag){ Client cntxt = MCgetClient(); if( actions > 0){ if( flag & OPT_CHECK_TYPES) chkTypes(cntxt->nspace, mb); if( flag & OPT_CHECK_FLOW) chkFlow(mb); if( flag & OPT_CHECK_DECL) chkDeclarations(mb, TRUE); if( flag & OPT_CHECK_SPAN) setLifespan(mb); } if( cntxt->debugOptimizer){ /* keep the actions take as post block comments */ char buf[BUFSIZ]; InstrPtr p= getInstrPtr(mb,mb->stop-1); sprintf(buf,"actions=%d time=" LLFMT " usec %s",actions,usec,name); if( p->token == REMsymbol) removeInstruction(mb,p); newComment(mb,buf); if (mb->errors) { showErrors(); stream_printf(GDKout, "Optimizer %s failed\n", name); printFunction(GDKout, mb, LIST_MAL_ALL); } } return mb->errors;}#line 594 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"stroptimizeMALBlock(MalBlkPtr mb){ InstrPtr p; int pc, qot = 0; str msg = MAL_SUCCEED; int cnt = 0; InstrPtr *optimizers= alloca(sizeof(InstrPtr)*256);#ifdef DEBUG_OPT_OPTIMIZER int oldstop = mb->stop;#endif optimizerInit(); /* assume the type and flow have been checked already */ do { qot = 0; for (pc = 0; pc < mb->stop && qot<256; pc++) { p = getInstrPtr(mb, pc); if (getModuleId(p) == optimizerRef && p->fcn) optimizers[qot++]= p; } /* we collected all optimizers known so far */ for( pc=0; pc<qot; pc++) if (optimizers[pc]->fcn) /* all optimizers should behave like patterns */ /* However, we don;t have a stack now */ msg = (str) (*optimizers[pc]->fcn) (mb, 0, optimizers[pc]); else { msg = createException(MAL, "optimizer", "Implementation missing"); printInstruction(GDKout,mb,optimizers[pc],LIST_MAL_ALL); } if (msg) { str place = getExceptionPlace(msg); showException(getExceptionType(msg), place, getExceptionMessage(msg)); GDKfree(place); showErrors(); return msg; } } while (qot && cnt++ < 64);#ifdef DEBUG_OPT_OPTIMIZER stream_printf(GDKout, "Optimizer effect %d -> %d instructions\n", oldstop, mb->stop);#endif if (cnt >= 64) throw(MAL, "optimizer.MALoptimizer", "too many optimization cycles\n"); return 0;}strMALoptimizer(Client c){ return optimizeMALBlock(c->curprg->def);}int hasSameSignature(InstrPtr p, InstrPtr q){ if( q->retc != p->retc || q->argc != p->argc) return FALSE; if( getFunctionId(q)==0 && getFunctionId(p)!=0 ) return FALSE; if( getFunctionId(q)!=0 && getFunctionId(p)==0 ) return FALSE; if( getFunctionId(q) && getFunctionId(p) && idcmp(getFunctionId(q),getFunctionId(p)) ) return FALSE; if( getModuleId(q)==0 && getModuleId(p)!=0 ) return FALSE; if( getModuleId(q)!=0 && getModuleId(p)==0 ) return FALSE; if( getModuleId(q) && getModuleId(p) && idcmp(getModuleId(q),getModuleId(p))) return FALSE; /* actually also check their types */ return TRUE;}int hasSameArguments(MalBlkPtr mb, InstrPtr p, InstrPtr q){ int k; (void) mb; if( p== NULL || q== NULL || p->retc != q->retc || p->argc != q->argc) return FALSE; for(k=p->retc; k<p->argc;k++) if( q->argv[k]!= p->argv[k]){ if( isConstant(mb,getArg(p,k)) && isConstant(mb,getArg(q,k)) ) { ValPtr w,u; w= &getVarConstant(mb,getArg(p,k)); u= &getVarConstant(mb,getArg(q,k)); if( ATOMcmp(w->vtype, VALptr(w), VALptr(u)) == 0) continue; } return FALSE; } return TRUE;}#line 687 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"inthasCommonResults(InstrPtr p, InstrPtr q){ int k, l; for (k = 0; k < p->retc; k++) for (l = 0; l < q->retc; l++) if (p->argv[k] == q->argv[l]) return TRUE; return FALSE;}#line 702 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"intisDependent(InstrPtr p, InstrPtr q){ int i,j; for(i= 0; i<q->retc; i++) for(j= p->retc; j<p->argc; j++) if( getArg(q,i)== getArg(p,j)) return TRUE; return FALSE;}#line 718 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"intcountBlocks(MalBlkPtr mb, int start, int stop){ int i,cnt =0; InstrPtr p; for(i= start; i< stop; i++){ p= getInstrPtr(mb,i); if ( p->barrier == BARRIERsymbol || p->token== CATCHsymbol) cnt++; if ( p->barrier == EXITsymbol ) cnt--; } return cnt;}intallArgumentsVisible(MalBlkPtr mb, int pc,int qc){ int i; InstrPtr p; if( countBlocks(mb,pc,qc) ) return FALSE; p= getInstrPtr(mb,pc); for(i=p->retc; i< p->argc; i++){ VarPtr v = getVar(mb, getArg(p,i)); if( v->lastUpdate > v->beginLifespan && qc > v->lastUpdate) return FALSE; } return TRUE;}intallTargetsVisible(MalBlkPtr mb, int pc,int qc){ int i; InstrPtr p; if( countBlocks(mb,pc,qc) ) return FALSE; p= getInstrPtr(mb,pc); for(i=0; i < p->retc; i++){ VarPtr v = getVar(mb, getArg(p,i)); if( v->lastUpdate > v->beginLifespan && qc > v->lastUpdate) return FALSE; } return TRUE;}#line 762 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"#line 768 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"intisUnsafeFunction(InstrPtr q){ InstrPtr p; if (q->fcn == 0 || getFunctionId(q) == 0 || q->blk == NULL) return FALSE; p= getInstrPtr(q->blk,0); if( p->retc== 0) return TRUE; return isPropertyDefined( getVar(q->blk,getArg(p,0))->props, unsafeRef); /* check also arguments for 'unsafe' property */}#line 787 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"intisUnsafeInstruction(InstrPtr q){ int j, k; for (j = 0; j < q->retc; j++) for (k = q->retc; k < q->argc; k++) if (q->argv[k] == q->argv[j]) return TRUE; return FALSE;}#line 803 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"intisInvariant(MalBlkPtr mb, int pcf, int pcl, int varid){ (void) mb; (void) pcf; (void) pcl; (void) varid; /*fool compiler */ return TRUE;}#line 814 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"#line 837 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"intsafetyBarrier(InstrPtr p, InstrPtr q){ int i,j; if( isDependent(q,p)) return TRUE; if (isUnsafeFunction(q)) { for (i = p->retc; i < p->argc; i++) for (j = q->retc; j < q->argc; j++) if (p->argv[i] == q->argv[j]) {#ifdef DEBUG_OPT_OPTIMIZER stream_printf(GDKout, "Found overlapping assignment barrier for \n"); printInstruction(GDKout, mb, q, LIST_MAL_ALL);#endif /* TODO check safety property of the argument */ return TRUE; } } return FALSE;}#line 862 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"intisUpdated(MalBlkPtr mb, int pc){ InstrPtr p, q; int j, k; p = getInstrPtr(mb, pc); for (pc++; pc < mb->stop; pc++) { q = getInstrPtr(mb, pc); /* target is later assigned a new value */ for (j = 0; j < p->retc; j++) for (k = 0; k < q->retc; k++) if (p->argv[j] == q->argv[k]) { int c = 0; if (p->argc != q->argc) return TRUE; /* instruction q may not be a common expression */ /* TO WEAK, test stability of its arguments */ for (j = 0; j < p->argc; j++) if (p->argv[j] == q->argv[k] && isInvariant(mb, 0, pc, q->argv[k])) c++; return c != p->argc; } /* result is used in an unsafe function */ for (j = 0; j < p->retc; j++) for (k = q->retc; k < q->argc; k++) if (p->argv[j] == q->argv[k] ){#line 895 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx" if (getFunctionId(q) == insertRef || getFunctionId(q) == appendRef || getFunctionId(q) == deleteRef) return TRUE; if (getFunctionId(q) && idcmp("destroy", getFunctionId(q)) == 0) return TRUE; } } return FALSE;}#line 911 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"intisTouched(MalBlkPtr mb, int varid, int p1, int p2){ int i, k; for (i = p1; i < p2; i++) { InstrPtr p = getInstrPtr(mb, i); for (k = 0; k < p->argc; k++) if (p->argv[k] == varid) return TRUE; } return FALSE;}#line 927 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"#line 1013 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"inthasSideEffects(InstrPtr p, int strict){ if (blockStart(p) || blockExit(p) || blockCntrl(p)) return TRUE; if( getFunctionId(p) == NULL) return FALSE; if (getFunctionId(p) == depositRef || getFunctionId(p) == insertRef || getFunctionId(p) == inplaceRef || getFunctionId(p) == appendRef || getFunctionId(p) == replaceRef || getFunctionId(p) == deleteRef) return TRUE; if( getModuleId(p) == ioRef || getModuleId(p) == bstreamsRef || getModuleId(p) == bstreamsRef || getModuleId(p) == mdbRef || getModuleId(p) == optimizerRef || getModuleId(p) == lockRef || getModuleId(p) == semaRef || getModuleId(p) == alarmRef) return TRUE; if( getModuleId(p) == sqlRef){ if( getFunctionId(p) == bindRef) return FALSE; if( getFunctionId(p) == bindidxRef) return FALSE; if( getFunctionId(p) == binddbatRef) return FALSE; if( getFunctionId(p) == resultSetRef) return FALSE; return TRUE; } if( getModuleId(p) == languageRef){ if( getFunctionId(p) == assertRef) return TRUE; return FALSE; } if (getModuleId(p) == constraintsRef) return TRUE; if( getModuleId(p) == mserverRef){ if( getFunctionId(p) == rpcRef) return TRUE; if( getFunctionId(p) == reconnectRef) return TRUE; if( getFunctionId(p) == disconnectRef) return TRUE; } if (strict && getFunctionId(p)==newRef) return TRUE; return FALSE;}voidreplaceAlias(MalBlkPtr mb, int pc, int pcl, int src, int alias){ InstrPtr p; VarPtr v; int k; v = getVar(mb, alias); for (; pc < pcl; pc++) { p = getInstrPtr(mb, pc); for (k = p->retc; k < p->argc; k++) if (p->argv[k] == src) { p->argv[k] = alias; if (pc > v->endLifespan) v->endLifespan = pc; } }}#line 1083 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_support.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -