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パスは効果がないようです(ここではアセンブリコードを省略しましたが、チェックしました)。

後で、L-> getCanonicalInductionVariable()を使用するとnullが返されます。また、「loops」、「loop-simplify」などの他のパスで「indvars」を使用してみましたが、役に立ちませんでした。

これを機能させる方法について何かアイデアはありますか?

4

1 に答える 1

4

r153260 より前のバージョンの LLVM を使用している場合は、-enable-iv-rewriteコマンド ライン オプションを追加して帰納変数の書き換えを有効にできます。期待どおりの結果が生成されるはずです。

このオプションは 3.0 以降非推奨であり、上記のバージョン以降は完全に削除されています。それがないと、パスはそのドキュメントに従って動作しません。今すぐやりたい場合は、パスを追加して自分で実装する必要があると思いますが、もちろん古い(削除された)コードを参照として使用できます。(1) 正規誘導変数なしでループを処理できるように、より多くのパスが変更され、(2) 正規化が他のパフォーマンスへの影響をもたらしたため、削除されたと思います。そのため、同様のパスを追加する前によく考えた方が賢明だと思います。

于 2012-12-12T08:19:51.413 に答える