📄 opt_peephole.c
字号:
#line 48 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_peephole.mx"#include "mal_config.h"#include "opt_peephole.h"#include "opt_aliases.h"#line 52 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_peephole.mx"#line 90 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_peephole.mx"static intOPTpeepholeImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){ InstrPtr p, q, r, *old; int i, limit, doit, actions = 0;#ifdef DEBUG_OPT_PEEPHOLE stream_printf(GDKout, "Peephole optimizer started\n");#endif (void) stk; (void) pci; actions = 0; doit = 0; setLifespan(mb); limit = mb->stop; old = mb->stmt; newMalBlkStmt(mb, mb->stop); for (i = 0; i < limit; i++) { p = old[i]; q = i < limit - 1 ? old[i + 1] : 0; if (q && match(p, batRef, reverseRef) && match(q, batRef, reverseRef) && getArg(p, 0) == getArg(q, 1) && getVar(mb, getArg(p, 0))->endLifespan == i + 1) {#ifdef DEBUG_OPT_PEEPHOLE printf("PEEPHOLE reverse-reverse\n"); printInstruction(GDKout, mb, p, LIST_MAL_ALL); printInstruction(GDKout, mb, q, LIST_MAL_ALL);#endif r = newInstruction(mb,ASSIGNsymbol); getArg(r, 0) = getArg(q, 0); pushArgument(mb, r, getArg(p, 1)); freeInstruction(p); freeInstruction(q); pushInstruction(mb, r); i++; actions++; doit++; } else if (match(p, "optimizer", "peephole")) freeInstruction(p); else pushInstruction(mb, p); } GDKfree(old); if (doit) { chkProgram(MCgetClient()->nspace, mb); setLifespan(mb);#ifdef DEBUG_OPT_PEEPHOLE stream_printf(GDKout, "PEEPHOLE %d\n", doit); printFunction(GDKout, mb, LIST_MAL_ALL);#endif } return actions;}#line 150 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_peephole.mx"#line 148 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_peephole.mx"/* #define _DEBUG_OPTIMIZER_*/str OPTpeephole(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 peephole\n"); printFunction(GDKout,mb,LIST_MAL_ALL);#endif if( p && p->argc > 1 && getFunctionId(p) != multiplexRef){#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"locate function peephole\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.peephole",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.peephole",buf); }#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"peephole %s %d\n",modnme,fcnnme);#endif mb = s->def; stk= 0; } if( mb->errors ) return MAL_SUCCEED; addtoMalBlkHistory(mb); actions= OPTpeepholeImplementation(mb,stk,p);#ifdef _DEBUG_OPTIMIZER_ stream_printf(GDKout,"finished peephole %d\n",actions); printFunction(GDKout,mb,LIST_MAL_ALL);#endif optimizerCheck(mb, "optimizer.peephole", actions, GDKusec() - clk,OPT_CHECK_ALL); return MAL_SUCCEED;}#line 150 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_peephole.mx"#line 152 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_peephole.mx"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -