LLVM循环简化遍历

问题描述 投票:0回答:1

我可能会误解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。它们是干什么的,它们需要什么样子?好像我不能只给它提供一些空的结构吗?

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

loops clang llvm llvm-ir
1个回答
0
投票

尽管我支持使用通行证管理器将通行证集成到其中的说明,但是有一种方法可以通过使通行证需要它来强制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);
}
© www.soinside.com 2019 - 2024. All rights reserved.