-loop-extract: Extract Loops into New Functions

Description

-loop-extract pass 做的事是把一个 function 中的 top-level 的 loop 给 extract 出来,然后变成一个新的 function。 所谓 top-level 的 loop 指最外层的 loop。 如果这个 function 仅有这一个 loop 组成,这相当于已经被 extract 好了,所以就不再 touch。 这个 pass 看起来和 performance optimization 没什么关系,事实上也确实没什么关系。 这个 pass 其实就是在 debug phase 的 setting up bugpoints 的时候才有用。

还有一个 pass 叫, -loop-extract-single , 它和 -loop-extract 做的事非常接近,就不单开一个新 page 说了。

Code Example

这个例子用 LLVM IR 不太直观,所以我用一个 C 的小例子来解释一下。

原始的 C code。

int yafan(int yafan_paper_count) {
    for(int i=0; i<100; i++) // Most outter loop in function
        for(int j=0; j<100; j++)
            yafan_paper_count++;
    yafan_paper_count ++;
    return yafan_paper_count;
}

-loop-extract transform 过的 C code。

int yafan(int yafan_paper_count) {
    yafan_paper_count = shihui(yafan_paper_count);
    yafan_paper_count ++;
    return yafan_paper_count;
}

int shihui(int shihui_paper_count) { // extract this loop to a new function
    for(int i=0; i<100; i++)
        for(int j=0; j<100; j++)
                shihui_paper_count++;
    return shihui_paper_count;
}

可以看到其实就是把 function 里的 outer loop 给 extract 成一个新的 function 了,这个 transformation 甚至会让速度变慢很多(增加了无数个 function call)。 但是无所谓,反正是 bugpoint 才用的,不考虑 performance。