Подтвердить что ты не робот

Целочисленные типы LLVM

Язык LLVM задает целочисленные типы как iN, где N - битовая ширина целого числа и составляет от 1 до 2 ^ 23-1 (Согласно: http://llvm.org/docs/LangRef.html#integer-type)

У меня есть 2 вопроса:

  • При компиляции программы на C до уровня LLVM IR, какие типы могут быть снижены до i1, i2, i3 и т.д.? Кажется, что типов i8, i16, i32, i64 должно быть достаточно, поэтому мне было интересно, для чего все остальные около 8 миллионов целых типов.

  • Верно ли, что как подписанные, так и беззнаковые целочисленные типы опускаются до i32? В чем причина этого и почему это не относится к чему-то вроде 32-битного float (который представлен как f32 в LLVM)?

4b9b3361

Ответ 1

Прежде всего, обратите внимание на целые числа произвольного размера, и никакое различие между целыми числами без имени и без знака - это изменения, добавленные в LLVM 2.0. Более ранние версии имели только несколько целочисленных типов с обозначением/без знака.

Теперь, на ваши вопросы:

  • LLVM, хотя он разработан с учетом C/С++, не относится к этим языкам. Наличие более возможных целых типов дает вам большую гибкость. Конечно, вам не обязательно использовать эти типы - и я предполагаю, что, как вы уже упоминали, любой интерфейс C/С++ для LLVM (то есть Clang), вероятно, будет генерировать только i1, i8, i16, i32 и i64.

    Редактирование: видимо, я ошибаюсь, и Клэнг также использует некоторые другие целочисленные типы, см. комментарий Йенса ниже.

  • Да, LLVM не делает различий между целым типом signed и unsigned, поэтому оба они будут опущены на i32. Однако операции с целым числом без знака будут переведены в соответствии с исходным типом; например разделение между целыми без знака будет udiv, а между подписанными будет sdiv. Поскольку целые числа представлены как два дополнения, однако многие операции (например, add) не заботятся о подписанных/неподписанных и поэтому имеют только одну версию.

    Что касается того, почему в LLVM между подписанным и неподписанным не было различий, прочитайте информацию об этом расширенном запросе - короче говоря, наличие как подписанных, так и неподписанных версий привело к большой ИК-раздув и был вреден для некоторых оптимизаций, поэтому он был удален.

    Наконец, вы спрашиваете, почему нет f32 - ответ заключается в том, что я не знаю, возможно, это было менее полезно, чем целые числа произвольного размера. Однако обратите внимание, что f32 на самом деле не описательно - если вам нужны произвольные типы с плавающей точкой, вам нужно как минимум указать размер базового номера и размер экспоненты, например f23e8 вместо float и f52e11 вместо double. Это немного громоздко, если вы спросите меня, хотя я думаю, что float и double могли быть сделаны синонимами.