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
答案 0 :(得分:4)
是的,它们在语义上应该是等价的。在查看可能导致未定义值的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!"
在线查找有关此提案的演讲