使用indvars优化传递来查找llvm / opt中的规范归纳变量

时间:2012-12-12 02:06:48

标签: llvm llvm-clang

我试图在循环传递中获取循环的规范归纳变量,给定其参考L *,使用L-> getCanonicalInductionVariable()。

但我遇到的许多循环都不是规范形式。例如:

for (int i = 10; i < 20 ; i++) {
    ....
}

根据llvm文档http://llvm.org/docs/Passes.html#indvars-canonicalize-induction-variables),使用“opt”中的“indvars”传递应该通过将循环归纳变量转换为规范形式来完成。我试过跑:

opt -mem2reg -indvars < test.bc > optTest.bc

其中“test.bc”是上面for循环的位代码格式。但indvars传递似乎没有效果(我在这里省略了汇编代码,但我已经检查过了。)

稍后,使用L-&gt; getCanonicalInductionVariable()返回null。我也尝试使用“indvars”和其他传递,如“循环”,“循环简化”但无济于事。

有关如何使其发挥作用的任何想法吗?

1 个答案:

答案 0 :(得分:4)

如果您使用的是早于r153260的LLVM版本,则可以通过添加-enable-iv-rewrite命令行选项来启用归纳变量重写,并且它应该生成您希望看到的结果。

此选项自3.0起已弃用,并且在上述版本之后完全删除;没有它,通行证不会根据其文件行事。如果你现在想要这样做,那么,我认为你必须自己添加一个传递来实现它 - 尽管你当然可以使用旧的(删除的)代码作为参考。我认为它已被删除,因为(1)更多的通行证被改变为能够处理没有规范归纳变量的循环,以及(2)标准化导致其他性能影响;所以我想在添加类似的传球之前要三思而后行。