【问题标题】:LLVM: Does the order of basic blocks matter?LLVM:基本块的顺序重要吗?
【发布时间】: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

但在我的源代码中,逻辑进程将endif_false 交换了。根据我对基本块的了解,它们必须以终止符指令结尾,例如retbr。这意味着块一起出血应该没有任何问题。

我的问题是,是否还有其他问题我没有解决,或者这完全没问题,但人类可读性较差的 LLVM IR?

(我正在使用 LLVM-C API,如果有任何用处的话。)

【问题讨论】:

  • 好吧,你了解它发出的br 指令的语法吗?考虑到这一点,逻辑是否有意义?
  • 是的,分支行为是正确的。它生成的 IR 也应该是正确的。我说“应该”是因为我很好奇是否存在任何潜在的极端情况,其中块乱序可能会导致问题。

标签: c llvm


【解决方案1】:

基本块的顺序是任意的。更重要的是,编译器可以重新排列它们以通过尽可能多的分支。

【讨论】:

    猜你喜欢
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2018-01-09
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多