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

How can I check if a llvm instruction is inside a loop?

我在 llvm pass 中有一组经过过滤的指令。我想检查每条指令是否是任何循环(或子循环)的一部分。我知道我可以从指令中获取父基本块

BasicBlock* bb = aInst->getParent();

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

您可以使用 LoopInfollvm::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 的循环,方法是将 instrloopInfo 传递给像

这样的例程
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;
    }

}