Skip to content

Commit

Permalink
[LLVM][NewPM] Add a C API for setting the PassBuilder AA pipeline. (l…
Browse files Browse the repository at this point in the history
…lvm#102482)

This PR adds a field to the pass builder options struct, `AAPipeline`,
exposed through a C API `LLVMPassBuilderOptionsSetAAPipeline`, that is
used to set an alias analysis pipeline to be used in stead of the
default one.

x-ref https://discourse.llvm.org/t/newpm-c-api-questions/80598
  • Loading branch information
maleadt authored and bwendling committed Aug 15, 2024
1 parent e04858b commit 8966c71
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 1 deletion.
8 changes: 8 additions & 0 deletions llvm/include/llvm-c/Transforms/PassBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,14 @@ void LLVMPassBuilderOptionsSetVerifyEach(LLVMPassBuilderOptionsRef Options,
void LLVMPassBuilderOptionsSetDebugLogging(LLVMPassBuilderOptionsRef Options,
LLVMBool DebugLogging);

/**
* Specify a custom alias analysis pipeline for the PassBuilder to be used
* instead of the default one. The string argument is not copied; the caller
* is responsible for ensuring it outlives the PassBuilderOptions instance.
*/
void LLVMPassBuilderOptionsSetAAPipeline(LLVMPassBuilderOptionsRef Options,
const char *AAPipeline);

void LLVMPassBuilderOptionsSetLoopInterleaving(
LLVMPassBuilderOptionsRef Options, LLVMBool LoopInterleaving);

Expand Down
19 changes: 18 additions & 1 deletion llvm/lib/Passes/PassBuilderBindings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//

#include "llvm-c/Transforms/PassBuilder.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Verifier.h"
#include "llvm/Passes/PassBuilder.h"
Expand All @@ -28,11 +29,14 @@ class LLVMPassBuilderOptions {
public:
explicit LLVMPassBuilderOptions(
bool DebugLogging = false, bool VerifyEach = false,
const char *AAPipeline = nullptr,
PipelineTuningOptions PTO = PipelineTuningOptions())
: DebugLogging(DebugLogging), VerifyEach(VerifyEach), PTO(PTO) {}
: DebugLogging(DebugLogging), VerifyEach(VerifyEach),
AAPipeline(AAPipeline), PTO(PTO) {}

bool DebugLogging;
bool VerifyEach;
const char *AAPipeline;
PipelineTuningOptions PTO;
};
} // namespace llvm
Expand Down Expand Up @@ -60,6 +64,14 @@ LLVMErrorRef LLVMRunPasses(LLVMModuleRef M, const char *Passes,
FunctionAnalysisManager FAM;
CGSCCAnalysisManager CGAM;
ModuleAnalysisManager MAM;
if (PassOpts->AAPipeline) {
// If we have a custom AA pipeline, we need to register it _before_ calling
// registerFunctionAnalyses, or the default alias analysis pipeline is used.
AAManager AA;
if (auto Err = PB.parseAAPipeline(AA, PassOpts->AAPipeline))
return wrap(std::move(Err));
FAM.registerPass([&] { return std::move(AA); });
}
PB.registerLoopAnalyses(LAM);
PB.registerFunctionAnalyses(FAM);
PB.registerCGSCCAnalyses(CGAM);
Expand Down Expand Up @@ -94,6 +106,11 @@ void LLVMPassBuilderOptionsSetDebugLogging(LLVMPassBuilderOptionsRef Options,
unwrap(Options)->DebugLogging = DebugLogging;
}

void LLVMPassBuilderOptionsSetAAPipeline(LLVMPassBuilderOptionsRef Options,
const char *AAPipeline) {
unwrap(Options)->AAPipeline = AAPipeline;
}

void LLVMPassBuilderOptionsSetLoopInterleaving(
LLVMPassBuilderOptionsRef Options, LLVMBool LoopInterleaving) {
unwrap(Options)->PTO.LoopInterleaving = LoopInterleaving;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ TEST_F(PassBuilderCTest, Basic) {
LLVMPassBuilderOptionsSetLoopUnrolling(Options, 1);
LLVMPassBuilderOptionsSetVerifyEach(Options, 1);
LLVMPassBuilderOptionsSetDebugLogging(Options, 0);
LLVMPassBuilderOptionsSetAAPipeline(Options, "basic-aa");
if (LLVMErrorRef E = LLVMRunPasses(Module, "default<O2>", TM, Options)) {
char *Msg = LLVMGetErrorMessage(E);
LLVMConsumeError(E);
Expand Down

0 comments on commit 8966c71

Please sign in to comment.