基于DAG的基本块优化.docxVIP

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于DAG的基本块优化 1.实验目的与任务 了解基本块的DAG表示及其应用,掌握局部优化的基本方法。 2.实验要求 设计一个转换程序,把由四元式序列表示的基本块转换为DAG,并在构造DAG的过程中,进行合并已知量、删除无用赋值及删除公共子表达式等局部优化处理。最后再从所得到的DAG出发,按原来生成DAG各个结点的顺序,重建四元式序列形式的基本块。 3.实验内容 (1)DAG的结点类型只考虑0型、1型和2型,如下表所示。 类型 四元式 DAG结点 0型 (=,B, ,A) ①A B 1型 (op,B, ,A) ② op ① 2型 (op,B,C,A) (=[ ],B,C,A) (jrop,B,C,A) BCrop3 B C rop 3 1 2 B C =[] 3 1 2 B C op 3 1 2 (2)由基本块构造DAG算法如下: while(基本块中还有未处理过的四元式) { 取下一个四元式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); 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时新建结点 */ 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对应的结点是否为标记为常数的叶子结点。 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)、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 * B (7) C = 2 (8) T5 = 18 + C (9) T6 = T4 * T5 (10) Y = T6 基本块的DAG如下: * * * - ③T1,T4 ⑤T3,X ⑨T6,Y ① A B

文档评论(0)

kfcel5889 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档