我目前正在将项目从LLVM 3.7移植到LLVM 3.8 RC2。 3.8发布废弃了旧的分析组设计,并引入了一个新的别名分析模型。
我的程序实现了两个旧式的AA传递,我已经转换为AAResult
子类。它还使用传统的传递基础设施,因为它似乎还没有准备就绪。
然而,对于像我这样的树外用户,新的AA模型与传统的传递基础设施相比并不是很好。 AAResultWrapperPass
有一个hard-coded list of AA passes,可以使用ExternalAAWrapperPass
进行扩展。
The first AA pass only implements aliasing queries。它使用更高级别的知识来了解我的项目如何生成IR来判断两个指针何时可能是别名。
第二个也是更复杂的AA传递,在代码已经在某种程度上进行了优化(从第一次传递中受益)之后使用,只实现了ModRef查询。 It uses MemorySSA
(从开发分支转移到我的项目中),因此需要先前别名分析的结果才能工作。
在单位测试/分析/ AliasAnalysisTest.cpp中概述了建议的ExternalAAWrapperPass
回调策略:
PM.add(createExternalAAWrapperPass([](Pass &P, Function &, AAResults &AAR) {
if (auto *WrapperPass = P.getAnalysisIfAvailable<TestCustomAAWrapperPass>())
AAR.addAAResult(WrapperPass->getResult());
}));
但是,我很确定管道中只能有一个ExternalAAWrapperPass,问题是我在第一次AA传递后需要一个(所以第二次AA传递将会获得它),并且在我的第二次AA传球之后的另一次传球(以便其他传球将接球)。
那么当第二次传递取决于第一次传递时,如何将两次AA传递移植到LLVM 3.8?