llc
给了我以下错误:
LLVM ERROR: Cannot select: t20: i8,ch = load<LD1[%x], zext from i1> t0, FrameIndex:i16<0>, undef:i16
t1: i16 = FrameIndex<0>
t3: i16 = undef
In function: main
这是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后端:avr-llvm backend。到现在为止,后端工作正常。有人看到了什么问题吗?
提前致谢!
答案 0 :(得分:2)
我将编译器中的bool类型宽度从i1更改为i8(在这种情况下,x是bool)。这解决了我的问题。 avr-backend可能不支持i1或其他任何东西。如果他们回答我到底是什么问题,我会在问题跟踪器上发布答案。
问题跟踪器的答案:
一堆LLVM后端严重处理i1(非常难过)。这就是为什么几乎所有前端都将bool定义为i8。
我肯定想解决这个问题。从这看起来,它可能在i1操作的zext上失败了。所有应该需要的是在内部将i1升级为i8。