llc:LLVM错误:无法选择:

llc:LLVM错误:无法选择:,llvm,Llvm,llc给了我以下错误: LLVM错误:无法选择:t20:i8,ch=load t0,帧索引:i16,未定义:i16 t1:i16=帧索引 t3:i16=未定义 在功能中:主 这是prg.ll文件的内容: ; ModuleID = 'new_module' define i16 @main() { entry: %x = alloca i1 store i1 true, i1* %x %0 = load i1, i1* %x %relation_op = icmp eq i1

llc
给了我以下错误:

LLVM错误:无法选择:t20:i8,ch=load t0,帧索引:i16,未定义:i16
t1:i16=帧索引
t3:i16=未定义
在功能中:主

这是
prg.ll
文件的内容:

; ModuleID = 'new_module'

define i16 @main() {
entry:
  %x = alloca i1
  store i1 true, i1* %x
  %0 = load i1, i1* %x
  %relation_op = icmp eq i1 %0, true
  br i1 %relation_op, label %then, label %else

then:                                             ; preds = %entry
  store i1 false, i1* %x
  br label %ifcont3

else:                                             ; preds = %entry
  %1 = load i1, i1* %x
  %relation_op1 = icmp eq i1 %1, false
  br i1 %relation_op1, label %then2, label %ifcont

then2:                                            ; preds = %else
  store i1 true, i1* %x
  br label %ifcont

ifcont:                                           ; preds = %then2, %else
  br label %ifcont3

ifcont3:                                          ; preds = %ifcont, %then
  ret i16 0
}
我不明白
llc
是怎么说的。
prg.ll
输出来自我的
avr
自定义编译器。我在以下链接找到了
avr
的LLVM后端:。到目前为止,后端工作正常。有人知道问题出在哪里吗


提前谢谢

我将编译器中的bool类型宽度从i1更改为i8(在本例中,x是bool)。这解决了我的问题。avr后端可能不支持i1或其他什么。如果问题追踪器回答了我的问题,我会发布问题追踪器的答案


问题追踪器的答案是:

一堆LLVM后端处理i1的能力很差(这是非常可悲的)。这就是为什么几乎所有前端都将bool定义为i8

不过,我肯定想解决这个问题。从外观上看,它可能是在i1操作的zext上失败的。需要做的只是在内部将i1升级为i8


考虑一下在GITHUB回购案中打开一个问题吗?是的。我希望确保我的前端生成正确的
.ll
文件。
.ll
文件可能格式不正确。我不能理解这个错误。