LLVM assembly: присваивать целочисленную константу для регистрации

Я пишу компилятор, который использует LLVM в качестве бэкэнд, а мой компилятор генерирует следующий код сборки LLVM

@0 = private constant [25 x i8] c"Hello World to %dntegers\00"

declare void @printf (i8*, i32)

define void @main () {
  %1 = getelementptr [25 x i8]* @0, i32 0, i32 0
  %2 = 1
  tail call void @printf(i8* %1, i32 %2)
  ret void
}

Но я получаю следующую ошибку:

c.ll:8:8: error: expected instruction opcode
  %2 = 1
       ^

Документация показывает такие примеры.

Вы знаете, как заставить это работать? В настоящее время я использую вместо этого:

  %2 = add i32 0, 1 ; FIXME

Ответ 1

См. обсуждение LLVMdev "Как назначить константу регистру?" Как указывалось Duncan Sands:

Позвольте мне сказать, что в целом делать это бессмысленно. Из-за формы SSA, если значение% x установлено равным 5, вы не можете установить его на что-то еще позже. Таким образом, везде, где вы используете% x, вы можете просто использовать 5 вместо этого. Обычная ситуация заключается в том, что у вас есть регистр% x, и из-за выполнения оптимизации вы обнаруживаете, что на самом деле% x всегда будет иметь значение 5. Вы можете использовать RAUW (иначе метод replaceAllUsesWith), чтобы заменить% x на 5 везде.

Нить создала пару альтернатив прямому использованию константы:

  • Используйте alloca, чтобы получить указатель, сохранить его, а затем загрузить значение по мере необходимости.
  • Создайте глобальное указание на константу, затем загрузите это значение по мере необходимости.

Кто-то отметил, что подход alloca закончится использованием реестра после оптимизации.

Независимо от того, что использование константы непосредственно, как было предложено @SK-logic, кажется самым чистым решением.

Ответ 2

% 1 unnamed. Вместо этого используйте% name_here.