Compiler errors LLVM中的毒药值和未定义值

Compiler errors LLVM中的毒药值和未定义值,compiler-errors,llvm,compiler-optimization,undef,Compiler Errors,Llvm,Compiler Optimization,Undef,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 是的,它们在语义上应该是等价的。在查看可能导致未定义值的LLVM IR指令时,从C/C++的角度考虑是很

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

是的,它们在语义上应该是等价的。在查看可能导致未定义值的LLVM IR指令时,从C/C++的角度考虑是很有用的

根据C/C++标准,有符号整数溢出会导致未定义的行为,而Clang通过将未定义的行为映射到毒药值来获得近似值

Chris Lattner写了一篇文章,描述了LLVM中如何处理未定义的行为,以及如何将其用于优化

更新:有一个新的建议,以消除未定义的,只使用毒药。您可以在以下网站上找到有关此提案的讨论: