Skip to content

Commit

Permalink
[PM] Add support for building a default AA pipeline to the PassBuilder.
Browse files Browse the repository at this point in the history
Pretty boring and lame as-is but necessary. This is definitely a place
we'll end up with extension hooks longer term. =]

Differential Revision: https://reviews.llvm.org/D28076

llvm-svn: 290449
  • Loading branch information
chandlerc committed Dec 23, 2016
1 parent 3e83537 commit 060ad61
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 0 deletions.
4 changes: 4 additions & 0 deletions llvm/include/llvm/Passes/PassBuilder.h
Expand Up @@ -224,6 +224,10 @@ class PassBuilder {
ModulePassManager buildLTODefaultPipeline(OptimizationLevel Level,
bool DebugLogging = false);

/// Build the default `AAManager` with the default alias analysis pipeline
/// registered.
AAManager buildDefaultAAPipeline();

/// \brief Parse a textual pass pipeline description into a \c ModulePassManager.
///
/// The format of the textual pass pipeline description looks something like:
Expand Down
34 changes: 34 additions & 0 deletions llvm/lib/Passes/PassBuilder.cpp
Expand Up @@ -544,6 +544,33 @@ ModulePassManager PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
return MPM;
}

AAManager PassBuilder::buildDefaultAAPipeline() {
AAManager AA;

// The order in which these are registered determines their priority when
// being queried.

// First we register the basic alias analysis that provides the majority of
// per-function local AA logic. This is a stateless, on-demand local set of
// AA techniques.
AA.registerFunctionAnalysis<BasicAA>();

// Next we query fast, specialized alias analyses that wrap IR-embedded
// information about aliasing.
AA.registerFunctionAnalysis<ScopedNoAliasAA>();
AA.registerFunctionAnalysis<TypeBasedAA>();

// Add support for querying global aliasing information when available.
// Because this is a module analysis this will use any cached analysis state
// available but isn't enough to cause it to be available.
// FIXME: Enable once the invalidation logic supports this.
#if 0
AA.registerModuleAnalysis<GlobalsAA>();
#endif

return AA;
}

static Optional<int> parseRepeatPassName(StringRef Name) {
if (!Name.consume_front("repeat<") || !Name.consume_back(">"))
return None;
Expand Down Expand Up @@ -1084,6 +1111,13 @@ bool PassBuilder::parsePassPipeline(ModulePassManager &MPM,
}

bool PassBuilder::parseAAPipeline(AAManager &AA, StringRef PipelineText) {
// If the pipeline just consists of the word 'default' just replace the AA
// manager with our default one.
if (PipelineText == "default") {
AA = buildDefaultAAPipeline();
return true;
}

while (!PipelineText.empty()) {
StringRef Name;
std::tie(Name, PipelineText) = PipelineText.split(',');
Expand Down
11 changes: 11 additions & 0 deletions llvm/test/Other/new-pass-manager.ll
Expand Up @@ -311,6 +311,17 @@
; CHECK-AA: Running analysis: BasicAA
; CHECK-AA: Finished llvm::Module pass manager run

; RUN: opt -disable-output -disable-verify -debug-pass-manager %s 2>&1 \
; RUN: -passes='require<aa>' -aa-pipeline='default' \
; RUN: | FileCheck %s --check-prefix=CHECK-AA-DEFAULT
; CHECK-AA-DEFAULT: Starting llvm::Module pass manager run
; CHECK-AA-DEFAULT: Running pass: RequireAnalysisPass
; CHECK-AA-DEFAULT: Running analysis: AAManager
; CHECK-AA-DEFAULT: Running analysis: BasicAA
; CHECK-AA-DEFAULT: Running analysis: ScopedNoAliasAA
; CHECK-AA-DEFAULT: Running analysis: TypeBasedAA
; CHECK-AA-DEFAULT: Finished llvm::Module pass manager run

; RUN: opt -disable-output -disable-verify -debug-pass-manager %s 2>&1 \
; RUN: -passes='require<memdep>' \
; RUN: | FileCheck %s --check-prefix=CHECK-MEMDEP
Expand Down

0 comments on commit 060ad61

Please sign in to comment.