📄 opt_reduce.c
字号:
#line 57 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_reduce.mx"#include "mal_config.h"#include "opt_reduce.h"#include "mal_interpreter.h"static void MRconstant(MalBlkPtr mb){ int i,j; int *cst,*alias,top=0; InstrPtr p; cst= (int*) alloca(mb->vtop *sizeof(int)); alias= (int*) alloca(mb->vtop *sizeof(int)); for(i = 0; i< mb->vtop; i++) if( isConstant(mb,i) ){ alias[i]= i; for(j=0; j<top; j++) if( getVarType(mb,i) == getVarType(mb,cst[j]) && ATOMcmp(getVarType(mb,i), VALget(&getVar(mb,i)->value), VALget(&getVar(mb,cst[j])->value)) == 0){ alias[i]= cst[j]; break; } cst[top++]= i; } for( i=0; i< mb->stop; i++){ p= getInstrPtr(mb,i); for(j=p->retc; j < p->argc; j++) if( isConstant(mb, getArg(p,j)) ) getArg(p,j) = alias[getArg(p,j)]; }}static intOPTreduceImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ int *vars, *used; int cnt = 0, i, j; InstrPtr q; int actions = 0; (void)stk; (void) p; vars = (int *) alloca(mb->vtop * sizeof(int)); used= (int *) alloca(mb->vtop * sizeof(int)); memset((char*) vars, 0, mb->vtop * sizeof(int)); memset((char*) used, 0, mb->vtop * sizeof(int)); /* reduce constant list */ MRconstant(mb); /* build the use table */ for(i=0; i<mb->stop; i++){ q= getInstrPtr(mb,i); for(j=0; j<q->argc; j++) used[getArg(q,j)]= 1; } /* build the alias table */ for (i = 0; i < mb->vtop; i++) { if ( used[i]==0 ){ clearVariable(mb, i); continue; } if (i>cnt) { /* remap temporary variables */ if (isTmpVar(mb,i)) getVarTmp(mb,i) = cnt; mb->var[cnt] = mb->var[i]; mb->var[i] = NULL; } vars[i] = cnt; cnt++; } actions = mb->vtop - cnt;#ifdef DEBUG_OPT_REDUCE stream_printf(GDKout, "Reduction %d -> %d\n", mb->vtop, cnt);#endif /* remap all variable references to their new position. */ if (actions) { for (i = 1; i < mb->stop; i++) { q = getInstrPtr(mb, i); for (j = 0; j < q->argc; j++) getArg(q, j) = vars[getArg(q, j)]; } } mb->vtop = cnt; return actions;}#line 150 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_reduce.mx"#line 148 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_reduce.mx"/* #define _DEBUG_OPTIMIZER_*/str OPTreduce(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 reduce\n"); printFunction(GDKout,mb,LIST_MAL_ALL);#endif if( p && p->argc > 1 && getFunctionId(p) != multiplexRef){#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"locate function reduce\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.reduce",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.reduce",buf); }#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"reduce %s %d\n",modnme,fcnnme);#endif mb = s->def; stk= 0; } if( mb->errors ) return MAL_SUCCEED; addtoMalBlkHistory(mb); actions= OPTreduceImplementation(mb,stk,p);#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"finished reduce %d\n",actions); printFunction(GDKout,mb,LIST_MAL_ALL);#endif optimizerCheck(mb, "optimizer.reduce", actions, GDKusec() - clk,OPT_CHECK_ALL); return MAL_SUCCEED;}#line 150 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_reduce.mx"#line 152 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_reduce.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -