1、实用文档 文案大全 基于基于 DAG 的基本块优化的基本块优化 1 1实验目的与任务实验目的与任务 了解基本块的 DAG 表示及其应用,掌握局部优化的基本方法。2 2实验要求实验要求 设计一个转换程序,把由四元式序列表示的基本块转换为 DAG,并在构造 DAG 的过程中,进行合并已知量、删除无用赋值及删除公共子表达式等局部优化处理。最后再从所得到的 DAG 出发,按原来生成 DAG 各个结点的顺序,重建四元式序列形式的基本块。3 3实验内容实验内容 (1)DAG 的结点类型只考虑 0 型、1 型和 2 型,如下表所示。(2)由基本块构造 DAG 算法如下:while(基本块中还有未处理过的四元
2、式)取下一个四元式 Q;newleft=newright=0;if(getnode(B)=NULL)makeleaf(B);newleft=1;switch(Q 的类型)case 0:n=getnode(B);insertidset(n,A);break;case 1:if(isconsnode(B)p=calcons(Q.op,B);if(newleft=1)/*getnode(B)是处理 Q 时新建结点 */delnode(B);if(n=getnode(p)=NULL)makeleaf(p);类型 四元式 DAG 结点 0 型(=,B,A)A B 1 型 (op,B,A)op 2 型(o
3、p,B,C,A)(=,B,C,A)(jrop,B,C,A)B C=3 1 2 B C rop 3 1 2 B C op 3 1 2 实用文档 文案大全 n=getnode(p);else if(n=findnode(Q.op,B)=NULL)n=makenode(Q.op,B);insertidset(n,A);break;case 2:if(getnode(C)=NULL)makeleaf(C);newright=1;if(isconsnode(B)&isconsnode(C)p=calcons(Q.op,B,C);if(newleft=1)/*getnode(B)是处理 Q 时新建结点 *
4、/delnode(B);if(newright=1)/*getnode(C)是处理 Q 时新建结点 */delnode(C);if(n=getnode(p)=NULL)makeleaf(p);n=getnode(p);else if(n=findnode(Q.op,B,C)=NULL)n=makenode(Q.op,B,C);insertidset(n,A);break;上述算法中应设置如下的函数:getnode(B):返回 B(可以是标记或附加信息)在当前 DAG 中对应的结点号。makeleaf(B):构造标记为 B 的叶子结点。isconsnode(B):检查 B 对应的结点是否为标记为
5、常数的叶子结点。calcons(Q.op,B):计算 op B 的值(即合并已知量)。它的另一种调用形式是 calcons(Q.op,B,C):计算 B op C 的值。delnode(B):删除 B(结点的标记)在当前 DAG 中对应的结点。findnode(Q.op,B):在当前DAG中查找并返回这样的结点:标记为op,后继为getnode(B)(即查找公共子表达式 op B)。它的另一种调用形式是 findnode(Q.op,B,C)(即查找公共子表达式 B op C)。实用文档 文案大全 makenode(Q.op,B,C):构造并返回标记为 op,左右后继分别为 getnode(B)
6、、getnode(C)的内部结点。insertidset(n,A):若 getnode(A)=NULL,则把 A 附加到结点 n;否则,若 A 在 getnode(A)的附加标识符集中,且 getnode(A)无前驱或虽有前驱但 getnode(A)附加标识符集中符号数大于 1,则把 A 从 getnode(A)的附加标识符集中删除(即删除无用赋值)。请实现上述基本块的DAG构造算法,并添加从所得DAG按原来生成DAG各个结点的顺序,重建四元式序列的功能。(3)测试用例 用下面的基本块作为输入:(1)T1=A*B(2)T2=3/2(3)T3=T1 T2(4)X=T3 (5)C=5(6)T4=A
7、*B(7)C=2(8)T5=18+C(9)T6=T4*T5(10)Y=T6 基本块的 DAG 如下:按生成 DAG 各个结点的顺序,重建四元式序列如下:(1)T1=A*B(2)T2=1.5(3)T3=T1 1.5(4)X=T3 (5)T4=T1(6)C=2(7)T5=20(8)T6=T1*20(9)Y=T6 *-T1,T4 T3,X T6,Y A B 1.5 20 5 2 T2 T5 C 实用文档 文案大全 Code.txt 文件内容 T1=A*B T2=3/2 T3=T1 T2 X=T3 C=5 T4=A*B C=2 T5=18+C T6=T4*T5 Y=T6#include#include
8、#include#include /*function ans data statement*/#define MAXN 5 /*符号或变量最大长度*/*结点类型*/typedef struct node int iscons;/*0-无 1-整型 2-浮点*/int val_int;/*整型值*/double val_float;/*浮点值*/int idnum;/*变量的个数*/char idMAXNMAXN;/*变量 0valnum-1*/char opMAXN;/*结点操作*/int left,right;/*左右节点*/DAGNODE;#define MAXNN 20 /*DAG 最
9、大结点数目*/实用文档 文案大全/*DAG*/typedef struct mnode int num;/*结点个数*/DAGNODE nodeMAXNN;/*结点内容 1NUM*/DAG;/*四元式 Quaternion*/typedef struct snode int type;/*类型 0 1 2*/char opMAXN;/*操作*/char op1MAXN;/*操作数 1*/char op2MAXN;/*操作数 2*/char ansMAXN;/*结果*/QUA;void init();/*初始化函数*/bool getqua(QUA*qua);/*获取一个四元式*/int isn
10、ums(char*val);/*检测字符串是否是数字串 0 标识符 1 整型数串 2 浮点数串*/void makeleaf(DAGNODE*n,char val);/*构造叶子结点*/void makenode(DAGNODE*n,char op,int left,int right);/*构造中间结点*/int getnode(DAG dag,char var);/*获取 var所在结点号*/int find1node(DAG dag,char op1,char op);/*查找已有的表达式 1*/int find2node(DAG dag,char op1,char op2,char o
11、p);/*查找已知表达式 2*/char*isconsnode(DAG dag,char id);/*是否是常数结点的 id*/void delnode(DAG*dag,int num);/*删除结点 num*/void delid(DAG*dag,int num);/*删除某节点的 Id*/void copynode(DAGNODE*to,DAGNODE from);/*复制结点值*/void insertvar(DAG*dag,int noden,char var);/*将值 var 附加在 noden 结点*/int insertnode(DAG*dag,DAGNODE dagn);/*
12、将结点插入 DAG*/char*calcons1(char op,char op1);/*计算 op op1 的运算值*/char*calcons2(char op,char op1,char op2);/*op1 op op2*/void makeDAG();/*构造 DAG*/void dispDAG(DAG dag);/*输出 DAG*/char*getv(DAG dag,int dagn);FILE*fp;/*文件指针,指向代码文件*/void dispcode();int main()init();实用文档 文案大全 dispcode();init();makeDAG();retur
13、n 0;void dispcode()static int i=1;QUA q;while(getqua(&q)if(q.type=0)printf(%d)%s%s%sn,i+,q.ans,q.op,q.op1);else if(q.type=1)printf(%d)%s=%s%sn,i+,q.ans,q.op,q.op1);else printf(%d)%s=%s%s%sn,i+,q.ans,q.op1,q.op,q.op2);/*初始化函数*/void init()if(fp=fopen(code.txt,r)=NULL)printf(the code file is not existe
14、d.);exit(0);/*获取一个四元式*/bool getqua(QUA*qua)int t;if(feof(fp)fclose(fp);return false;fscanf(fp,%d,&t);fscanf(fp,%s,qua-ans);fscanf(fp,%s,qua-op);fscanf(fp,%s,qua-op1);if(fgetc(fp)=n|feof(fp)strcpy(qua-op2,);if(!strcmp(qua-op,=)qua-type=0;if(feof(fp)fclose(fp);return false;return true;实用文档 文案大全 fscanf
15、(fp,%s,qua-op);if(fgetc(fp)=n|feof(fp)strcpy(qua-op2,qua-op);strcpy(qua-op,qua-op1);strcpy(qua-op1,qua-op2);strcpy(qua-op2,);qua-type=1;if(feof(fp)fclose(fp);return false;return true;fscanf(fp,%s,qua-op2);qua-type=2;return true;int isnums(char*val)int i,flag;for(i=0;vali;i+)if(!isdigit(vali)if(vali=
16、.)/*浮点*/flag=2;break;flag=0;break;else flag=1;/*整型*/return flag;/*构造叶子结点*/void makeleaf(DAGNODE*n,char val)switch(isnums(val)case 0:n-iscons=0;n-val_float=0;n-val_int=0;n-idnum=1;strcpy(n-id0,val);break;case 1:实用文档 文案大全 n-idnum=0;n-iscons=1;n-val_int=atoi(val);n-val_float=0;break;case 2:n-idnum=0;n-iscons=2;n-val_int=0;n-val_float=atof(val);break;strcpy(n-op,);n-left=n-right=0;/*构造中间结点*/void makenode(DAGNODE*n,char op,int left,int right)n-idnum=0;n-iscons=0;strcpy(n-op,op);n-left=left;n-right=ri
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1