📄 opt_macro.c
字号:
#line 131 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#include "mal_config.h"#include "opt_prelude.h"#include "opt_macro.h"#include "mal_interpreter.h"#line 140 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"static intmalMatch(InstrPtr p1, InstrPtr p2){ int i, j; if (getFunctionId(p1) == 0 && getFunctionId(p2) != 0) return 0; if (getModuleId(p1) == 0 && getModuleId(p2) != 0) return 0; if (getModuleId(p1) != getModuleId(p2)) return 0; if (getFunctionId(p2) == 0) return 0; if (getFunctionId(p1) != getFunctionId(p2)) return 0; if (p1->retc != p2->retc) return 0; if (p1->argc != p2->argc) return 0; if (p1->barrier != p2->barrier) return 0; for (i = 0; i < p1->argc; i++) for (j = i + 1; j < p1->argc; j++) if ((getArg(p1, i) == getArg(p1, j) && getArg(p2, i) != getArg(p2, j)) || (getArg(p1, i) != getArg(p1, j) && getArg(p2, i) == getArg(p2, j))) return 0; return 1;}#line 178 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"static intmalFcnMatch(MalBlkPtr mc, MalBlkPtr mb, int pc){ int i, j, k, lim; int *cvar, *mvar; int ctop = 0, mtop = 0; InstrPtr p, q; if (mb->stop - pc < mc->stop - 2) return 0; cvar = (int *) alloca(mc->vtop * MAXARG); mvar = (int *) alloca(mb->vtop * MAXARG); /* also trim the return statement */ lim = pc + mc->stop - 3; k = 1; for (i = pc; i < lim; i++, k++) { p = getInstrPtr(mb, i); q = getInstrPtr(mc, k); if (malMatch(p, q) == 0) return 0; for (j = 0; j < p->argc; j++) cvar[ctop++] = getArg(p, j); for (j = 0; j < p->argc; j++) mvar[mtop++] = getArg(q, j); } assert(mtop == ctop); /*shouldn;t happen */#ifdef DEBUG_OPT_MACRO for (i = 0; i < ctop; i++) printf("match %d %d\n", cvar[i], mvar[i]);#endif for (i = 0; i < ctop; i++) for (j = i + 1; j < ctop; j++) if ((cvar[i] == cvar[j] && mvar[i] != mvar[j]) ||(mvar[i] == mvar[j] && cvar[i] != cvar[j])) return 0; return 1;}#line 224 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#define MAXEXPANSION 256intinlineMALblock(MalBlkPtr mb, int pc, MalBlkPtr mc){ int i, k, l, n; InstrPtr *ns, p,q; int *nv;#ifdef DEBUG_OPT_MACRO printf("inlineMALblock\n"); printFunction(GDKout,mb,LIST_MAL_ALL); printFunction(GDKout,mc,LIST_MAL_ALL);#endif ns = GDKmalloc((l = (mb->ssize + mc->ssize - 3)) * sizeof(InstrPtr)); nv = alloca(mc->vtop * sizeof(int)); p = getInstrPtr(mb, pc); q = getInstrPtr(mc, 0); k = 0; /* add variables to target */ for (n = 0; n < mc->vtop; n++) { if (mc->var[n]->isaconstant ){ nv[n] = cpyConstant(mb,getVar(mc,n)); } else nv[n] = newTmpVariable(mb, getVarType(mc, n)); k++; } /* keep track of the actual arguments */ for (n = 0; n < p->argc; n++) nv[getArg(q,n)] = getArg(p, n); k = 0; /* copy the stable part */ for (i = 0; i < pc; i++) ns[k++] = mb->stmt[i]; /* copying stops at the first return statement */ for (i = 1; i < mc->stop - 1; i++) { p = mc->stmt[i]; /* copy the instruction and fix variable references */ ns[k] = copyInstruction(p); for (n = 0; n < p->argc; n++) getArg(ns[k], n) = nv[getArg(p, n)]; if (p->barrier == RETURNsymbol || p->barrier == YIELDsymbol) { ns[k]->barrier = 0; if (p->token == RETURNsymbol || p->token == YIELDsymbol) ns[k]->token = ASSIGNsymbol; /* fix returns that do not evaluate an expression */ if( p->retc == p->argc){ for (n =0; n < p->retc; n++) { pushArgument(mb,ns[k], nv[getArg(p,n)]); getArg(ns[k],n)= getArg(getInstrPtr(mb,pc),n); } } k++; break; } k++; } /* copy the stable part */ for (i = pc + 1; i < mb->stop; i++) ns[k++] = mb->stmt[i]; GDKfree(mb->stmt); mb->stmt = ns; mb->ssize = l; mb->stop = k; return pc;}#line 306 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"static strMACROvalidate(MalBlkPtr mb){ int retseen = 0; int i; InstrPtr p = 0; if (getArgType(mb, getInstrPtr(mb, 0), 0) == TYPE_void) return MAL_SUCCEED; for (i = 1; retseen == 0 && i < mb->stop; i++) { p = getInstrPtr(mb, i); retseen = p->token == RETURNsymbol || p->token == YIELDsymbol || p->barrier == RETURNsymbol || p->barrier == YIELDsymbol; } if (retseen && i != mb->stop - 1) throw(MAL, "optimizer.MACROvalidate", "RETURN statement is not the last one"); return MAL_SUCCEED;}strMACROprocessor(MalBlkPtr mb, Symbol t){ InstrPtr q; int i, cnt = 0, last = -1; str msg = MAL_SUCCEED;#ifdef DEBUG_OPT_MACRO printf("calling the MACRO processor\n");#endif if (t == NULL) return msg; msg = MACROvalidate(t->def); if (msg) return msg; for (i = 0; i < mb->stop; i++) { q = getInstrPtr(mb, i); if (getFunctionId(q) && idcmp(getFunctionId(q), t->name) == 0 && getSignature(t)->token == FUNCTIONsymbol) {#ifdef DEBUG_OPT_MACRO printf("Hit, replace macro call %s\n", t->name);#endif if (i == last) throw(MAL, "optimizer.MACROoptimizer", "duplicate macro expansion"); last = i; i = inlineMALblock(mb, i, t->def); cnt++; if (cnt > MAXEXPANSION) throw(MAL, "optimizer.MACROoptimizer", "too many macro expansions"); } } return msg;}#line 371 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"static intreplaceMALblock(MalBlkPtr mb, int pc, MalBlkPtr mc){ int i, j, k, lim; InstrPtr p, q, rq; int *cvar, *mvar; int ctop = 0, mtop = 0; /* collect variable map */ cvar = (int *) alloca(mc->vtop * MAXARG); mvar = (int *) alloca(mb->vtop * MAXARG); lim = pc + mc->stop - 2; k = 1; for (i = pc; i < lim; i++, k++) { p = getInstrPtr(mb, i); q = getInstrPtr(mc, k); for (j = 0; j < p->argc; j++) cvar[ctop++] = getArg(q, j); for (j = 0; j < p->argc; j++) mvar[mtop++] = getArg(p, j); } assert(mtop == ctop); /*shouldn;t happen */#ifdef DEBUG_OPT_MACRO for (i = 0; i < ctop; i++) printf("match %d %d\n", cvar[i], mvar[i]);#endif p = getInstrPtr(mb, pc); q = copyInstruction(getInstrPtr(mc, 0)); /* the signature */ q->token = ASSIGNsymbol; mb->stmt[pc] = q; for (i = q->retc; i < q->argc; i++) for (j = 0; j < ctop; j++) if (q->argv[i] == cvar[j]) { q->argv[i] = mvar[j]; break; } rq = getInstrPtr(mc, mc->stop - 2); for (i = 0; i < rq->retc; i++) for (j = 0; j < ctop; j++) if (rq->argv[i] == cvar[j]) { q->argv[i] = mvar[j]; break; } freeInstruction(p); /* strip signature, return, and end statements */ k = mc->stop - 3; j = pc + k; for (i = pc + 1; i < pc + k; i++) freeInstruction(mb->stmt[i]); for (i = pc + 1; i < mb->stop - k; i++) mb->stmt[i] = mb->stmt[j++]; k = i; for (; i < mb->stop; i++) mb->stmt[i] = 0; mb->stop = k; return pc;}static strORCAMprocessor(MalBlkPtr mb, Symbol t){ MalBlkPtr mc = t->def; int i; str msg = MAL_SUCCEED; if (t == NULL || mc->stop < 3) return msg;#ifdef DEBUG_OPT_MACRO printf("calling the ORCAM processor for %s\n", t->name);#endif /* strip signature, return, and end statements */ for (i = 1; i < mb->stop - mc->stop + 3; i++) if (malFcnMatch(mc, mb, i)) {#ifdef DEBUG_OPT_MACRO printf("found match for %s at %d \n", t->name, i);#endif msg = MACROvalidate(mc); if (msg == MAL_SUCCEED) replaceMALblock(mb, i, mc); else break; } chkProgram(MCgetClient()->nspace, mb); return msg;}#line 470 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 513 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 471 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"static intOPTmacroImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ MalBlkPtr target= mb; Module s; Symbol t; str mod,fcn; int j; (void) p; (void) stk; if( p->argc == 3){ mod= getArgDefault(mb,p,1); fcn= getArgDefault(mb,p,2); } else { mod= getArgDefault(mb,p,1); fcn= getArgDefault(mb,p,2); s = findModule(MCgetClient()->nspace, putName(mod, strlen(mod))); if (s == 0) return 0; t= findSymbolInModule(s, fcn); if( t == 0) return 0; target= t->def; mod= getArgDefault(mb,p,3); fcn= getArgDefault(mb,p,4); } s = findModule(MCgetClient()->nspace, putName(mod, strlen(mod))); if (s == 0) return 0; if (s->subscope) { j = getSubScope(fcn); for (t = s->subscope[j]; t != NULL; t = t->peer) if (t->def->errors == 0) { if (getSignature(t)->token == FUNCTIONsymbol) MACROprocessor(target, t); } } return 1;}#line 513 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 471 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"static intOPTorcamImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ MalBlkPtr target= mb; Module s; Symbol t; str mod,fcn; int j; (void) p; (void) stk; if( p->argc == 3){ mod= getArgDefault(mb,p,1); fcn= getArgDefault(mb,p,2); } else { mod= getArgDefault(mb,p,1); fcn= getArgDefault(mb,p,2); s = findModule(MCgetClient()->nspace, putName(mod, strlen(mod))); if (s == 0) return 0; t= findSymbolInModule(s, fcn); if( t == 0) return 0; target= t->def; mod= getArgDefault(mb,p,3); fcn= getArgDefault(mb,p,4); } s = findModule(MCgetClient()->nspace, putName(mod, strlen(mod))); if (s == 0) return 0; if (s->subscope) { j = getSubScope(fcn); for (t = s->subscope[j]; t != NULL; t = t->peer) if (t->def->errors == 0) { if (getSignature(t)->token == FUNCTIONsymbol) ORCAMprocessor(target, t); } } return 1;}#line 514 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 568 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 533 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"str OPTmacro(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ Module s; Symbol t; str msg,mod,fcn; lng clk= GDKusec(); int actions = 0; optimizerInit(); if( p->argc == 3){ mod= getArgDefault(mb,p,1); fcn= getArgDefault(mb,p,2); } else { mod= getArgDefault(mb,p,3); fcn= getArgDefault(mb,p,4); } s = findModule(MCgetClient()->nspace, putName(mod, strlen(mod))); if (s == 0) return 0; t= findSymbolInModule(s, fcn); if( t == 0) return 0; msg = MACROvalidate(t->def); if( msg) return msg; if( mb->errors == 0) actions= OPTmacroImplementation(mb,stk,p); if( p ) removeInstruction(mb, p); optimizerCheck(mb, "optimizer.macro", actions, GDKusec() - clk, OPT_CHECK_ALL); return MAL_SUCCEED;}#line 568 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 572 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 533 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"str OPTorcam(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){ Module s; Symbol t; str msg,mod,fcn; lng clk= GDKusec(); int actions = 0; optimizerInit(); if( p->argc == 3){ mod= getArgDefault(mb,p,1); fcn= getArgDefault(mb,p,2); } else { mod= getArgDefault(mb,p,3); fcn= getArgDefault(mb,p,4); } s = findModule(MCgetClient()->nspace, putName(mod, strlen(mod))); if (s == 0) return 0; t= findSymbolInModule(s, fcn); if( t == 0) return 0; msg = MACROvalidate(t->def); if( msg) return msg; if( mb->errors == 0) actions= OPTorcamImplementation(mb,stk,p); if( p ) removeInstruction(mb, p); optimizerCheck(mb, "optimizer.orcam", actions, GDKusec() - clk, OPT_CHECK_ALL); return MAL_SUCCEED;}#line 572 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"#line 575 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_macro.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -