使用 LLVM 循环传递的 LLVM 别名分析结果

Using the results of LLVM alias analysis from an LLVM loop pass

我有一个 LLVM 循环 pass,我需要检查是否 两个值可能互为别名。如果我先运行一个别名分析pass,然后循环pass,如何查询AA pass的结果? 它可能应该类似于:

virtual bool runOnLoop(Loop *loop, LPPassManager &LPM)
{
    Value *v1 = getValueSomehow();
    Value *v2 = getValueSomeOtherWay();

    // EDITED with compor's answer
    AliasAnalysis *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();

    if (AA->isNoAlias(v1,v2))
    {
        errs() << "OK";
    }
}

但是当我运行它用这个opt命令时(我把aa pass放在第一位)

opt            \
-basicaa       \
-loop-simplify \
-instnamer     \
-indvars       \
-simplifycfg   \
-view-cfg      \
-o input.ready.bc input.bc

我得到这个运行时间错误:

opt: PassAnalysisSupport.h:236: [...]:
Assertion `ResultPass && "getAnalysis*() called on an analysis that was not " "'required' by pass!"' failed.
...
Aborted (core dumped)

编辑:

不是 只需将 -basicaa 通行证放在首位即可选择。 确实,就像 compor 所说的那样,必须重写 getAnalysisUsage, 并明确说明需要哪些通行证。

struct StaticAnalyzer : public LoopPass
{
    static char ID;
    StaticAnalyzer():LoopPass(ID){}

    void getAnalysisUsage(AnalysisUsage &AU) const override
    {
        AU.addRequired<AAResultsWrapperPass>();
    }
    // ...
};

如有疑问,请像 LLVM 那样做;例如,在这种情况下,请查看 llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp.

使用 llvm::legacy::PassManager 这是通过将别名分析添加为传递的要求来完成的:

void getAnalysisUsage(AnalysisUsage &AU) const override {
    AU.addRequired<AAResultsWrapperPass>();
    [...]
}

然后在run()方法中访问分析结果:

AliasAnalysis *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();

此外,请注意,您可以 "plug" 并通过命令行(提到 here)组合各种别名分析(复数),例如

opt -basicaa [...]