loops - LLVM 循环简化传递

标签 loops clang llvm llvm-ir

我可能误解了 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/

相关文章:

llvm - 如何删除未使用的 basicblocks llvm

linux - 对于多个文件夹中的文件的循环 - bash shell

excel - VBA 循环填充表格

objective-c - 用于检测 Objective-C 中类属性可用性的宏

Xcode:ld:找不到 -lAFNetworking 的库

metadata - 如何从 llvm 的元数据中获取字段名称

java - 我怎样才能根据用户输入使这个抛硬币模拟工作? eclipse

c - while 循环在每次迭代中工作两次

c++ - 使用 gcc 编译更大的(~6MB)映射初始化 C++ 文件

c++ - llvm,加载 poolalloc 以选择