【发布时间】: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 的基础设施很重要。使用通行证的唯一合理方法是设置该基础架构。我最终写了几十行来实例化至少六个类,所有这些都是为了运行一个传递(加上它需要的传递)但在那之后,我很快就开始运行几十个传递。