我正在编写自己的编程语言,并有以下源代码:
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,如果有任何用处的话。(
基本块的顺序是任意的。更重要的是,编译器可以重新排列它们,以使尽可能多的分支通过。