LLVM 的整数类型



LLVM 语言将整数类型指定为 iN,其中 N 是整数的位宽,范围从 1 到 2^23-1(根据:http://llvm.org/docs/LangRef.html#integer-type(

我有两个问题:

  1. 当将C程序编译到LLVM IR级别时,哪些类型可以降低到i1,i2,i3等?似乎 i8、i16、i32、i64 类型必须足够了,所以我想知道所有其他近 800 万个整数类型是干什么用的。

  2. 有符号和无符号整数类型都降低到 i32 是真的吗?这是什么原因,为什么它不适用于 32 位浮点数(在 LLVM 中表示为 f32(之类的东西?

首先,请注意,任意大小的整数以及有符号和无符号整数之间的区别都是添加到LLVM 2.0中的修改。早期版本只有少数整数类型,具有有符号/无符号的区别。

现在,针对您的问题:

  1. LLVM虽然在设计时考虑了C/C++,但并不是特定于这些语言的。拥有更多可能的整数类型可为您提供更大的灵活性。当然,您不必使用这些类型 - 我猜,正如您提到的,LLVM(即 Clang(的任何 C/C++ 前端可能只会生成 i1、i8、i16、i32 和 i64。

    编辑:显然我错了,Clang 也确实使用了其他一些整数类型,请参阅下面的 Jens。

  2. 是的,LLVM 不区分有符号和无符号整数类型,因此两者都将降低到 i32。但是,对无符号整数的操作将根据原始类型进行转换;例如,无符号整数之间的除法将被udiv而有符号整数之间的划分将被sdiv。但是,由于整数表示为二进制补码,因此许多操作(例如 add (不关心已签名/未签名,因此只有一个版本。

    至于为什么在LLVM中没有区分有符号和无符号,请阅读此增强请求的详细信息 - 简而言之,同时具有签名和未签名版本会导致大量的IR膨胀,并且不利于某些优化,因此它被删除了。

    最后,你问为什么没有f32——答案是我不知道,也许它被认为不如任意大小的整数有用。但是,请注意,f32并不是真正的描述性 - 如果你想要任意浮点类型,你至少需要指定基数的大小和指数的大小,比如 f23e8 而不是 floatf52e11 而不是 double 。如果你问我,这有点麻烦,尽管我想floatdouble可以成为这些的代名词。

相关内容

  • 没有找到相关文章

最新更新