当我尝试使用我的example.ll文件时,我收到此消息:
llc: example.ll:12:29: error: expected value token
%1 = icmp slt i1 %cmptmp, i16 0
^
example.ll文件:
; ModuleID = 'modulle'
define i16 @main() {
entry:
%x = alloca i16
store i16 2, i16* %x
br label %loop_condition
loop_condition: ; preds = %loop, %entry
%0 = load i16, i16* %x
%cmptmp = icmp sgt i16 %0, 1
%1 = icmp slt i1 %cmptmp, i16 0
br i1 %1, label %loop, label %while_continue
loop: ; preds = %loop_condition
br label %loop_condition
while_continue: ; preds = %loop_condition
ret i16 0
}
当我删除 i16 时,一切正常,但我不知道为什么LLVM会在我的代码中插入它。有人知道这是什么问题吗?
---更新---
.ll输出来自我的玩具编译器。这是行 11 和 12 :
的代码Value *cond = llvm::CmpInst::Create(llvm::Instruction::ICmp, llvm::CmpInst::ICMP_SLT, binRelOpCond, llvm::ConstantInt::get(llvm::getGlobalContext(), llvm::APInt(16, 0, true)), "", codeGenContext.getBlock());
其中 binRelOpCond 变量为:
CmpInst *compareRes = CmpInst::Create(Instruction::ICmp, CmpInst::ICMP_SGT, left, right, "cmptmp", codeGenContext.getBlock());
感谢。
答案 0 :(得分:1)
该ll文件格式错误。 icmp
的语法没有每个操作数的类型,只有两种类型:
<result> = icmp <cond> <ty> <op1>, <op2>
查看您在生成ll的评论中添加的代码,错误与llvm::APInt(16, 0, true)
一致 - 您明确创建了i16
类型的常量,但您只能与类型为i1
的常量%cmptmp
类型。我不知道为什么没有断言可以解决这个问题。