llvm 传递给扁平化(一些)嵌套循环

标签 llvm nested-loops

我想自动将简单的嵌套循环重写为非嵌套循环。
例如,我有以下代码:

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/

相关文章:

c++ - 如何从 LLVM 中的 CallInst 获取函数名称?

ios - Apple 的 LLVM 中的优化错误,还是代码中的错误?

php - while 循环在另一个 while 循环中只运行一次

llvm - llvm 代码中出现的 %"alloca point"行的目的是什么?

llvm 内联 channel 不起作用

c++ - Clang/LLVM中的CodeModel指的是什么?

angularjs - ng-repeat 用于 3 级以上的深度层次结构

c# - 连接3个单词列表

python - 如何使嵌套的 for 循环更 Pythonic

c - 使用生成的数组制作表格 C 编程