1

アドレスのすべてのインスタンスを定数に置き換えようとしています。

次のようにストアのアドレスを取得してテストしています(iは命令です)

//already know it's a store instruction at this point
llvm::Value *addy = i->getOperand(0);
if(llvm::ConstantInt* c = dyn_cast<llvm:::ConstantInt>(addy)){
   //replace all uses of the address with the constant
   //operand(1) will be the address the const would be stored at
   i->getOperand(1)->replaceAllUsesWith(c);
}

これでうまくいくと思いますが、エラーが発生しています

"Assertion: New->getType()== getType() && replaceAllUses of value with new value of different type!" failed

理由はわかりません... 私のreplaceAllUsesの理解は、アドレス(i-> getOperand(1))の使用を定数で置き換えるということです?

4

1 に答える 1

2

エラー メッセージは単純明快です。新しい値の型が、置き換えようとしている古い値の型と同じではありません。

LLVM IR は厳密に型指定されており、言語リファレンスでわかるように、すべての命令には、各オペランドとして期待される特定の型があります。たとえばstore、アドレスの型は常に格納される値の型へのポインターである必要があります。

その結果、値の使用法を置き換えるときはいつでも、最初にそれらが両方とも同じ型であることreplaceAllUsesWithを確認する必要があります。実際には、ご覧のとおり、それを検証するためのアサートがあり、失敗しました。理由も簡単にわかります。ストア命令のオペランド 1 は常に何らかのポインター型であり、a はConstantInt常に何らかの整数型を表しているため、一致することはありません。

正確に何を達成しようとしていますか?loadおそらく、そのストアの各住所を定数の使用法に置き換えることを考えているのでしょうか? その場合、そのアドレスを使用するすべての s を自分で見つける必要がありload、それらのそれぞれについて (アドレスではなく、ロードごとに)replaceAllUsesWith定数を使用して実行する必要があります。ちなみに、これらのことを行うことができる標準の LLVM パスがあります。パス リストを確認してください。mem2reg に続いて一定の伝播パスがこれを処理すると推測しています。

于 2013-04-29T03:45:33.803 に答える