Loop Optimization
:material-circle-edit-outline: 约 372 个字 :material-clock-time-two-outline: 预计阅读时间 1 分钟

Dominators
必经节点

s0 是入口节点
Finding Dominator

定理:必经节点是有序的

idom 即离 n 最近的非 n 必经节点
Dominator Tree

Natural Loops
我们关心一个 loop 有几个入口节点

这里 1234 就是 4-1 这个回边的自然循环

Nested Loop

Loop-Nest Tree


注意结点有两行,第一行是头节点,第二行是其它结点
Loop Preheader

Loop-Invariant Computations

例子

第二个不行的原因是这个语句不一定会被执行
第三个是循环内 t 有多个赋值语句
第四个是循环内在赋值前有被用到

针对 while 循环需要改一下:

Induction Variables

这样省去了访问 i 导致的开销
Linear Induction Variable

这里 i 就不是线性归纳变量,因为两个循环体 i 的变化不一样
下图是用归纳变量优化的例子

Detection of Induction Variables
相关定义如下

Strength Reduction
将乘法转化为加法

Chapter18.pdf 27 页有例子
Elimination

注意语句的删除可能会产生新的无用变量
Rewriting Comparisons

Chapter18.pdf 34 例子
Array-Bounds Checks
编译器会插入检查数组越界的指令,但很多是冗余的,我们想减少冗余
不用学
Loop Unrolling
可能 body 小,导致条件判断占大头,我们就试着一次执行多次 body

但很明显,如果循环次数是基数词,示例的两次 body 做法就有问题,所以要额外检查奇数词
不用学