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 开发者会议上在线找到有关此提案的演讲:N. Lopes “未定义行为:毒药万岁!”

于 2015-12-11T09:11:42.507 回答