38|中端优化第1关:实现多种本地优化
宫文学
你好,我是宫文学。
上一节课,我们设计了 IR 的数据结构,并且分析了如何从 AST 生成 IR。并且,这些 IR 还可以生成.dot 文件,以直观的图形化的方式显示出来。
不过,我们上一节课只分析了 if 语句,这还远远不够。这节课,我会先带你分析 for 循环语句,加深对你控制流和数据流的理解。接着,我们就会开始享受这个 IR 带来的红利,用它来完成一些基本的本地优化工作,包括公共子表达式删除、拷贝传播和死代码删除,让你初步体会基于 IR 做优化的感觉。
那么,我们先接着上一节课,继续把 for 循环从 AST 转换成 IR。
把 For 循环转换成 IR
同样地,我们还是借助一个例子来做分析。这个例子是一个实现累加功能的函数,bar 函数接受一个参数 a,然后返回从 1 到 a 的累加值。
这里,我先直接画出最后生成的 IR 图的样子:
你一看这个图,肯定会觉得有点眼花缭乱,摸不清头绪。不过没关系,这里面是有着清晰的逻辑的。
第一步,我们先来看控制流的部分。
在程序开头的时候,依然还是一个 Start 节点。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了如何将AST转换成IR,并利用IR进行多种本地优化。通过具体示例和图形化展示,生动地介绍了如何利用IR进行多种本地优化,包括公共子表达式删除、拷贝传播和死代码删除。文章通过详细介绍了如何将for循环转换成IR,包括控制流和数据流的处理,以及利用IR进行公共子表达式删除和拷贝传播的优化任务。同时,还介绍了如何检测死代码,并通过图形化展示展示了死代码在IR中的特点。最后,强调了优化工作的结果会为其他的优化创造机会,编译器在优化一个IR的时候会前后多次调用同一个优化算法。整体来说,本文通过具体示例和图形化展示,生动地介绍了如何利用IR进行多种本地优化,为读者提供了深入理解和应用IR的方法。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一门编程语言》,新⼈⾸单¥59
《手把手带你写一门编程语言》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(3)
- 最新
- 精选
- ifelse学习打卡2022-10-01归属地:浙江
- chris老师, 是否连接loopend和loopbegin的黑线箭头方向反了, 应该是loopbegin指向loopend2022-01-261
- 奋斗的蜗牛如果考虑控制流,我认为比较DataNode时,要加入控制节点的比较2021-11-10
收起评论