while-loop - 如何修复 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
指令编号对我来说似乎是一致的。而且我没有看到任何无法访问的块。问题可能是分支?
解决方案
终于明白了。问题是 main 函数的基本块entrypoint
有两个终止指令,br label %loopBody
同时ret i32 0
它应该只有一个。loopBody
这与命名基本块%2的 IRBuilder 寄存器编号相混淆。llvm 编译器然后期望下一个未命名的东西是 %3。IRBuilder——有限责任公司冲突。
推荐阅读
- android - FCM 在被杀时向 Chrome 推送通知
- python - 如何从 Matplotlib 中的两个轴取消设置“sharex”或“sharey”
- deepsecurity - 受设备保护的 vm 的策略(又名配置文件)分配和激活
- python - 列表的条件概率,后跟另一个术语 NLTK
- azure - Azure Cognitives 服务语音转文本重读西班牙语
- docker - 将无人机 8.5 构建到容器中失败,“没有这样的文件或目录”
- tableau-api - 如何在表格中做一个计算字段,受访者可以选择多个种族?
- r - R:每行最大值对应的索引
- c# - WCF 服务中的内存不足异常
- javascript - JQuery自动完成后获取ID的值