使用 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 [...]
我有一个 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 [...]