-loop-unswitch: Unswitch Loops

在了解这个 pass 之前需要学习的背景知识是 Loop Transformation

Description

-loop-unswitch-licm 很接近,但是是把 loop-invariant 的 if-else branch 给提到 loop 外面。 虽然这样会让 code size 几乎 double,但是这样可以让 loop body 内重复做的 if-else branch 变成只运行一次,极大地降低了 loop penalty,进而 possibly 提升 runtime performance。

注意, -loop-unswitch expect -licm pass 已经处理过这个 code 了。

Code Example

同样,loop 相关的我们用 C code 来举例。

for(...){
    func_A();
    if(...)
        func_B();
    func_C();
}

-loop-unswitch 会把这个 code transform 成这个样子。

if(...){
    for(...){
        func_A();
        func_B();
        func_C();
    }
}
else{
    for(...){
        func_A();
        func_C();
    }
}

可以看到,确实 code size 大了很多。但是只要能降低 runtime 时候的 branch penalty,那么就是有意义的。 总而言之这个的优化思路也是让 runtime 时候的 computation 在 compile-time 里完成。