如何判断BasicBlock是否由`if`控制

问题描述 投票:0回答:2

我想使用LLVM来分析基本块是否受到

if
(即
br
指令)的控制流的影响。 “基本块
BB
不受
br
影响”意味着无论
br
转到
BB
中的哪两个块都一定会被执行。我用一个例子来简单地展示我想要的:

我当前确定基本块

BB
是否受到影响的规则是(如果
true
,则受影响。)

¬(postDominate(BB, BranchInst->leftBB) && postDominate(BB, BranchInst->rightBB))

由于我无法对所有可能的 CFG 进行详尽的测试,因此我想知道该规则是否健全完整

谢谢!

进一步问题

我也很困惑是否应该使用

dominate
而不是
postDominate
(我知道后支配和支配之间的区别,但我应该使用哪一个?这两个规则似乎在这个例子中都有效,但我不确定哪个在其他情况下会/不会工作):

Dominate(BranchInst->leftBB, BB) || Dominate(BranchInst->rightBB, BB)
llvm llvm-ir control-flow-graph
2个回答
2
投票

块 Y 控制依赖于块 X,当且仅当 Y 后支配至少一个但不是 X 的所有后继者。

llvm::ReverseIDFCalculator
中的
llvm/Analysis/IteratedDominanceFrontier.h
将为您计算后支配边界,这正是您所需要的。 “迭代”部分与您的用例无关,请忽略 setLiveInBlocks() 方法。

我根本没有测试过这个,但我希望这样的东西应该可以解决问题:

  // PDT is the llvm::PostDominatorTree
  SmallPtrSet<BasicBlock *, 1> BBSet{block_with_branch};
  SmallVector<BasicBlock *, 32> IDFBlocks;
  ReverseIDFCalculator IDFs(PDT);
  IDFs.setDefiningBlocks(BBSet);
  IDFs.calculate(IDFBlocks);

0
投票

关系

control dependent
是传递的。将定义迭代地应用于所有依赖于控制的影响块是正确的方法。

© www.soinside.com 2019 - 2024. All rights reserved.