22

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

我有两个问题:

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

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

4

1 回答 1

26

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

现在,针对您的问题:

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

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

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

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

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

于 2013-02-06T07:43:55.063 回答