在 LLVM 中,如何获取循环及其指令?

In LLVM, how do I get the loop and its instructions?

我目前正在学习LLVM pass。我设法创建了一些简单的传递,但现在我想获取循环及其说明。才知道不是从函数和基本块中获取指令那么简单

我得到了一些起始代码:

for (BasicBlock &B : F) 
{
 for (Instruction &Inst : B) 
 {
   //maybe get loops and insts here(?)
 }
}

我应该怎么做才能获得循环?

如果您需要某些东西,您可以从 BasicBlock::getParent() 的循环中访问该函数。要在函数传递中执行,您可以初始化 LoopInfo 并使用 LoopInfo::getLoopFor(BasicBlock *)。参见:llvm.org/doxygen/DeadStoreElimination_8cpp_source.html

对于每个循环,都会调用所有 LoopPasses。例如:llvm/lib/Transforms/Scalar/LoopInstSimplify.cpp。您可以在其中一个循环通道中进行更改以开始使用。 llvm/lib/Transforms/Scalar/ 目录中有很多示例。

now I want to get loops and its instructions

您可以使用 Depth First, Reverse Post Order 等图遍历算法遍历循环的所有 BasicBlocks

要开始循环转换,您还应该了解:

  • 自然循环
  • 循环访问信息
  • 支配树
  • 像深度优先、反向Post顺序这样的遍历算法