LLVM中的poison值和undefined值
The poison value and undefined value in LLVM
LLVM 引入了"poison value" 的概念,我一直觉得没法理解。例如,对于语句
%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
?
是的,它们在语义上应该是等价的。在查看可能导致未定义值的 LLVM IR 指令时,根据 C/C++ 来思考是很有用的。
根据 C/C++ 标准,有符号整数溢出会导致未定义的行为,Clang 通过将未定义的行为映射到有害值来进行近似。
Chris Lattner 写了一篇 series of blog posts 描述了 LLVM 中如何处理未定义的行为以及如何将其用于优化。
更新:有一个删除 undef 并且只使用毒药的新提案。您可以在 2016 LLVM Developers’ Meeting: N. Lopes "Undefined Behavior: Long Live Poison!"
在线找到有关此提案的讨论
LLVM 引入了"poison value" 的概念,我一直觉得没法理解。例如,对于语句
%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
?
是的,它们在语义上应该是等价的。在查看可能导致未定义值的 LLVM IR 指令时,根据 C/C++ 来思考是很有用的。
根据 C/C++ 标准,有符号整数溢出会导致未定义的行为,Clang 通过将未定义的行为映射到有害值来进行近似。
Chris Lattner 写了一篇 series of blog posts 描述了 LLVM 中如何处理未定义的行为以及如何将其用于优化。
更新:有一个删除 undef 并且只使用毒药的新提案。您可以在 2016 LLVM Developers’ Meeting: N. Lopes "Undefined Behavior: Long Live Poison!"
在线找到有关此提案的讨论