Как исправить ошибку приращения регистра llvm? - PullRequest
0 голосов
/ 08 апреля 2020

Я какое-то время пытался запустить следующий код l oop для запуска

define internal i32 @main() {
entrypoint:
  %0 = alloca i32
  store i32 0, i32* %0
  %1 = load i32, i32* %0
  %cmptmp = icmp slt i32 %1, 10
  br label %loopBody
  ret i32 0

loopBody:                                         ; preds = %loopBody, %entrypoint
  %loopCond = phi i1 [ %cmptmp, %entrypoint ], [ %cmptmp1, %loopBody ]
  %printfCall = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* 
  @0, i32 0, i32 0), i32 10)
  %2 = load i32, i32* %0
  %addtmp = add i32 %2, 1
  store i32 %addtmp, i32* %0
  %3 = load i32, i32* %0
  %cmptmp1 = icmp slt i32 %3, 10
  br i1 %cmptmp1, label %loopBody, label %AfterLoop

AfterLoop:                                        ; preds = %loopBody
  br label %entrypoint
}

Я получаю сообщение об ошибке

lli: ir.ll:20:3: error: instruction expected to be numbered '%3'
%2 = load i32, i32* %0

Нумерация команд выглядит последовательной мне. И я не вижу никаких недоступных блоков. Может ли проблема быть ветвлением ??

1 Ответ

0 голосов
/ 09 апреля 2020

Наконец-то понял. Проблема заключается в том, что у базового c блока entrypoint основной функции были две завершающие инструкции, br label %loopBody и ret i32 0, в то время как она должна иметь только одну. Это портит нумерацию регистров IRBuilder, которая называет basi c bock loopBody% 2. Затем компилятор llvm ожидает, что следующая безымянная вещь будет% 3. IRBuilder - конфликт * c.

...