我在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);
然后通过将instr
和loopInfo
传递给像
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;
}
}