如何检查llvm指令是否在循环内?



我在llvm通道中使用了一组经过过滤的指令。我想检查每个指令是否是任何循环(或子循环)的一部分。我知道我可以从指令

中获得父基本块
BasicBlock* bb = aInst->getParent();

但是如何检查指令/基本块是否是循环的一部分呢?

您可以使用LoopInfo来查找llvm::Function中的循环。

如本文所述,您可以获取给定指令所属的函数,计算该函数的支配子树,并使用llvm::LoopInfo::BaseT对象分析结果。

llvm::DominatorTree DT = llvm::DominatorTree();
DT.recalculate(instr->getFunction());
auto loopInfo = new llvm::LoopInfoBase<llvm::BasicBlock, llvm::Loop>();
loopInfo->releaseMemory();
loopInfo->analyze(DT);

然后通过将instrloopInfo传递给像

这样的例程,检查instr的周围函数是否包含包含instr的循环
bool instrIsInaLoop(llvm::LoopInfoBase<llvm::BasicBlock, llvm::Loop> &loopInfo,
llvm::Instruction *instr) {
for (auto loop : loopInfo) if (instrIsInLoop(loop, instr)) return true;
return false;
}

与子程序

bool instrIsInLoop(llvm::Loop *loop, llvm::Instruction *instr) {
if (loop->contains(instr))
return true;
else {
for (auto subLoop : loop->getSubLoops()) {
if (instrIsInLoop(loop, instr)) return true;
}
return false;
}
}