4

LLVM は「ポイズン バリュー」という概念を導入していますが、これは私にはよくわかりません。たとえば、ステートメントの場合

%add = add nsw i32 %x, 1

%x+1最大の i32 整数より厳密に大きい場合、任意の値が %add に割り当てられます。上記のステートメント、つまり %add = add nsw i32 %x, 1は意味的に次のように記述できると主張するのは正しいですか?

if (%x+1) overflows then %add = undef else %add = add i32 %x,1

?

4

1 に答える 1

5

はい、意味的に同等である必要があります。未定義の値になる可能性のある LLVM IR 命令を調べるときは、C/C++ の観点から考えると便利です。

符号付き整数のオーバーフローは、C/C++ 標準に従って未定義の動作を引き起こし、Clang は未定義の動作を有害な値にマッピングすることで近似を行います。

Chris Lattner は、未定義の動作が LLVM でどのように処理され、最適化にどのように使用できるかを説明する一連のブログ投稿を書きました。

更新: undef を削除し、毒のみを使用するという新しい提案があります。この提案に関する講演は、2016 LLVM Developers' Meeting: N. Lopes "Undefined Behavior: Long Live Poison!"でオンラインで見つけることができます。

于 2015-12-11T09:11:42.507 に答える