zel*_*ell 4 compiler-errors undef llvm compiler-optimization
LLVM 引入了“毒值”的概念,我一直都不敢肯定理解。例如,对于语句
%add = add nsw i32 %x, 1
Run Code Online (Sandbox Code Playgroud)
如果%x+1严格大于最大的 i32 整数,则将任意值分配给 %add。声称上面的语句,即 %add = add nsw i32 %x, 1,可以在语义上描述为:
if (%x+1) overflows then %add = undef else %add = add i32 %x,1
Run Code Online (Sandbox Code Playgroud)
?
是的,它们在语义上应该是等价的。在查看可能导致未定义值的 LLVM IR 指令时,从 C/C++ 的角度思考很有用。
根据 C/C++ 标准,有符号整数溢出会导致未定义的行为,而 Clang 通过将未定义的行为映射到毒值来进行近似。
Chris Lattner 撰写了一系列博客文章,描述了 LLVM 中如何处理未定义行为以及如何将其用于优化。
更新:有一个新的提议来删除 undef 并只使用毒药。您可以在2016 年 LLVM 开发人员会议上找到有关此提案的在线讨论:N. Lopes “未定义行为:毒药万岁!”
| 归档时间: |
|
| 查看次数: |
2304 次 |
| 最近记录: |