Types LLVM&x27;s整数类型

Types LLVM&x27;s整数类型,types,llvm,llvm-codegen,Types,Llvm,Llvm Codegen,LLVM语言指定的整数类型如中所示,其中N是整数的位宽度,范围从1到2^23-1(根据:) 我有两个问题: 当将C程序编译到LLVM IR级别时,哪些类型可以降低到i1、i2、i3等?似乎i8、i16、i32、i64类型就足够了,所以我想知道其他近800万个整数类型都是干什么用的 有符号和无符号整数类型都降低到i32是真的吗?原因是什么,为什么它不适用于32位浮点(在LLVM中表示为f32)之类的东西 首先,请注意任意大小的整数以及无符号整数和有符号整数之间的区别都是添加到LLVM 2.0中的修

LLVM语言指定的整数类型如中所示,其中N是整数的位宽度,范围从1到2^23-1(根据:)

我有两个问题:

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

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


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

    现在,请回答您的问题:

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

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

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

    至于为什么在LLVM中没有区分有符号和无符号,简而言之,有符号和无符号版本都会导致大量IR膨胀,并且不利于某些优化,所以它被删除了

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


  • 实际上,对于浮点数,
    f32
    确实存在。我问这个问题的原因是,我认为如果有符号和无符号整数都可以用i32表示,那么32位浮点也可以用这种方式表示。我想这是你提到的一个详细的设计决定。@AliJ我没有看到
    f32
    列在。。。除非您的意思是有一个与该名称相关联的通用实现?谢谢!碰巧,我遇到了Clang生成的两条指令:
    storei576%bla,i576*比特广播(%class.Foo*@_globalto i576*),align 8
    %11=加载i384*%10,align 8
    。我假设它们被降低为
    memcpy
    调用或使用SIMD类型的smartish存储/加载指令序列。