diff --git a/llvm/include/llvm-c/Transforms/PassBuilder.h b/llvm/include/llvm-c/Transforms/PassBuilder.h --- a/llvm/include/llvm-c/Transforms/PassBuilder.h +++ b/llvm/include/llvm-c/Transforms/PassBuilder.h @@ -20,32 +20,13 @@ LLVM_C_EXTERN_C_BEGIN -/** - * A reference to an llvm::PassBuilder instance - */ -typedef struct LLVMOpaquePassBuilder *LLVMPassBuilderRef; - /** * A reference to an llvm::PipelineTuningOptions instance */ typedef struct LLVMOpaquePipelineTuningOptions *LLVMPipelineTuningOptionsRef; /** - * Create a new pass builder - * - * Ownership of the returned instance is given to the client, and they are - * responsible for it. Unless the client hands the ownership of the PassBuilder - * to LLVMRunPassBuilder, they are responsible for freeing it with - * LLVMDisposePassBuilder. - * - * If DebugLogging is enabled, then debug logging will be printed to stderr. - */ -LLVMPassBuilderRef LLVMCreatePassBuilder(LLVMBool DebugLogging, - LLVMTargetMachineRef TM, - LLVMPipelineTuningOptionsRef); - -/** - * Run a pass builder over an entire module + * Construct and run a set of passes over a module * * This function takes a string with the passes that should be used. The format * of this string is the same as opt's -passes argument for the new pass @@ -53,23 +34,16 @@ * pipelines may also be invoked using `default` and friends. See opt for * full reference of the Passes format. * - * This function takes ownership of the provided PassBuilder. The PassBuilder - * should not be used again after calling this function. - * * If Debug is enabled, then debug logging from the analysis managers and * standard instrumentation will be printed to stderr. * * If VerifyEach is enabled, then a module verification pass will be ran in * addition to the other passes. */ -LLVMErrorRef LLVMRunPassBuilder(LLVMPassBuilderRef PB, LLVMModuleRef M, - LLVMBool Debug, LLVMBool VerifyEach, - const char *Passes); - -/** - * Dispose of a heap-allocated PassBuilder instance - */ -void LLVMDisposePassBuilder(LLVMPassBuilderRef PB); +LLVMErrorRef LLVMRunPasses(LLVMTargetMachineRef TM, + LLVMPipelineTuningOptionsRef PTO, LLVMModuleRef M, + LLVMBool Debug, LLVMBool VerifyEach, + const char *Passes); /** * Create a new set of tunable pipeline options for a PassBuilder instance @@ -78,12 +52,34 @@ * responsible for it. The client should call LLVMDisposePipelineTuningOptions * to free the pipeline tuning options. */ -LLVMPipelineTuningOptionsRef LLVMCreatePipelineTuningOptions( - LLVMBool LoopInterleaving, LLVMBool LoopVectorization, - LLVMBool SLPVectorization, LLVMBool LoopUnrolling, - LLVMBool ForgetAllSCEVInLoopUnroll, unsigned LicmMssaOptCap, - unsigned LicmMssaNoAccForPromotionCap, LLVMBool CallGraphProfile, - LLVMBool MergeFunctions); +LLVMPipelineTuningOptionsRef LLVMCreatePipelineTuningOptions(); + +void LLVMPipelineTuningOptionsSetLoopInterleaving( + LLVMPipelineTuningOptionsRef PTO, LLVMBool LoopInterleaving); + +void LLVMPipelineTuningOptionsSetLoopVectorization( + LLVMPipelineTuningOptionsRef PTO, LLVMBool LoopVectorization); + +void LLVMPipelineTuningOptionsSetSLPVectorization( + LLVMPipelineTuningOptionsRef PTO, LLVMBool SLPVectorization); + +void LLVMPipelineTuningOptionsSetLoopUnrolling(LLVMPipelineTuningOptionsRef PTO, + LLVMBool LoopUnrolling); + +void LLVMPipelineTuningOptionsSetForgetAllSCEVInLoopUnroll( + LLVMPipelineTuningOptionsRef PTO, LLVMBool ForgetAllSCEVInLoopUnroll); + +void LLVMPipelineTuningOptionsSetLicmMssaOptCap( + LLVMPipelineTuningOptionsRef PTO, unsigned LicmMssaOptCap); + +void LLVMPipelineTuningOptionsSetLicmMssaNoAccForPromotionCap( + LLVMPipelineTuningOptionsRef PTO, unsigned LicmMssaNoAccForPromotionCap); + +void LLVMPipelineTuningOptionsSetCallGraphProfile( + LLVMPipelineTuningOptionsRef PTO, LLVMBool CallGraphProfile); + +void LLVMPipelineTuningOptionsSetMergeFunctions( + LLVMPipelineTuningOptionsRef PTO, LLVMBool MergeFunctions); /** * Dispose of a heap-allocated PipelineTuningOptions instance diff --git a/llvm/lib/Passes/PassBuilderBindings.cpp b/llvm/lib/Passes/PassBuilderBindings.cpp --- a/llvm/lib/Passes/PassBuilderBindings.cpp +++ b/llvm/lib/Passes/PassBuilderBindings.cpp @@ -23,68 +23,92 @@ return reinterpret_cast(P); } -DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PassBuilder, LLVMPassBuilderRef) DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PipelineTuningOptions, LLVMPipelineTuningOptionsRef) -LLVMPassBuilderRef LLVMCreatePassBuilder(LLVMBool DebugLogging, - LLVMTargetMachineRef TM, - LLVMPipelineTuningOptionsRef PTO) { +LLVMErrorRef LLVMRunPasses(LLVMTargetMachineRef TM, + LLVMPipelineTuningOptionsRef PTO, + LLVMModuleRef M, LLVMBool Debug, + LLVMBool VerifyEach, const char *Passes) { TargetMachine *Machine = unwrap(TM); PipelineTuningOptions *Opts = unwrap(PTO); - auto *PB = new PassBuilder(DebugLogging, Machine, *Opts); - return wrap(PB); -} - -LLVMErrorRef LLVMRunPassBuilder(LLVMPassBuilderRef PB, LLVMModuleRef M, - LLVMBool Debug, LLVMBool VerifyEach, - const char *Passes) { - PassBuilder *P = unwrap(PB); Module *Mod = unwrap(M); + PassInstrumentationCallbacks PIC; + PassBuilder PB(Debug, Machine, *Opts, None, &PIC); + LoopAnalysisManager LAM(Debug); FunctionAnalysisManager FAM(Debug); CGSCCAnalysisManager CGAM(Debug); ModuleAnalysisManager MAM(Debug); - P->registerLoopAnalyses(LAM); - P->registerFunctionAnalyses(FAM); - P->registerCGSCCAnalyses(CGAM); - P->registerModuleAnalyses(MAM); - P->crossRegisterProxies(LAM, FAM, CGAM, MAM); + PB.registerLoopAnalyses(LAM); + PB.registerFunctionAnalyses(FAM); + PB.registerCGSCCAnalyses(CGAM); + PB.registerModuleAnalyses(MAM); + PB.crossRegisterProxies(LAM, FAM, CGAM, MAM); + StandardInstrumentations SI(Debug, VerifyEach); + SI.registerCallbacks(PIC, &FAM); ModulePassManager MPM(Debug); if (VerifyEach) { MPM.addPass(VerifierPass()); } - if (auto Err = P->parsePassPipeline(MPM, Passes)) { + if (auto Err = PB.parsePassPipeline(MPM, Passes)) { return wrap(std::move(Err)); } MPM.run(*Mod, MAM); - LLVMDisposePassBuilder(PB); return LLVMErrorSuccess; } -void LLVMDisposePassBuilder(LLVMPassBuilderRef PB) { delete unwrap(PB); } - -LLVMPipelineTuningOptionsRef LLVMCreatePipelineTuningOptions( - LLVMBool LoopInterleaving, LLVMBool LoopVectorization, - LLVMBool SLPVectorization, LLVMBool LoopUnrolling, - LLVMBool ForgetAllSCEVInLoopUnroll, unsigned LicmMssaOptCap, - unsigned LicmMssaNoAccForPromotionCap, LLVMBool CallGraphProfile, - LLVMBool MergeFunctions) { - auto *Options = new PipelineTuningOptions(); - Options->LoopInterleaving = LoopInterleaving; - Options->LoopVectorization = LoopVectorization; - Options->SLPVectorization = SLPVectorization; - Options->LoopUnrolling = LoopUnrolling; - Options->ForgetAllSCEVInLoopUnroll = ForgetAllSCEVInLoopUnroll; - Options->LicmMssaOptCap = LicmMssaOptCap; - Options->LicmMssaNoAccForPromotionCap = LicmMssaNoAccForPromotionCap; - Options->CallGraphProfile = CallGraphProfile; - Options->MergeFunctions = MergeFunctions; - return wrap(Options); +LLVMPipelineTuningOptionsRef LLVMCreatePipelineTuningOptions() { + return wrap(new PipelineTuningOptions()); +} + +void LLVMPipelineTuningOptionsSetLoopInterleaving( + LLVMPipelineTuningOptionsRef PTO, LLVMBool LoopInterleaving) { + unwrap(PTO)->LoopInterleaving = LoopInterleaving; +} + +void LLVMPipelineTuningOptionsSetLoopVectorization( + LLVMPipelineTuningOptionsRef PTO, LLVMBool LoopVectorization) { + unwrap(PTO)->LoopVectorization = LoopVectorization; +} + +void LLVMPipelineTuningOptionsSetSLPVectorization( + LLVMPipelineTuningOptionsRef PTO, LLVMBool SLPVectorization) { + unwrap(PTO)->SLPVectorization = SLPVectorization; +} + +void LLVMPipelineTuningOptionsSetLoopUnrolling(LLVMPipelineTuningOptionsRef PTO, + LLVMBool LoopUnrolling) { + unwrap(PTO)->LoopUnrolling = LoopUnrolling; +} + +void LLVMPipelineTuningOptionsSetForgetAllSCEVInLoopUnroll( + LLVMPipelineTuningOptionsRef PTO, LLVMBool ForgetAllSCEVInLoopUnroll) { + unwrap(PTO)->ForgetAllSCEVInLoopUnroll = ForgetAllSCEVInLoopUnroll; +} + +void LLVMPipelineTuningOptionsSetLicmMssaOptCap( + LLVMPipelineTuningOptionsRef PTO, unsigned LicmMssaOptCap) { + unwrap(PTO)->LicmMssaOptCap = LicmMssaOptCap; +} + +void LLVMPipelineTuningOptionsSetLicmMssaNoAccForPromotionCap( + LLVMPipelineTuningOptionsRef PTO, unsigned LicmMssaNoAccForPromotionCap) { + unwrap(PTO)->LicmMssaNoAccForPromotionCap = LicmMssaNoAccForPromotionCap; +} + +void LLVMPipelineTuningOptionsSetCallGraphProfile( + LLVMPipelineTuningOptionsRef PTO, LLVMBool CallGraphProfile) { + unwrap(PTO)->CallGraphProfile = CallGraphProfile; +} + +void LLVMPipelineTuningOptionsSetMergeFunctions( + LLVMPipelineTuningOptionsRef PTO, LLVMBool MergeFunctions) { + unwrap(PTO)->MergeFunctions = MergeFunctions; } void LLVMDisposePipelineTuningOptions(LLVMPipelineTuningOptionsRef PTO) { delete unwrap(PTO); } \ No newline at end of file diff --git a/llvm/unittests/Passes/PassBuilderBindingsTest.cpp b/llvm/unittests/Passes/PassBuilderBindingsTest.cpp --- a/llvm/unittests/Passes/PassBuilderBindingsTest.cpp +++ b/llvm/unittests/Passes/PassBuilderBindingsTest.cpp @@ -22,24 +22,23 @@ if (LLVMGetTargetFromTriple(Triple, &Target, &Err)) { FAIL() << "Failed to create target from default triple: " << Err; } - LLVMTargetMachineRef TM = LLVMCreateTargetMachine( - Target, Triple, "generic", "", LLVMCodeGenLevelDefault, - LLVMRelocDefault, LLVMCodeModelDefault); - PTO = LLVMCreatePipelineTuningOptions(0, 0, 0, 0, 0, 0, 0, 0, 0); - PB = LLVMCreatePassBuilder(false, TM, PTO); - + TM = LLVMCreateTargetMachine(Target, Triple, "generic", "", + LLVMCodeGenLevelDefault, LLVMRelocDefault, + LLVMCodeModelDefault); + PTO = LLVMCreatePipelineTuningOptions(); Context = LLVMContextCreate(); Module = LLVMModuleCreateWithNameInContext("test", Context); } void TearDown() override { + LLVMDisposeTargetMachine(TM); LLVMDisposePipelineTuningOptions(PTO); LLVMDisposeModule(Module); LLVMContextDispose(Context); } public: - LLVMPassBuilderRef PB; + LLVMTargetMachineRef TM; LLVMPipelineTuningOptionsRef PTO; LLVMModuleRef Module; LLVMContextRef Context; @@ -47,7 +46,7 @@ TEST_F(PassBuilderCTest, Basic) { if (LLVMErrorRef E = - LLVMRunPassBuilder(PB, Module, true, true, "default")) { + LLVMRunPasses(TM, PTO, Module, false, true, "default")) { char *Msg = LLVMGetErrorMessage(E); LLVMConsumeError(E); FAIL() << "Failed to run passes: " << Msg; @@ -55,12 +54,10 @@ } TEST_F(PassBuilderCTest, InvalidPassIsError) { - LLVMErrorRef E1 = LLVMRunPassBuilder(PB, Module, true, true, ""); - LLVMErrorRef E2 = - LLVMRunPassBuilder(PB, Module, true, true, "does-not-exist-pass"); + LLVMErrorRef E1 = LLVMRunPasses(TM, PTO, Module, false, true, ""); + LLVMErrorRef E2 = LLVMRunPasses(TM, PTO, Module, false, true, "does-not-exist-pass"); ASSERT_TRUE(E1); ASSERT_TRUE(E2); LLVMConsumeError(E1); LLVMConsumeError(E2); - LLVMDisposePassBuilder(PB); }