【问题标题】:LLVM's integer typesLLVM 的整数类型
【发布时间】:2013-01-21 07:47:01
【问题描述】:

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)?

【问题讨论】:

    标签: types llvm llvm-codegen


    【解决方案1】:

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

    现在,回答您的问题:

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

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

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

      至于为什么在 LLVM 中没有区分有符号和无符号,请阅读 the details on this enhancement request - 简而言之,有符号和无符号版本会导致 IR 膨胀并且不利于某些优化,所以它被丢弃了。

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

    【讨论】:

    • 其实f32 确实存在浮点数。我问它的原因是我认为如果有符号和无符号整数都可以用 i32 表示,那么也许 32 位浮点数也可以用这种方式表示。我想这是您提到的详细设计决策。
    • @AliJ 我没有看到f32 列在the lang ref section on floating-point types... 除非您的意思是有一个与该名称相关的通用实现?
    • 谢谢!碰巧,我刚刚遇到了 Clang 生成的两条指令:store i576 %bla, i576* bitcast (%class.Foo* @_Global to i576*), align 8%11 = load i384* %10, align 8。我会假设这些被降低为memcpy 调用或使用 SIMD 类型的存储/加载指令的智能序列。
    猜你喜欢
    • 2016-07-09
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    相关资源
    最近更新 更多