当我执行以下IR时:
declare void @_puts(i32, ...)
define void @main() {
entry:
%name = alloca i32
br i1 true, label %then, label %else
then: ; preds = %entry
call void (i32, ...) @_puts(i32 1, i32 1234)
br label %end
else: ; preds = %entry
br label %end
end: ; preds = %else, %then
%if_val = phi i32 [ 1234, %then ], [ 0, %else ]
entry1: ; No predecessors!
store i32 %if_val, i32* %name
%name2 = load i32, i32* %name
call void (i32, ...) @_puts(i32 1, i32 %name2)
ret void
}
我收到以下错误消息:
断言失败:(!NodePtr-> isKnownSentinel()),函数运算符*,文件/Users/Mac/llvm-source/llvm/include/llvm/ADT/ilist_iterator.h,第139行。
中止陷阱:6
此消息的含义是什么?
有人可以帮我解释一下吗?
非常感谢。
答案 0 :(得分:1)
消息引用sentinel node的simple_ilist,这是一个数据结构,用于表示模块中的函数列表,函数中的基本块,基本块中的指令等等。上。 sentinel节点表示列表的结尾,并且是此类列表的唯一数据成员 - 其余部分位于构成列表的对象内(“i”表示“侵入”)。
我猜这个消息是由simple_ilist
的末尾迭代引起的。很可能是持有end
块中的指令的那个,因为这是唯一一个格式错误的块。您可以通过添加终结符来修复它:
end: ; preds = %else, %then
%if_val = phi i32 [ 1234, %then ], [ 0, %else ]
br label %entry1