如何修复 llvm 寄存器增量错误?

How to fix llvm register increment error?

我一直在尝试将以下 ir 循环一段时间 运行

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

指令编号对我来说似乎是一致的。而且我没有看到任何无法访问的块。问题可能是分支吗??

终于明白了。问题是 main 函数的基本块 entrypoint 有两个终止指令,br label %loopBodyret i32 0,同时它应该只有一个。这与命名基本块 loopBody %2 的 IRBuilder 寄存器编号混淆。然后 llvm 编译器期望下一个未命名的东西是 %3。 IRBuilder -- llc 冲突。