mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 09:26:07 +00:00
[LLVM][NewPM] Add a C API for setting the PassBuilder AA pipeline. (#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
This commit is contained in:
parent
812ae91d54
commit
241f9e7492
@ -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);
|
||||
|
||||
|
@ -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"
|
||||
@ -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
|
||||
@ -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);
|
||||
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user