4

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

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

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 pass好像没有效果(这里我省略了汇编代码,但是我查过了)。

稍后,使用 L->getCanonicalInductionVariable() 返回 null。我也尝试过将“indvars”与“loops”、“loop-simplify”等其他通行证一起使用,但无济于事。

关于如何让它发挥作用的任何想法?

4

1 回答 1

4

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

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

于 2012-12-12T08:19:51.413 回答