首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定BasicBlock是否由“if”控制

如何确定BasicBlock是否由“if”控制
EN

Stack Overflow用户
提问于 2022-04-29 02:53:52
回答 2查看 199关注 0票数 0

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

我确定基本块BB是否受影响的当前规则是(如果是true,受影响)。

代码语言:javascript
复制
¬(postDominate(BB, BranchInst->leftBB) && postDominate(BB, BranchInst->rightBB))

由于我无法对所有可能的CFG进行上述规则的详尽测试,我想知道这个规则是否是声音complete

谢谢!

进一步的问题

我也很困惑我是否应该使用dominate而不是postDominate之类的(我知道支配地位和支配地位之间的区别,但是我应该使用哪一个呢?这两条规则在本例中似乎都有效,但我不确定哪条规则在其他情况下会/不起作用):

代码语言:javascript
复制
Dominate(BranchInst->leftBB, BB) || Dominate(BranchInst->rightBB, BB)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-29 06:10:41

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

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

我根本没有测试过这一点,但我希望这样的东西能起作用:

代码语言:javascript
复制
  // 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);
票数 2
EN

Stack Overflow用户

发布于 2022-05-04 08:11:00

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72052295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档