22

LLVM 言語は整数型を iN として指定します。N は整数のビット幅で、範囲は 1 から 2^23-1 です ( http://llvm.org/docs/LangRef.html#integer-タイプ

2 つの質問があります。

  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(つまりClang)へのC / C ++フロントエンドはおそらくi1、i8、i16、i32、およびi64のみを生成すると思います.

    編集:明らかに私は間違っており、Clang は他の整数型も使用しています。以下の Jens のコメントを参照してください。

  2. はい、LLVM は符号付き整数型と符号なし整数型を区別しないため、どちらも i32 に下げられます。ただし、符号なし整数の操作は、元の型に従って変換されます。たとえば、符号なし整数間の除算は になりますが、符号付き整数間の除算はudivになりますsdiv。ただし、整数は2 の補数として表されるため、多くの操作 ( などadd) は符号付き/符号なしを気にせず、1 つのバージョンしかありません。

    LLVM で署名付きと未署名の区別がなされなかった理由については、この拡張要求の詳細をお読みください要するに、署名付きバージョンと署名なしバージョンの両方を使用すると、IR が大きく膨張し、いくつかの最適化に悪影響を及ぼしたため、削除されました。

    最後に、なぜいいえかを尋ねますf32。答えはわかりません。おそらく、任意のサイズの整数よりも有用性が低いと見なされたのでしょう。ただし、これはあまり説明的ではないことに注意してf32ください。任意の浮動小数点型が必要な場合は、少なくとも基数のサイズと指数のサイズを指定する必要がありf23e8ます。あなたが私に尋ねると、それは少し面倒ですが、私は推測し、それらと同義にすることができたかもしれません.floatf52e11doublefloatdouble

于 2013-02-06T07:43:55.063 に答える