当前位置:网站首页>Bi Sheng Compiler Optimization: Lazy Code Motion
Bi Sheng Compiler Optimization: Lazy Code Motion
2022-08-09 21:04: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)集合
- 经过上面的计算,引入最新 的定义,计算最晚插入的点的集合,With the earliest 相同数量的冗余消除,但缩短了保存表达式值的寄存器的生存期
- 计算使用表达式(Used)
- 计算最后的插入位置的集合,替换冗余表达式
1.1 预期表达式(预期)
1.2 将可用的表达式
1.3 延缓表达式(延期)
- 先在 最早与 postpobable 集合的并集位置放置表达式 e .
- 对上一步的点进行筛选,需要满足:表达式 e 在 b 点(随后的基本块)被Use 或 它不是上一步点的后继.
1.4 已用表达式
2、最终的解决方案
参考
边栏推荐
猜你喜欢
Cortex-A7 MPCore 架构
李乐园:iMetaLab Suite宏蛋白质组学数据分析与可视化(视频+PPT)
How to stop the test after reaching a given number of errors during stress testing in JMeter
开源一夏 | 基于若依架构的列表详情展示
uniapp中使用网页录音并上传声音文件(发语音)——js-audio-recorder的使用【伸手党福利】
C#/VB.NET:从PowerPoint文档中提取文本和图片
numpy中nan_to_num如何使用
kakka rebalance解决方案
golang单元测试:testing包的基本使用
每周给我10分钟,我给你一个Flink SQL 菜谱——甜点:数据过滤
随机推荐
jmeter - record script
VIT transformer详解
与同步传递相关的获取-释放序列
win10 uwp 装机必备应用 含源代码
Linux上给PHP安装redis扩展
单调栈
Redis很大的时候,key 要如何处理?
正则表达式(全)
MFC教程
Office 365 Group概述以及创建方法
苦日子快走开
loadrunner script -- parameterization
JSDN博客系统
Win10系统80端口被占用的解决方法
Iptables防火墙常见的典型应用场景
uniapp中使用网页录音并上传声音文件(发语音)——js-audio-recorder的使用【伸手党福利】
Detailed explanation of VIT transformer
shell脚本基础语句使用(一)
Flink on Yarn
awk use