如何查找llvm :: Instruction是否位于流控制中?

时间:2013-03-09 23:10:39

标签: llvm llvm-ir

使用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树可能有助于确定这一点,但我还没有算法。

1 个答案:

答案 0 :(得分:5)

以下是指导后统治的定义from Wikipedia

  

类似于上面的支配地定义,节点z被称为   如果到图的出口节点的所有路径,则后控制节点n   从n开始必须经过z。

在我看来,在你的情况下,你正在寻找支配该函数中第一条指令的调用。根据后统治的定义,必须在第一条指令的每条路径上达成这种要求。这是你需要的吗?

你可以运行似乎支持后统治分析的DominatorTree通行证。