我想使用LLVM来分析一个基本块是否受到if的控制流(即br指令)的影响。“基本块BB不受br影响”意味着无论两个块中的哪个块,br都将被确定地执行到BB。我用一个例子简要地展示了我想要的东西:

我确定基本块BB是否受影响的当前规则是(如果是true,受影响)。
¬(postDominate(BB, BranchInst->leftBB) && postDominate(BB, BranchInst->rightBB))由于我无法对所有可能的CFG进行上述规则的详尽测试,我想知道这个规则是否是声音和complete。
谢谢!
进一步的问题
我也很困惑我是否应该使用dominate而不是postDominate之类的(我知道支配地位和支配地位之间的区别,但是我应该使用哪一个呢?这两条规则在本例中似乎都有效,但我不确定哪条规则在其他情况下会/不起作用):
Dominate(BranchInst->leftBB, BB) || Dominate(BranchInst->rightBB, BB)发布于 2022-04-29 06:10:41
块Y依赖于块X的控制当且仅当Y后控制X的至少一个继承人,而不是所有继承者。
llvm::ReverseIDFCalculator in 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);发布于 2022-05-04 08:11:00
关系control dependent是传递性的。迭代地将该定义应用于所有依赖于控制的受影响块是正确的方法。
https://stackoverflow.com/questions/72052295
复制相似问题