llc - 期望值令牌错误

时间:2016-09-03 19:39:28

标签: llvm

当我尝试使用我的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());

感谢。

1 个答案:

答案 0 :(得分:1)

该ll文件格式错误。 icmp的语法没有每个操作数的类型,只有两种类型:

<result> = icmp <cond> <ty> <op1>, <op2>

查看您在生成ll的评论中添加的代码,错误与llvm::APInt(16, 0, true)一致 - 您明确创建了i16类型的常量,但您只能与类型为i1的常量%cmptmp类型。我不知道为什么没有断言可以解决这个问题。