其他分享
首页 > 其他分享> > 【编译原理笔记18】代码优化:活跃变量分析,可用表达式分析

【编译原理笔记18】代码优化:活跃变量分析,可用表达式分析

作者:互联网

本次笔记内容:
8-8 活跃变量分析
8-9 可用表达式分析

本节课幻灯片,见于我的 GitHub 仓库:第18讲 代码优化_3.pdf

文章目录

活跃变量分析

活跃变量

对于变量x和程序点p,如果在流图中沿着从p开始的某条路径会引用变量xp点的值,则称变量x在点p是活跃(live)的,否则称变量x在点p不活跃(dead)。

例:各基本块的出口处的活跃变量


有再次定值(且定值与本身无关),则不活跃。

活跃变量信息的主要用途

删除无用赋值:

为基本块分配寄存器:

活跃变量的传递函数

逆向数据流问题: I N [ B ] = f B ( O U T [ B ] ) IN[B] = f_B(OUT [B]) IN[B]=fB​(OUT[B])

f B ( x ) = u s e B ∪ ( x − d e f B ) f_B (x) = use_B \cup(x-def_B) fB​(x)=useB​∪(x−defB​)

例:各基本块B的use_B和def_B


如上依次构建各表达式的 u s e use use 与 d e f def def 集合,很直观。

活跃变量数据流方程

I N [ B ] IN[B] IN[B]:在基本块B的入口处的活跃变量集合;
O U T [ B ] OUT[B] OUT[B]:在基本块B的出口处的活跃变量集合。

u s e B use_B useB​和 d e f B def_B defB​的值可以直接从流图计算出来,因此在方程中作为已知量

计算活跃变量的迭代算法


如上,依次迭代,得到最后的 I N [ B ] IN[B] IN[B]和 O U T [ B ] OUT[B] OUT[B]。

由 OUT 值,得到各个基本块的活跃变量。结果与人工分析的结果一致。

定值-引用链(Definition-Use Chains)

可用表达式分析

可用表达式:

表达式可用的直观意义:

可用表达式信息的主要用途

可用表达式的传递函数

对于可用表达式数据流模式而言,如果基本块B对x或者y进行了(或可能进行)定值,且以后没有重新计算x op y,则称B杀死表达式x op y。如果基本块B对x op y进行计算,并且之后没有重新定值x或y,则称B生成表达式x op y。

f B ( x ) = e _ g e n B ∪ ( x − e _ k i l l B ) f_B(x)= e\_gen_B \cup(x- e\_kill_B) fB​(x)=e_genB​∪(x−e_killB​)

e_gen_B的计算


如上,最终得到的集合是空集。

e_kill_B的计算

可用表达式的数据流方程


e _ g e n B e\_gen_B e_genB​ 和 e _ k i l l B e\_kill_B e_killB​ 的值可以直接从流图计算出来,因此在方程中作为已知量

计算可用表达式的迭代算法


输入:流图 G G G ,其中每个基本块B的 e _ g e n B e\_gen_B e_genB​ 和 e _ k i l l B e \_kill_B e_killB​ 都已计算出来。

为什么将OUT[B]集合初始化为U?

标签:分析,活跃,变量,18,基本块,定值,代码优化,表达式,OUT
来源: https://blog.51cto.com/u_15279775/2936195