我想自动将简单的嵌套循环重写为非嵌套循环。
例如,我有以下代码:
if (y >= 0)
{
while (x>y)
{
x -= y+1;
for (z=y; z>0; z--) /* nothing */;
}
}
我想要一些 llvm魔法发生,使它变成:
if (y >= 0)
{
bool outer = true;
while (x>y)
{
if (outer) { z = y; }
if (z > 0) { z--; outer = false; }
else { x-= y+1; outer = true; }
}
}
我是否过于乐观地认为存在这样的通行证?
我试着写
opt --help > /tmp/passes.txt && grep "loop" /tmp/passes.txt
但是有太多的循环传递我不知道从哪里开始。
最佳答案
这种优化称为循环融合。我还没有尝试过你的代码,但 Polly 应该能够融合这样的循环。 Polly 是 LLVM 附带的多面体编译器框架,但默认情况下它应该使用 LLVM 构建。如果没有,那么你需要通过 -DLLVM_POLLY_BUILD:BOOL=ON
cmake 使用 llvm 构建 polly。
这是有关如何使用 clang/llvm 调用 polly 优化的文档。
https://polly.llvm.org/docs/UsingPollyWithClang.html#optimizing-with-polly
关于llvm 传递给扁平化(一些)嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60204759/