LLVM语言将整数类型指定为iN,其中N是整数的位宽,范围从1到2^23-1(根据:http://llvm.org/docs/LangRef.html#integer-type http://llvm.org/docs/LangRef.html#integer-type)
我有两个问题:
当将 C 程序编译到 LLVM IR 级别时,哪些类型可以降低到 i1、i2、i3 等?看起来 i8、i16、i32、i64 类型一定足够了,所以我想知道其他近 800 万个整数类型是做什么用的。
有符号和无符号整数类型是否都降级为 i32?原因是什么?为什么它不适用于 32 位浮点数(在 LLVM 中表示为 f32)?
首先,请注意任意大小的整数以及无符号整数和无符号整数之间的区别都是 LLVM 2.0 中添加的修改。早期版本只有几种整数类型,并有符号/无符号区别。
现在,回答你的问题:
-
LLVM 虽然在设计时考虑了 C/C++,但并不特定于这些语言。拥有更多可能的整数类型可以为您提供更大的灵活性。当然,您不必使用这些类型 - 我猜测,正如您所提到的,LLVM(即 Clang)的任何 C/C++ 前端可能只会生成 i1、i8、i16、i32 和 i64 。
编辑:显然我错了,Clang 也使用了一些其他整数类型,请参阅下面 Jens 的评论。
-
是的,LLVM 不区分有符号和无符号整数类型,因此两者都会降低为 i32。但是,对无符号整数的操作将根据原始类型进行转换;例如无符号整数之间的除法将是udiv
而签署之间将是sdiv
。因为整数表示为二进制补码 http://en.wikipedia.org/wiki/Two%27s_complement但是,许多操作(例如add
)不关心签名/未签名,因此只有一个版本。
As for whyLLVM 中没有区分有符号和无符号,请阅读有关此增强请求的详细信息 http://llvm.org/bugs/show_bug.cgi?id=950- 简而言之,同时拥有签名和未签名版本会导致 IR 膨胀,并且不利于某些优化,因此被放弃。
最后你问为什么不f32
- 答案是我不知道,也许它被认为不如任意大小的整数有用。但是,请注意f32
并不是真正的描述性 - 如果您想要任意浮点类型,您至少需要指定基数的大小和指数的大小,例如f23e8
代替float
and f52e11
代替double
。如果你问我的话,这有点麻烦,但我想float
and double
可以成为这些的同义词。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)