39|中端优化第2关:全局优化要怎么搞?
宫文学
你好,我是宫文学。
上一节课,我们用了一些例子,讨论了如何用基于图的 IR 来实现一些优化,包括公共子表达式删除、拷贝传播和死代码删除。但这些例子,都属于本地优化的场景。也就是说,在未来生成的汇编代码中,这些代码其实都位于同一个基本块。
不过,复杂一点的程序,都会有 if 语句和循环语句这种流程控制语句,所以程序就会存在多个基本块。那么就会存在跨越多个基本块的优化工作,也就是全局优化。
所以,今天这节课,我们就来讨论一下如何基于当前的 IR 做全局优化。同时,为了达到优化效果,我们这一节课还需要把浮动的数据节点划分到具体的基本块中去,实现指令的调度。
但在讨论全局优化的场景之前,我还要先给你补充一块知识点,就是变量的版本和控制流的关系,让你能更好地理解全局优化。
变量的版本和控制流的关系
通过前几节课我们已经知道,我们的 IR 生成算法能够对一个变量产生多个版本的定义,从而让 IR 符合 SSA 格式。可是,我们是如何来表示不同版本的定义的,又是如何确定程序中到底引用的是变量的哪个版本呢?
在 IR 的模型中,我引入了一个 VarProxy 类,来引用变量的一个版本,就像 d0、d1 和 d2,也有的文献把变量的一个定义叫做变量的一个定值。VarProxy 里面保存了一个 VarSymbol,还包括了一个下标:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
全局优化是编译器中的重要环节,本文介绍了基于图的IR进行全局优化的方法。文章首先讲解了变量版本与控制流的关系,通过VarProxy类来表示不同版本的变量定义,并将其与控制流绑定,以确定程序中引用的是哪个版本。接着详细讨论了全局的死代码删除,以及部分冗余消除等优化技术。文章还介绍了划分基本块和指令调度的算法,以及循环无关代码外提的优化方法。全文深入浅出地介绍了全局优化的相关概念和实现方法,对于编译器领域的技术人员具有一定的参考价值。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一门编程语言》,新⼈⾸单¥59
《手把手带你写一门编程语言》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(2)
- 最新
- 精选
- ifelse学习打卡2022-10-03归属地:浙江
- 奋斗的蜗牛老师的讲课水平真是一流2021-11-12
收起评论