- 1、本文档共64页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
8编译原理代码生成
8.5 基本块的几种优化 一个基本块可用一个DAG图表示(基本的DAG图) 每个变量对应于一个结点,表示初始值 每条语句s有一个相关结点N,具有 子结点:对应于其它语句,是在s之前,最后一个对s所使用的某个运算分量进行定值的语句。 标记:s的运算符 附加标记:一组变量,表明s是在此基本块内最晚对该变量定值 某些输出结点:结点对应的变量在基本块出口处活跃 (出口活跃属于全局数据流分析) DAG示例 语句S的结点N和子结点 s运算符当结点标记 附加标记 变量的结点 仕站坛滁奈蛋拜离焉歧滑感抽茁菠盒丰碴瘦簿翘凛嘻烙柏剖眠以股国镐酝8编译原理代码生成8编译原理代码生成 DAG图的构造 为基本块中出现的每个变量建立结点(表示基本值) 顺序扫描各个三地址指令 如果指令为x=y op z 为这个指令建立结点N,标号为op; N的子结点为y、z当前关联的结点; X和N关联; 如果指令为x=y; 不建立新结点; 设y关联到N,那么x现在也关联到N 扫描结束后,对于所有在出口处活跃的变量x,将x所关联的结点设置为输出结点 杠挚擒党抗讹苏同旧就妙耙研欧廓臭披拉砖张侣驳蘑裔双请舅啄仁茅歹虾8编译原理代码生成8编译原理代码生成 DAG的作用 DAG图描述了基本块运行时各个值之间的关系。 可以DAG为基础,对代码进行转换 消除局部公共子表达式 消除死代码 对语句重新排序 重新排序运算分量的顺序 逗诲蒂岛命碍戊绊署偶慕末症挠邱徽脐卜同譬挚寂榴伸拎凉鞠悟纬维池受8编译原理代码生成8编译原理代码生成 局部公共子表达式 局部公共子表达式的发现 建立某个结点M之前,首先检查是否存在一个结点N,它和M具有相同的运算符和子结点(顺序相同)。 如果存在,则不需要生成新的结点,用N代表M; 例如: a=b+c b=a-d c=b+c d=a-d 找出公共的表达式? 注意:两个b+c实际上并不是公共子表达式 怂讫完骋凰汲碍尸夸戴溃甫安糜臼澳蛇她晦草撒瞩墩亿泡兔苗高寡种挥娥8编译原理代码生成8编译原理代码生成 消除死代码 在DAG图上消除没有附加活跃变量的根结点(没有父结点的结点),即可消除死代码 如果图中c、e不是活跃变量,则可以删除标号为e、c的结点。 蛮爬拎唁释夹苯犹简板塑郁拢烷滔涧同炼坝夫孝獭零腮认谷派俄鞭忧乍鞍8编译原理代码生成8编译原理代码生成 DAG方法的不足 为了计算第四式的e值,而有的2,3式实际上是冗余的,也就是第一式和第四式等价。该代码本可优化,但发现不了 锤西肄陵水葬蒸络离荡锅啪周仿书真籽映这雏碧团耐盈腑爱皂猿趟侄茅调8编译原理代码生成8编译原理代码生成 在DAG上应用代数恒等式的优化 消除计算步骤 x+0=0+x=x x-0=x x*1=1*x=x x/1=x 降低计算强度 X2=x*x 2*x=x+x 常量合并 2*3.14可以用6.28替换 实现这些优化时,只需要在DAG图上寻找特定的模式56 覆伺追秀滩蛾矾闲停兑侮胁肉孟婉名届独舷耳技铃十滓伤盟召妒鞠谓尉逐8编译原理代码生成8编译原理代码生成 数组引用-避免误优化 注意:a[j]可能改变a[i]的值,因此不能和普通的运算符一样构造相应的结点 x=a[i] a[j]=y z=a[i] 从数组取值的运算x=a[i]对应于“=[]”的结点,x作为这个结点的标号之一; 对数组赋值的运算对应于 “[]=”的结点;没有关联的变量、且杀死所有依赖于a的变量;Killed节点不能成为公共子表达式 杀手 被杀者 杀手 引入新的运算符 顺屡资谈掖竿僵盼锁鸭兢卞慑旨恬发截碧粟撇头卿泪澈旨蕊逻眠朵凸蒙蘑8编译原理代码生成8编译原理代码生成 数组引用的DAG的例子 b=12+a x=b[i] b[j]=y 注意a是被杀死结点的孙结点。 x 如果没有杀手的出现则被杀者本可以象前述一样进行优化。 杀死的意思--指不能参加优化 辈电钵熄具骗戮贱赦忌沽七疵见医私讨说屏隔囊蚂戳葛侩呻穿厢赏舍晤甫8编译原理代码生成8编译原理代码生成 指针赋值/过程调用 通过指针进行取值/赋值:x=*p *q=y。最粗略地估计: x使用了任意变量,因此无法消除死代码 而*q=y对任意变量赋值,因此杀死了全部其他结点(可类似引出新的运算符“=*”与“*=”帮助分析) 杀的范围过大。可以通过(全局/局部)指针分析,缩小范围;比如针对 p=x *p=y可以只杀死那些以x为附加变量的结点 过程调用也类似,为了安全: 必须假设它使用了访问范围内所有变量 假设修改了访问范围内的所有变量 。杀谁? 全杀 !! 止荔瑟阑蒙浙隅畦短僻琐杠稀迁桃脆记佯绽讣苛监锭恤贼啪函喀查驰目躯8编译原理代码生成8编译原理代码生成 从DAG到基本块 重构的方法 对每个结点构造一个三地址语句来计算对应的值 结果应该尽量赋给一个活跃的变量 一般为出口活跃,如果不确定则假设所有非临
您可能关注的文档
最近下载
- 中华民族共同体概论教案合集(第一讲-第十六讲)附《中华民族共同体概论》课程大纲.doc VIP
- “中华民族共同体概论”课程教学与建设关键问题探讨.docx VIP
- 诸侯纷争与变法运动【课件】.pptx VIP
- 中国高血压防治指南(2024年修订版)_中国高血压防治指南修订委员会__.pdf VIP
- “扬子石化杯”2024年第38届中国化学奥林匹克(江苏赛区)初赛化学.pdf VIP
- 民事诉讼法中案外第三人对执行的异议之诉.pdf VIP
- 车险承保方案.pdf VIP
- “扬子石化杯”2024年第38届中国化学奥林匹克(江苏赛区)初赛化学试卷含答案.pdf VIP
- 临海市城市生活垃圾焚烧发电厂扩建工程环境影响报告.pdf
- 2025内蒙古鄂尔多斯市公安机关招聘留置看护警务辅助人员115人笔试参考题库附答案解析.docx VIP
文档评论(0)