我有 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>();
}
// ...
};
答案 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 [...]