我正在尝试让我的 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 块来处理错误的情况。我不是在寻找那个。
你不能那样做。
基本块的全部要点是它内部没有(本地)控制流。您可以跳转到块的开头,也可以通过单个终止符指令在最后跳出块。在这之间它只是一个线性指令序列。
因此,您不仅不能拥有只有一个目标的条件分支,而且也无法在该分支之后的同一块中进一步执行指令。分支终止块。
我在创建编译器时遇到了类似的问题。您可以检查解析树中是否有可用的 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