1. 目的是识别循环中那种在每个迭代都产生相同值的计算,并将它们移到循环之外。注意,如果一个计算出现在嵌套循环内,对外循环的特定迭代而言,内循环的每个迭代都产生相同的值,但外循环的不同迭代产生不同的值,那么这种计算将移到内循环外,而非外循环外
2. 识别循环不变量可以基于数据流分析求得的use-def链,一条指令是循环不变的,当它的每个操作数满足以下条件之一
a)该操作数是常数
b)该操作数的所有到达定值在循环之外。因为若有一个在循环内,则该指令就可能是循环变化的,除非那个定值是循环不变量
c)该操作数只存在一个为循环不变量的到达定值,且该指令之前没有对其左部变量(若有)的使用。因为若有多个这样的定值,则该指令就可能是循环变化的,除非多个定值结果都一样;因为若前面有对其左部变量的使用,则该指令的赋值就杀死了左部变量的初值,这样外提后左部变量第一次迭代就会使用错误的定值
3. 由于以上条件没考虑到控制流分析,不能保证循环不变量在每个迭代中执行,以及循环不变量之左部变量的所有使用都是相同的值。因此为了保证外提后的代码行为正确,还需要满足条件:循环不变量所在基本块必须是循环中所有使用了其左部变量的基本块和所有出口基本块的必经结点。当外提循环不变量后,考虑到循环有可能执行0次即一开始就不满足循环进入条件,可以用是否进入循环的测试条件来保护前置块,即识别终止条件是否一开始就为false,来保护它。这种方法总是安全的,但增加了代码体积。不过若终止条件恒为true或false,则常数传播分析会删除这个冗余测试,如果为false,那么还会删除前置块
posted on 2023-09-06 23:30
春秋十二月 阅读(43)
评论(0) 编辑 收藏 引用 所属分类:
Compiler