Skip to content

Loop Optimization

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

Chapter18.pdf

image-20250614183547405

Dominators

必经节点

image-20250614184350300

s0 是入口节点

Finding Dominator

image-20250614184412343

定理:必经节点是有序的

image-20250614184718550

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

Dominator Tree

image-20250614185128296

Natural Loops

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

image-20250614190547981

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

image-20250614191637929

Nested Loop

image-20250614191653015

Loop-Nest Tree

image-20250614191715976

image-20250614191726002

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

Loop Preheader

image-20250614192008017

Loop-Invariant Computations

image-20250614192301286

例子

image-20250614192650425

第二个不行的原因是这个语句不一定会被执行

第三个是循环内 t 有多个赋值语句

第四个是循环内在赋值前有被用到

image-20250614193000462

针对 while 循环需要改一下:

image-20250614193359423

Induction Variables

image-20250614193817334

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

Linear Induction Variable

image-20250614194159232

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

下图是用归纳变量优化的例子

image-20250614194301860

Detection of Induction Variables

相关定义如下

image-20250614194408297

Strength Reduction

将乘法转化为加法

image-20250614194718244

Chapter18.pdf 27 页有例子

Elimination

image-20250614195029403

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

Rewriting Comparisons

image-20250614195101899

Chapter18.pdf 34 例子

Array-Bounds Checks

编译器会插入检查数组越界的指令,但很多是冗余的,我们想减少冗余

不用学

Loop Unrolling

可能 body 小,导致条件判断占大头,我们就试着一次执行多次 body

image-20250614195627397

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

不用学