首页 > 解决方案 > 如何修复 llvm 寄存器增量错误?

问题描述

我一直在尝试让以下 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

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

标签: while-loopllvm-ir

解决方案


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


推荐阅读