llvm传递以展平(某些)嵌套循环

llvm传递以展平(某些)嵌套循环,llvm,nested-loops,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 (oute

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

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/passs.txt&&grep“loop”/tmp/passs.txt

但是有太多的循环过程,我不知道从哪里开始。

这种优化称为循环融合。我还没有试过你的代码,但波利应该能够融合这样的循环。Polly是LLVM附带的多面体编译器框架,但默认情况下它应该使用LLVM构建。如果没有,那么您需要将
-DLLVM\u POLLY\u BUILD:BOOL=ON
传递给cmake以使用llvm构建POLLY

下面是关于如何使用clang/llvm调用polly优化的文档


您想拥有一个不删除nop循环的通行证吗?找出是否有任何电流通过都应该很简单,只需使用合适的主体在输入上依次运行每个过程,然后查看循环中哪些通过了某一行。一个长的sh行就可以了,沿着in$(opt--help | awk'/--/{print$1})的
行;不要选择$a…| grep-q…| echo$a;完成
@arnt,grep-q…中的模式是什么?我怎么知道内部循环不再存在?我应该寻找什么?模式是与循环中的一条线匹配的模式,例如相关基本块的标签。您可以控制输入IR,因此创建合适的名称应该很容易。grep-q | | echo打印过程的名称,前提是该过程删除了该模式(扩展为基本块)。