⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opt_support.c

📁 一个内存数据库的源代码这是服务器端还有客户端
💻 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 + -