我可能误解了 LLVM 和 pass 的工作原理,无论如何,这是我的问题:
我目前正在处理一个扩展 runOnModule ( https://llvm.org/doxygen/classllvm_1_1ModulePass.html ) 函数的过程。我想首先在 IR 上运行 LoopSimplify,但我似乎不明白该怎么做。有一个 run(Function &F, FunctionAnalysisManager &AM) 函数,如 https://llvm.org/doxygen/classllvm_1_1LoopSimplifyPass.html 中所述。据我了解,我可以在模块中的每个函数上调用它。但为此,我需要该类的一个成员(LoopSimplify)来调用它,我不知道从哪里获取它,还需要一些 FunctionAnalysisManager。它们的用途是什么以及它们需要是什么样子?我不能只给它提供一些空的结构,对吗?
我这样做是为了得到以下保证: “循环预 header 插入保证有一个单一的、非关键的 从循环外部到循环头的入口边缘。这简化了 分析和转换的数量,例如 LCM。”如 https://llvm.org/doxygen/LoopSimplify_8h_source.html 中所述。
最佳答案
虽然我支持将您的通行证集成到使用通行证管理器中的说明,但是,有一种方法可以通过让您的通行证需要它来强制 LoopSimplify 运行。这也用在许多 LLVM 提供的 channel 中,例如 Scalar/LoopVersioningLICM.cpp
// This header includes LoopSimplifyID as an extern
#include "llvm/Transforms/Utils.h"
...
void YourPass::getAnalysisUsage(AnalysisUsage& AU) const {
AU.addRequiredID(LoopSimplifyID);
}
这样做将强制该传递在您的传递之前运行,无需调用它。但是,如果您需要与此或其他 channel 交互,您可以请求其分析:
getAnalysis<LoopSimplifyPass>(F); // Where F is a function&
关于loops - LLVM 循环简化传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60634827/