【问题标题】:LLVM Loop Simplify PassLLVM 循环简化通行证
【发布时间】:2020-03-11 11:20:11
【问题描述】:

我可能误解了一些基本概念 LLVM 和传递如何工作,无论如何这是我的问题:

我目前正在处理一个扩展 runOnModule (https://llvm.org/doxygen/classllvm_1_1ModulePass.html) 函数的过程。我想先在 IR 上运行 LoopSimplify,但我似乎不明白该怎么做。如https://llvm.org/doxygen/classllvm_1_1LoopSimplifyPass.html 所述,有一个 run(Function &F, FunctionAnalysisManager &AM) 函数,据我所知,我可以在模块中的每个函数上调用它。但为此,我需要该类的成员(LoopSimplify)来调用它,我不知道从哪里得到它,还需要一些 FunctionAnalysisManager。它们是做什么用的,它们需要看起来像什么?不是说我只能喂它一些空的结构吧?

我想这样做是为了得到以下保证: "循环预头插入保证有一个单一的、非关键的 从循环外部到循环头的入口边缘。这简化了一个 分析和转换的数量,例如 LCM。”如https://llvm.org/doxygen/LoopSimplify_8h_source.html 中所述。

【问题讨论】:

  • 如果你使用新的 pass 管理器(即你的 pass 继承 PassInfoMixin),那么你自己的 run() 接收 FunctionAnalysisManager 作为参数。我似乎记得有一种方法可以运行另一个通道,如果它还没有运行,但现在看不到它......无论如何,你可以调用它的 run() 直到它成为一个性能问题;)
  • 不使用 PassManager 怎么办?
  • 更新到更新版本的 LLVM 并开始使用新的通行证管理器。旧版通行证管理器在这一点上是一条死胡同。
  • 感谢您的时间和解释。我阅读了通行证管理器的工作原理,似乎我不能简单地将它集成到一个不基于它的现有通行证中。这是真的吗,还是有什么方法可以改变现有的通行证(不改变大量的结构)以能够使用该界面?或者您是否知道一种更改循环 IR 的方法,以便始终存在一个预标头(我试图通过 LoopSimplify 实现)?我可以自己写,但我宁愿避免。
  • 通行证管理器是编写通行证的基础设施中最重要的部分。 LLVM 使得编写和使用额外的 pass 变得非常简单,代价是 pass 的基础设施很重要。使用通行证的唯一合理方法是设置该基础架构。我最终写了几十行来实例化至少六个类,所有这些都是为了运行一个传递(加上它需要的传递)但在那之后,我很快就开始运行几十个传递。

标签: loops clang llvm llvm-ir


【解决方案1】:

虽然我支持将您的通行证集成到使用通行证管理器中的说明,但是,有一种方法可以通过让您的通行证需要它来强制 LoopSimplify 运行。这也用于许多 LLVM 提供的通行证,例如 Scalar/LoopVersioningLICM.cpp

// This header includes LoopSimplifyID as an extern
#include "llvm/Transforms/Utils.h"
...
void YourPass::getAnalysisUsage(AnalysisUsage& AU) const {
  AU.addRequiredID(LoopSimplifyID);
}

这样做将强制在您的通行证之前运行通行证,无需调用它。但是,如果您需要与此通道或其他通道的接口,您可以请求对其进行分析:

getAnalysis<LoopSimplifyPass>(F); // Where F is a function&

【讨论】:

  • 感谢您的回复。我注意到在整个项目中,即使我真的很想使用新的通行证管理器重写我的通行证,但我无法投入那么多时间。我用legacy::PassManager *PM = new legacy::PassManager(); PM-&gt;add(createLoopSimplifyPass()); PM-&gt;run(M);解决了它
猜你喜欢
  • 2015-04-10
  • 2014-06-06
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多