我想使用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)
块 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);
关系
control dependent
是传递的。将定义迭代地应用于所有依赖于控制的影响块是正确的方法。