如何在没有else选项的情况下添加条件分支指令?

问题描述 投票:0回答:2

我正在尝试让我的 IR 如下所示。在 LLVM 中可以实现这一点吗?

entry:
 %2 = call i32 @func()
 %3 = icmp ne i32 %2, 0, !dbg
  br i1 %3, label %if.then.block

  call void @abc()
  ret void

if.then.block:
  ; Insert instructions for the "if.then.block"
  ; ...

  ret void

我尝试了一种方法,该方法为我的分支指令提供了一个 else 块来处理错误的情况。我不是在寻找那个。

llvm llvm-ir instructions
2个回答
2
投票

你不能那样做。

基本块的全部要点是它内部没有(本地)控制流。您可以跳转到块的开头,也可以通过单个终止符指令在最后跳出块。在这之间它只是一个线性指令序列。

因此,您不仅不能拥有只有一个目标的条件分支,而且也无法在该分支之后的同一块中进一步执行指令。分支终止块。


0
投票

我在创建编译器时遇到了类似的问题。您可以检查解析树中是否有可用的 else 块。如果不是,那么您仍然会发出 else 分支,但将其保留为空,然后使用到合并块的分支来终止它。这是一个例子:

...
  br i1 %15, label %then, label %else

then:                                             ; preds = %entry
  ret i32 55

else:                                             ; preds = %entry
  br label %merge ; no else block in original source code, so we just jump into merge block

merge:                                            ; preds = %else
  %16 = alloca i32, align 4
  store i32 44, ptr %16, align 4
  ret i32 2
© www.soinside.com 2019 - 2024. All rights reserved.