如何检查 llvm 指令是否在循环内?
How can I check if a llvm instruction is inside a loop?
我在 llvm pass 中有一组经过过滤的指令。我想检查每条指令是否是任何循环(或子循环)的一部分。我知道我可以从指令中获取父基本块
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
的周围函数是否包含一个包含 instr
的循环,方法是将 instr
和 loopInfo
传递给像
这样的例程
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;
}
}
我在 llvm pass 中有一组经过过滤的指令。我想检查每条指令是否是任何循环(或子循环)的一部分。我知道我可以从指令中获取父基本块
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
的周围函数是否包含一个包含 instr
的循环,方法是将 instr
和 loopInfo
传递给像
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;
}
}