【发布时间】:2020-11-25 06:04:08
【问题描述】:
我正在编写自己的编程语言,并且有以下源代码:
if false {
# do nothing
}
else {
# do nothing
}
return 0
我的编译器当前输出以下 LLVM IR:
; ModuleID = 'tmp.sk'
source_filename = "tmp.sk"
define i64 @main() {
entry:
br i1 false, label %if_true, label %if_false
if_true: ; preds = %entry
br label %end
end: ; preds = %if_false, %if_true
ret i64 0
if_false: ; preds = %entry
br label %end
}
注意基本块的顺序:
entry
if_true
end
if_false
但在我的源代码中,逻辑进程将end 和if_false 交换了。根据我对基本块的了解,它们必须以终止符指令结尾,例如ret 或br。这意味着块一起出血应该没有任何问题。
我的问题是,是否还有其他问题我没有解决,或者这完全没问题,但人类可读性较差的 LLVM IR?
(我正在使用 LLVM-C API,如果有任何用处的话。)
【问题讨论】:
-
好吧,你了解它发出的
br指令的语法吗?考虑到这一点,逻辑是否有意义? -
是的,分支行为是正确的。它生成的 IR 也应该是正确的。我说“应该”是因为我很好奇是否存在任何潜在的极端情况,其中块乱序可能会导致问题。