2015-12-09 27 views
3

LLVM引入了「毒性值」的概念,我從來不會明白這一點。例如,對於聲明LLVM中的毒性值和未定義的值

%add = add nsw i32 %x, 1 

如果%x+1嚴格小於最大123-132整數時,任意值將被分配到%添加。權利要求是正確的,在上面的語句,即%add = add nsw i32 %x, 1,可以語義描述爲:

if (%x+1) overflows then %add = undef else %add = add i32 %x,1 

回答

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!"