如何修复 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 %loopBody
和 ret i32 0
,同时它应该只有一个。这与命名基本块 loopBody
%2 的 IRBuilder 寄存器编号混淆。然后 llvm 编译器期望下一个未命名的东西是 %3。 IRBuilder -- llc 冲突。
我一直在尝试将以下 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 %loopBody
和 ret i32 0
,同时它应该只有一个。这与命名基本块 loopBody
%2 的 IRBuilder 寄存器编号混淆。然后 llvm 编译器期望下一个未命名的东西是 %3。 IRBuilder -- llc 冲突。