使用 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: 块不一定会根据条件执行。
有人可以给我一些指示吗?谢谢
编辑:再想一想,支配树可能有助于确定这一点,但我还没有这方面的算法。