📄 opt_pushranges.c
字号:
#line 85 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"#include "mal_config.h"#include "opt_pushranges.h"#include "mal_interpreter.h" /* for showErrors() */typedef struct RANGE{ int used; /* how often it has been used */ int lcst, hcst; /* constant variables holding the range bounds */ int srcvar; /* BAT variable on which the range depends */ int lastupdate, lastrange;}RangeRec, *Range;#ifdef DEBUG_OPT_RANGEPUSHstatic void printRange(MalBlkPtr mb, Range rng, int idx){ (void) rng; stream_printf(GDKout,"[%3d] %5s used=%d\tlcst=%s\t ", idx, getVarName(mb,idx), rng[idx].used, (rng[idx].lcst? getVarName(mb,rng[idx].lcst):"")); stream_printf(GDKout,"hcst=%s\tsource %s ", (rng[idx].hcst? getVarName(mb,rng[idx].hcst):""), (rng[idx].srcvar?getVarName(mb,rng[idx].srcvar):"")); stream_printf(GDKout,"\tlu=%d\tr=%d", rng[idx].lastupdate, rng[idx].lastrange); stream_printf(GDKout,"\n");}#endifstatic intOPTpushrangesImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){ int i,j, limit,actions=0; InstrPtr p, *old; int x,y,z,typ; Range range= (Range) alloca(mb->vtop * sizeof(RangeRec)); memset((char*) range, 0, mb->vtop * sizeof(RangeRec)); if( mb->errors) return 0;#ifdef DEBUG_OPT_RANGEPUSH printf("Range select optimizer started\n");#endif (void) stk; (void) pci; limit = mb->stop; old = mb->stmt;#line 134 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx" for (i = 0; i < limit; i++) { p = old[i]; if( p->barrier) break; /* end of optimizer */ for(j=p->retc; j< p->argc; j++) range[getArg(p,j)].used++; for(j=0; j<p->retc; j++){ range[getArg(p,j)].lastupdate= i; if( range[getArg(p,j)].lastrange == 0) range[getArg(p,j)].lastrange= i; } if( getModuleId(p)== algebraRef && ( getFunctionId(p)== selectRef || getFunctionId(p)== uselectRef) ){#line 155 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx" x= getArg(p,1); y= getArg(p,2); if( range[x].lcst && isConstant(mb,y) ){ /* merge lowerbound */ if( ATOMcmp( getVarType(mb,y), VALptr( &getVarConstant(mb,range[x].lcst)), VALptr( &getVarConstant(mb,y)) ) > 0){ getArg(p,2)= range[x].lcst; z= range[x].srcvar; if( getArg(p,1) == x && range[z].lastupdate == range[z].lastrange){ getArg(p,1) = z; actions++; } } y= getArg(p,3); /* merge higherbound */ if( ATOMcmp( getVarType(mb,y), VALptr( &getVarConstant(mb,range[x].hcst)), VALptr( &getVarConstant(mb,y)) ) < 0 || ATOMcmp( getVarType(mb,y), VALptr( &getVarConstant(mb,y)), ATOMnilptr(getVarType(mb,y)) ) == 0){ getArg(p,3)= range[x].hcst; z= range[x].srcvar; if( getArg(p,1) == x && range[z].lastupdate == range[z].lastrange){ getArg(p,1) = z; actions++; } } }#line 190 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx" x= getArg(p,0); if( isConstant(mb, getArg(p,2)) ){ range[x].lcst = getArg(p,2); range[x].srcvar= getArg(p,1); range[x].lastupdate= range[x].lastrange = i; } if( isConstant(mb, getArg(p,3)) ){ range[x].hcst = getArg(p,3); range[x].srcvar= getArg(p,1); range[x].lastupdate= range[x].lastrange = i; }#line 205 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx" x= getArg(p,2); y= getArg(p,3); if( isConstant(mb, x) && isConstant(mb, y) ){ z =ATOMcmp( getVarType(mb,y), VALptr( &getVarConstant(mb,x)), VALptr( &getVarConstant(mb,y))); x= p->argc > 4; x= x && isConstant(mb,getArg(p,4)); x= x && isConstant(mb,getArg(p,5)); x= x && getVarConstant(mb,getArg(p,4)).val.cval[0]; x= x && getVarConstant(mb,getArg(p,5)).val.cval[0]; if( z > 0 || (z==0 && p->argc>4 && !x)) { int zero= 0; if( mb->var[getArg(p,0)]->props== NULL) mb->var[getArg(p,0)]->props= newPropertySet(); setProperty(mb->var[getArg(p,0)]->props, "rows","=",TYPE_int,&zero); /* create an empty replacement */ x= getArgType(mb, p, 1); p->argc=1; getModuleId(p)= batRef; getFunctionId(p)= newRef; pushArgument(mb,p, typ=newTypeVariable(mb, getHeadType(x))); isConstant(mb,typ)= TRUE; pushArgument(mb,p, typ=newTypeVariable(mb, getTailType(x))); isConstant(mb,typ)= TRUE; actions++; } } } }#ifdef DEBUG_OPT_RANGEPUSH for(j=0; j< mb->vtop; j++) if( range[j].used ) printRange(mb,range,j);#endif#line 247 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx" return actions;}#line 253 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"#line 251 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"/* #define _DEBUG_OPTIMIZER_*/str OPTpushranges(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 pushranges\n"); printFunction(GDKout,mb,LIST_MAL_ALL);#endif if( p && p->argc > 1 && getFunctionId(p) != multiplexRef){#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"locate function pushranges\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.pushranges",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.pushranges",buf); }#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"pushranges %s %d\n",modnme,fcnnme);#endif mb = s->def; stk= 0; } if( mb->errors ) return MAL_SUCCEED; addtoMalBlkHistory(mb); actions= OPTpushrangesImplementation(mb,stk,p);#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"finished pushranges %d\n",actions); printFunction(GDKout,mb,LIST_MAL_ALL);#endif optimizerCheck(mb, "optimizer.pushranges", actions, GDKusec() - clk,OPT_CHECK_ALL); return MAL_SUCCEED;}#line 253 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"#line 255 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_pushranges.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -