手把手带你写一门编程语言
宫文学
北京原点代码 CEO
7534 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
起步篇:让一门超简单的语言跑起来 (21讲)
结束语 (1讲)
手把手带你写一门编程语言
15
15
1.0x
00:00/00:00
登录|注册

39|中端优化第2关:全局优化要怎么搞?

你好,我是宫文学。
上一节课,我们用了一些例子,讨论了如何用基于图的 IR 来实现一些优化,包括公共子表达式删除、拷贝传播和死代码删除。但这些例子,都属于本地优化的场景。也就是说,在未来生成的汇编代码中,这些代码其实都位于同一个基本块。
不过,复杂一点的程序,都会有 if 语句和循环语句这种流程控制语句,所以程序就会存在多个基本块。那么就会存在跨越多个基本块的优化工作,也就是全局优化。
所以,今天这节课,我们就来讨论一下如何基于当前的 IR 做全局优化。同时,为了达到优化效果,我们这一节课还需要把浮动的数据节点划分到具体的基本块中去,实现指令的调度。
但在讨论全局优化的场景之前,我还要先给你补充一块知识点,就是变量的版本和控制流的关系,让你能更好地理解全局优化。

变量的版本和控制流的关系

通过前几节课我们已经知道,我们的 IR 生成算法能够对一个变量产生多个版本的定义,从而让 IR 符合 SSA 格式。可是,我们是如何来表示不同版本的定义的,又是如何确定程序中到底引用的是变量的哪个版本呢?
在 IR 的模型中,我引入了一个 VarProxy 类,来引用变量的一个版本,就像 d0、d1 和 d2,也有的文献把变量的一个定义叫做变量的一个定值。VarProxy 里面保存了一个 VarSymbol,还包括了一个下标:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

全局优化是编译器中的重要环节,本文介绍了基于图的IR进行全局优化的方法。文章首先讲解了变量版本与控制流的关系,通过VarProxy类来表示不同版本的变量定义,并将其与控制流绑定,以确定程序中引用的是哪个版本。接着详细讨论了全局的死代码删除,以及部分冗余消除等优化技术。文章还介绍了划分基本块和指令调度的算法,以及循环无关代码外提的优化方法。全文深入浅出地介绍了全局优化的相关概念和实现方法,对于编译器领域的技术人员具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一门编程语言》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • ifelse
    学习打卡
    2022-10-03归属地:浙江
  • 奋斗的蜗牛
    老师的讲课水平真是一流
    2021-11-12
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部