LLVM语言将整数类型指定为iN,其中N是整数的位宽,范围从1到2 ^ 23-1(根据:http://llvm.org/docs/LangRef.html#integer-type)
我有两个问题:
将C程序编译为LLVM IR级别时,可以将哪些类型降低到i1,i2,i3等?看起来类型i8,i16,i32,i64必须足够,所以我想知道所有其他近800万个整数类型的用途。
有符号和无符号整数类型都降低到i32吗?是什么原因,为什么它不适用于32位浮点数(在LLVM中表示为f32)?
答案 0 :(得分:19)
首先,要注意任意大小的整数,并且对有符号和无符号整数之间的区别是对LLVM 2.0的修改。早期版本只有几种整数类型,具有签名/无符号区别。
现在,问题:
LLVM虽然在设计时考虑了C / C ++,但并不特定于这些语言。拥有更多可能的整数类型可以提供更多灵活性当然,你不必使用这些类型 - 我猜你正如你所提到的那样,LLVM(即Clang)的任何C / C ++前端都可能只生成i1,i8,i16,i32和i64
编辑:显然我错了,Clang确实使用了其他一些整数类型,请参阅下面的Jens评论。
是的,LLVM没有对有符号和无符号整数类型进行区分,因此两者都将降低到i32。但是,对无符号整数的操作将根据原始类型进行转换;例如无符号整数之间的除法将为udiv
,而签名之间的除法将为sdiv
。但是,由于整数表示为two's complement,因此许多操作(例如add
)不关心有符号/无符号,因此只有一个版本。
至于为什么在签名和未签名之间没有区分LLVM,请阅读the details on this enhancement request - 简而言之,签名和签名版本都会导致大量的IR膨胀并且对一些优化,所以它被删除了。
最后,你问为什么没有f32
- 答案是我不知道,也许它被认为不如任意大小的整数有用。但是,请注意f32
并不是真正的描述性 - 如果你想要任意浮点类型,你至少需要指定基数的大小和指数的大小,比如f23e8
而不是float
f52e11
和double
代替float
。如果你问我,这有点麻烦,虽然我猜double
和{{1}}可能与那些同义词。