使用LLVM 3.8创建自定义别名分析

时间:2016-02-25 21:37:49

标签: c++ llvm

我目前正在将项目从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?

0 个答案:

没有答案