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

How to add conditional branch instruction without else option?

提问人:vishals1991 提问时间:11/6/2023 更新时间:11/23/2023 访问量:51

问:

我正在尝试让我的 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 说明

评论

0赞 Peter Cordes 11/6/2023
这难道不是已经有效的LLVM-IR吗?如果是这样,您的 IR 看起来像这样。您是否想要其他工具从您未展示或提及的其他内容中生成这样的 IR?例如,叮叮当当从 C 生成 LLVM-IR?还是一些 LLVM 优化通过将不同的 IR 变成这个?不清楚你在问什么。
0赞 sepp2k 11/6/2023
@PeterCordes 不,它不是有效的 LLVM IR。不能有一个只有一个目标的条件分支,也不能在同一块中有多个终止符(或终止符后面的任何其他指令)。
1赞 Erik Eidt 11/7/2023
但你确实有另一条路,在那条路上有事可做。

答:

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