在 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
对于每个循环,都会调用所有 LoopPass
es。例如: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顺序这样的遍历算法
我目前正在学习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
对于每个循环,都会调用所有 LoopPass
es。例如: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顺序这样的遍历算法