软件工程作业-方舟学习笔记07-方舟构建方法

方舟开源范围
这一篇比较一下SSA构建方法与传统编译器的区别和优化,先来看一组比较实例:
一般方法 SSA方法
a=b+c; a1=b1+c1;
a=a+b; a2=a1+b1;
b=a+c; b2=a2+c1;
静态单一赋值会有以下几点优势:当每个变量只有一个定值时,数据流分析和优化算法可以变得更简单。如果一个变量有 N 个使用和 N 个定值,代码中可能是n+m条语句。表示定值-使用链所需要空间(和时间)和 N·M 成正比——即成平方增大。静态单赋值形式中,变量的使用和定值可以与控制流图的必经节点结构进行联系,从而简化诸如冲突图等算法。源程序中的同一个变量的不相关使用在 SSA 形式中变成了不同的变量,从而删除了它们之间不必要的关系。SSA是一种高效的数据流分析技术,运用在编译技术和代码静态分析技术中。几乎所有热门的语言所用的热门编译器、解释器、虚拟机中都使用了SSA这门技术。
me_ssa

方舟编译器SSA技术应用编译器源码中与SSA技术有关的文件有me_ssa、me_ssa_tab、me_ssa_update、ssa、ssa_mir_nodes、ssa_tab,查了一下me_function和mir相关文件SSA的内容发现,其中都是对于指针、控制流以及意图算法的优化。
ssa_tab

通俗得说,就是a要多次引用赋值,而要确保a是可以静态单一赋值的办法就是给a打上标签进行区分,于是a1、a2、a3就出现了,然后有个叫dominance(统治)的方法从源码的一堆方法中分析出了控制流图以及节点(nodes),这些节点不能发生冲突,因为如果冲突了,计算机同时并行处理两个冲突的函数就会崩溃,于是对这些节点结构的使用分别打上a1、a2、a3的标签,这时候标签不一样就把这个节点给分成了克隆的好几个节点,就不会再出现节点冲突问题了,从而一些优化算法可以实际使用起来。从源码中,我们发现方舟编译器中对于SSA构建的用途主要在me_function和IR两个部分,me_function在IR之后,是连接后端的代码段,整体上可以看出方舟编译器是在使用了SSA能带来精确的“使用—定义”关系,另外SSA在源码中指针的静态使用上也作出了支持。
ssa

总而言之,SSA构建是方舟用于确保其他优化算法更精确、更彻底、更高效,不发生冲突的有力支持手段之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值