gpt4 book ai didi

llvm - 如何查找 llvm::Instruction 是否在流量控制内?

转载 作者:行者123 更新时间:2023-12-02 05:11:48 25 4
gpt4 key购买 nike

使用 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 的所有调用。因此,在入口 block 中,我们有一个调用 %0 和一个在 then: block 中,我们有另一个调用 foo 和最后一个在 ifcont: block 中。

所以问题是,尽管 then: block 中的调用落在从 if block 生成的代码中,我如何推断出它?即 entry block 和 ifcont block 将被执行,但是 then: block 将根据条件不一定执行。

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

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

最佳答案

这是指令后支配的定义from Wikipedia :

Analogous to the definition of dominance above, a node z is said to post-dominate a node n if all paths to the exit node of the graph starting at n must go through z.

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

您可以运行 DominatorTree pass,它似乎支持后支配分析。

关于llvm - 如何查找 llvm::Instruction 是否在流量控制内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15316998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com