当前位置:网站首页>毕昇编译器优化: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、最终的解决方案


参考
边栏推荐
猜你喜欢

JVM:(八)运行时数据区之方法区

毕昇编译器优化:Lazy Code Motion

The most complete architect knowledge map in history

好的架构是进化来的,不是设计来的

阿里云张新涛:支持沉浸式体验应用快速落地,阿里云云XR平台发布

ARM 汇编基础

numpy中nan_to_num如何使用

The senior told me that the MySQL of the big factory is connected through SSH

李乐园:iMetaLab Suite宏蛋白质组学数据分析与可视化(视频+PPT)

How tall is the B+ tree of the MySQL index?
随机推荐
动态RDLC报表(七)
fastdfs-client使用
神秘的程序员(20-30)
win10 uwp 简单MasterDetail
日本著名设计师三宅一生去世:产品曾被国人高价抢 乔布斯也是粉丝
.NET现代应用的产品设计 - DDD实践
.NET 6 study notes (4) - Solve the Nullable warning in VS2022
loadrunner script -- parameterization
进程的两种创建方式,join方法,进程间的数据隔离,队列,进程间的通信IPC机制,生产者消费者模型,守护进程,僵尸进程,孤儿进程,互斥锁
web正则表达式中^和$的含义是什么
Ng DevUI 周下载量突破1000啦!
没有 accept,TCP 连接可以建立成功吗?
2022秋招面试宝典,啃完面试稳了
SSM框架练手项目,高企必备的管理系统—CRM管理系统
numpy中nan_to_num如何使用
shared usage in d
JSDN blog system
megacli磁盘阵列
Prometheus full installation
太厉害了!华为大牛终于把 MySQL 讲的明明白白(基础 + 优化 + 架构)