2013-02-06 83 views
12

的LLVM語言指定的整數類型,如,其中N爲整數的比特寬度,並且範圍從1到2^23-1(根據:http://llvm.org/docs/LangRef.html#integer-typeLLVM的整數類型

我有2個問題:

  1. 當將C程序編譯到LLVM IR級別時,可以將哪些類型降低到i1,i2,i3等?似乎i8,i16,i32,i64的類型必須足夠,所以我想知道其他將近800萬個整數類型是什麼。

  2. 確實,有符號和無符號整數類型都降到了i32?這是什麼原因,爲什麼它不適用於像32位浮點數(在LLVM中表示爲f32)?

回答

15

首先,請注意兩個任意大小的整數,並且不區分有符號和無符號整數是添加到LLVM 2.0中的修改。早期版本只有幾個整數類型,帶有有符號/無符號的區別。

現在,您的問題:

  1. LLVM,但考慮到設計的C/C++,是不是針對這些語言。擁有更多可能的整數類型爲您提供更多的靈活當然,你不必使用這些類型 - 正如你所提到的,我猜測,LLVM(即Clang)的任何C/C++前端可能只會生成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可能已經成爲這些的同義詞。

+0

實際上'f32'確實存在浮點數。我問這個問題的原因是,我認爲如果有符號和無符號整數都可以用i32表示,那麼也可以用這種方式表示一個32位浮點數。我想這是你提到的一個詳細的設計決定。 –

+0

@AliJ我沒有在[浮點類型的lang參考部分](http://llvm.org/docs/LangRef.html#floating-point-types)上列出'f32'列表...除非你意味着有一個與該名稱相關的通用實現? – Oak

+3

非常感謝!碰巧,我碰到了Clang生成的兩條指令:'store i576%bla,i576 * bitcast(%class.Foo * @_Global to i576 *),align 8' and'%11 = load i384 *%10,對齊8'。我會假設它們被降低到使用SIMD類型的memcpy調用或者一系列的存儲/加載指令。 – Jens