使用LLVM循环遍历中的LLVM别名分析结果

时间:2018-07-18 03:58:30

标签: llvm static-analysis

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

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密码放在首位)

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>();
    }
    // ...
};

1 个答案:

答案 0 :(得分:1)

有疑问时,请像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();

另外,请注意,您可以通过命令行(提到here)“插入”并组合各种别名分析(复数),例如

opt -basicaa [...]