使用LLVM我试图找出流控制中是否存在指令(if / switch / for)等,我必须在IR级别执行此操作。伪代码如下所示。
if cond
inst
endif
我正在查看函数的SCC,但我不确定如何确定流控件中是否存在指令。
以Kaleidoscope示例为例,了解此IR。
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:block我们有另一个调用foo,最后一个调用ifcont:block。
所以问题是虽然then:block中的调用属于if块生成的代码,但我该如何推断呢?即进入区块& ifcont块将被执行,但是then:block不一定会被执行,具体取决于条件。
有人可以给我一些指示吗? 感谢
编辑:再多想一想,Dominator树可能有助于确定这一点,但我还没有算法。
答案 0 :(得分:5)
以下是指导后统治的定义from Wikipedia:
类似于上面的支配地定义,节点z被称为 如果到图的出口节点的所有路径,则后控制节点n 从n开始必须经过z。
在我看来,在你的情况下,你正在寻找支配该函数中第一条指令的调用。根据后统治的定义,必须在第一条指令的每条路径上达成这种要求。这是你需要的吗?
你可以运行似乎支持后统治分析的DominatorTree
通行证。