Ali*_*i J 17 types llvm llvm-codegen
LLVM语言将整数类型指定为iN,其中N是整数的位宽,范围从1到2 ^ 23-1(根据:http://llvm.org/docs/LangRef.html#integer-型)
我有两个问题:
将C程序编译为LLVM IR级别时,可以将哪些类型降低到i1,i2,i3等?看起来类型i8,i16,i32,i64必须足够,所以我想知道所有其他近800万个整数类型是什么.
将有符号和无符号整数类型都降低到i32是真的吗?是什么原因,为什么它不适用于32位浮点数(在LLVM中表示为f32)?
Oak*_*Oak 22
首先,要注意任意大小的整数,并且对有符号和无符号整数之间的区别是对LLVM 2.0的修改.早期版本只有几个整数类型,具有签名/无符号区别.
现在,问你的问题:
LLVM虽然在设计时考虑了C/C++,但并不特定于这些语言.拥有更多可能的整数类型可以提供更多灵活性 当然,你不必使用这些类型 - 我猜你正如你所提到的那样,LLVM的任何C/C++前端(即Clang)可能只生成i1,i8,i16,i32和i64 .
编辑:显然我错了,Clang也使用了其他一些整数类型,请参阅下面的Jens的评论.
是的,LLVM没有对有符号和无符号整数类型进行区分,因此两者都将降低到i32.但是,对无符号整数的操作将根据原始类型进行转换; 例如,无符号整数之间的划分将udiv在签名之间进行sdiv.因为整数表示为两个补码,但许多操作(例如add)不关心有符号/无符号,因此只有一个版本.
至于为什么在有符号和无符号之间没有对LLVM进行区分,请阅读有关此增强请求的详细信息 - 简而言之,签名和无符号版本都会导致大量的IR膨胀并且对某些优化有害,因此它被删除了.
最后,你问为什么不f32- 答案是我不知道,也许它被认为没有比任意大小的整数有用.但是,请注意f32并非真正描述性 - 如果您需要任意浮点类型,则至少需要指定基数的大小和指数的大小,f23e8而不是代替float而f52e11不是double.如果你问我这有点麻烦,虽然我猜float并且double本来可以成为同义词.