当前位置:网站首页>毕昇编译器优化:Lazy Code Motion
毕昇编译器优化:Lazy Code Motion
2022-08-09 17:31:00 【InfoQ】
导语
- ②和③哪个优化效果更好一点?
- (3)这种情况,在 p 点直接插入 t=b+c 会带来安全或性能问题吗?会改变程序的行为吗?
- 能否由编译器来完成一个算法,找到一个通用的、寻找到合适的插入点的方法以消除冗余计算?
0.1 开始之前
(1)我们可以把计算移动到不会重复计算的路径吗?
- 左边例子是可以的。这也是下文算法要找的情景。当然实际应用程序中会更复杂,以致我们不能明显看出或不经意间引入冗余的计算,比如 《Lazy code motion》1 里给出的例子。
- 中间不可以,因为 b 被重新定义了,所以 a = b + c 不是冗余计算了。
- 右边不可以,因为 a = b + c 可能一次也没执行,移动到循环前可能会改变程序的行为。
(2)左图到右图的变化有优化效果吗
(3)下图中,能否在 block d 的父项 p 上插入表达式 t=b+c:
0.2 临界边(Critical Edge)的定义
- 为每个指向拥有多个前置的基本块添加一个基本块(不仅仅是在 临界边 上)。
- 为了保持算法简单,将每个语句视为其自己的基本块,并将指令的放置限制在基本块的开头。
1、算法
- 首先计算预期表达式(Anticipated)集合
- 计算将可用的表达式(Will-be-Available)集合
- 从 AVAIL 和 ANT ,我们为每个表达式计算出最早的插入位置(Earliest)集合,这最大限度地消除了冗余,但可能会增大寄存器生存期
- 再计算延迟表达式(Postponable)集合
- 经过上面的计算,引入最新 的定义,计算最晚插入的点的集合,实现与最早 相同数量的冗余消除,但缩短了保存表达式值的寄存器的生存期
- 计算使用表达式(Used)
- 计算最后的插入位置的集合,替换冗余表达式
1.1 预期表达式(预期)
1.2 将可用的表达式
1.3 延缓表达式(延期)
- 先在 最早与 postpobable 集合的并集位置放置表达式 e 。
- 对上一步的点进行筛选,需要满足:表达式 e 在 b 点(随后的基本块)被Use 或 它不是上一步点的后继。
1.4 已用表达式
2、最终的解决方案
参考
边栏推荐
猜你喜欢
2022秋招面试宝典,啃完面试稳了
Engaged in software testing for a year, only basic functional testing, how to further study?
毕昇编译器优化:Lazy Code Motion
没有 accept,TCP 连接可以建立成功吗?
The principle implementation of handwritten flexible.js, I finally understand the multi-terminal adaptation of the mobile terminal
基于AWS构建云上数仓第一步:云平台的基础概念
50道Redis面试题,来看看你会多少?
Metasploit——辅助模块(Auxiliary)
史上最全架构师知识图谱(纯干货)
[SUCTF 2019]CheckIn
随机推荐
LeetCode笔记:Biweekly Contest 84
web正则表达式中^和$的含义是什么
动态RDLC报表(六)
ceph 创建池和制作块设备基操
How to play with container local storage through open-local? | Dragon Lizard Technology
太厉害了!华为大牛终于把 MySQL 讲的明明白白(基础 + 优化 + 架构)
[Pycharm easy to use function]
线性代数学习笔记
uniapp中使用网页录音并上传声音文件(发语音)——js-audio-recorder的使用【伸手党福利】
API接口是什么?API接口常见的安全问题与安全措施有哪些?
阿里云张新涛:支持沉浸式体验应用快速落地,阿里云云XR平台发布
megacli磁盘阵列
LeetCode笔记:Weekly Contest 305
神秘的程序员(20-30)
单片机编程-状态机
100+开箱即用的AI工具箱;程序员150岁长寿指南;『地理空间数据科学』课程资料;Graphic数据可视化图表库;前沿论文 | ShowMeAI资讯日报
史上最全架构师知识图谱(纯干货)
loadrunner脚本--参数化
关于链表的操作
50道Redis面试题,来看看你会多少?