2

使用 LLVM,我试图找出流控制(if/switch/for)等中是否存在指令,我必须在 IR 级别执行此操作。伪代码如下所示。

if cond
    inst
endif

我正在查看函数的 SCC,但我不确定如何推断指令是否存在于流控制中。

以这个 IR 的 Kaleidoscope 示例为例。

declare double @foo()

declare double @bar()

define double @baz(double %x) {
entry:
  %ifcond = fcmp one double %x, 0.000000e+00
  %0 = call double @foo()
  br i1 %ifcond, label %then, label %else

then:       ; preds = %entry
  %calltmp = call double @foo()
  br label %ifcont

else:       ; preds = %entry
  %calltmp1 = call double @bar()
  br label %ifcont

ifcont:     ; preds = %else, %then
  %iftmp = phi double [ %calltmp, %then ], [ %calltmp1, %else ]
  %1 = call double @foo()
  ret double %iftmp
}

所以在上面的 IR 中,假设我想找出对函数 foo 的所有调用。因此,在入口块中,我们有一个使用 %0 的调用和一个在 then: 块中的调用,我们对 foo 进行了另一个调用,最后一个在 ifcont: 块中。

所以问题是,虽然 then: 块中的调用落在 if 块生成的代码中,但我该如何推断呢?即 entry 块和 ifcont 块将被执行,但是 then: 块不一定会根据条件执行。

有人可以给我一些指示吗?谢谢

编辑:再想一想,支配树可能有助于确定这一点,但我还没有这方面的算法。

4

1 回答 1

5

以下是维基百科对统治后指令的定义:

类似于上述支配性的定义,如果从 n 开始到图的出口节点的所有路径都必须经过 z,则称节点 z 后支配节点 n。

在我看来,在您的情况下,您正在寻找在函数中占主导地位的第一条指令的调用。根据后支配的定义,这样的调用必须从第一条指令开始在每条路径上到达。这是你需要的吗?

您可以运行DominatorTree似乎支持后支配分析的通行证。

于 2013-03-10T00:18:52.407 回答