使用LLVM循环过程中的LLVM别名分析结果
我有一个LLVM循环通过,我需要检查 两个值可以互相别名。如果首先运行别名分析过程,然后运行循环过程,如何查询AA过程的结果? 它可能类似于:使用LLVM循环过程中的LLVM别名分析结果,llvm,static-analysis,Llvm,Static Analysis,我有一个LLVM循环通过,我需要检查 两个值可以互相别名。如果首先运行别名分析过程,然后运行循环过程,如何查询AA过程的结果? 它可能类似于: virtual bool runOnLoop(Loop *loop, LPPassManager &LPM) { Value *v1 = getValueSomehow(); Value *v2 = getValueSomeOtherWay(); // EDITED with compor's answer Al
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: PassAnalysisSupport.h:236: [...]:
Assertion `ResultPass && "getAnalysis*() called on an analysis that was not " "'required' by pass!"' failed.
...
Aborted (core dumped)
编辑:
仅仅把-basicaa通行证放在opt的前面是不够的。
事实上,正如compor所说,必须覆盖getAnalysisUsage,
并明确说明需要哪些通行证
struct StaticAnalyzer : public LoopPass
{
static char ID;
StaticAnalyzer():LoopPass(ID){}
void getAnalysisUsage(AnalysisUsage &AU) const override
{
AU.addRequired<AAResultsWrapperPass>();
}
// ...
};
struct StaticAnalyzer:public LoopPass
{
静态字符ID;
StaticAnalyzer():LoopPass(ID){}
无效getAnalysisUsage(AnalysisUsage&AU)常量重写
{
AU.addRequired();
}
// ...
};
如有疑问,请按照LLVM的做法行事;例如,在本例中,请查看llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
使用llvm::legacy::PassManager
可以通过添加别名分析作为pass的一项要求来完成:
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.addRequired<AAResultsWrapperPass>();
[...]
}
另外,请注意,您可以通过命令行(已提到)来“插入”和组合各种别名分析(复数),例如
你试过什么?什么不起作用?谢谢,我试过了,但它崩溃了。。。我在问题中添加了断言失败。我正要建议将您的pass升级为函数或模块pass,并使用
LoopInfo
分析,以防万一设置中有什么阻碍。很好,你成功了。
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.addRequired<AAResultsWrapperPass>();
[...]
}
AliasAnalysis *AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
opt -basicaa [...]