提问人:vishals1991 提问时间:11/6/2023 更新时间:11/23/2023 访问量:51
如何在没有其他选项的情况下添加条件分支指令?
How to add conditional branch instruction without else option?
问:
我正在尝试让我的 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 块的假案例。我不是在寻找那个。
答:
2赞
sepp2k
11/6/2023
#1
你不能这么做。
基本块的全部意义在于它内部没有(本地)控制流。你可以跳到一个块的开头,也可以通过单个终结器指令在最后跳出它。在这之间,它只是一个线性的指令序列。
因此,您不仅不能有一个只有一个目标的条件分支,而且您也不能在分支之后的同一块中进一步指示。分支终止块。
0赞
kamkow1
11/23/2023
#2
我在创建编译器时遇到了类似的问题。您可以检查解析树中是否有可用的 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
下一个:cfg 的反编译独立模式结构
评论