From 36ac6e3d0c017737dc5cc7b33507859141465372 Mon Sep 17 00:00:00 2001 From: Mamy Ratsimbazafy Date: Sun, 21 Jul 2024 02:36:51 +0200 Subject: [PATCH] upd(llvm): replace old PassManager by the new PassBuilder --- constantine/math_compiler/codegen_nvidia.nim | 38 ++++++--------- .../platforms/llvm/bindings/llvm_abi.nim | 46 +------------------ 2 files changed, 16 insertions(+), 68 deletions(-) diff --git a/constantine/math_compiler/codegen_nvidia.nim b/constantine/math_compiler/codegen_nvidia.nim index f74bcd15..0315ad13 100644 --- a/constantine/math_compiler/codegen_nvidia.nim +++ b/constantine/math_compiler/codegen_nvidia.nim @@ -187,30 +187,20 @@ proc codegenNvidiaPTX*(asy: Assembler_LLVM, sm: tuple[major, minor: int32]): str codeModel = CodeModelDefault ) - # https://www.llvm.org/docs/Passes.html - let pm = createPassManager() - - machine.addAnalysisPasses(pm) - pm.addDeduceFunctionAttributesPass() - pm.addMemCpyOptPass() - pm.addScalarReplacementOfAggregatesPass() - pm.addPromoteMemoryToRegisterPass() - pm.addGlobalValueNumberingPass() - pm.addDeadStoreEliminationPass() - pm.addInstructionCombiningPass() - pm.addFunctionInliningPass() - pm.addAggressiveDeadCodeEliminationPass() - - when false: - # As most (all?) of our code is straightline, unoptimizable inline assembly, no loop and no branches - # most optimizations, even at -O3, are not applicable - let pmb = createPassManagerBuilder() - pmb.setOptLevel(3) - pmb.populateModulePassManager(pm) - pmb.dispose() - - pm.run(asy.module) - pm.dispose() + let pbo = createPassBuilderOptions() + pbo.setMergeFunctions() + let err = asy.module.runPasses( + "default,function-attrs,memcpyopt,sroa,mem2reg,gvn,dse,instcombine,inline,adce", + machine, + pbo + ) + if not err.pointer().isNil(): + writeStackTrace() + let errMsg = err.getErrorMessage() + stderr.write("\"codegenNvidiaPTX\" for module '" & astToStr(module) & "' " & $instantiationInfo() & + " exited with error: " & $cstring(errMsg) & '\n') + errMsg.dispose() + quit 1 return machine.emitToString(asy.module, AssemblyFile) diff --git a/constantine/platforms/llvm/bindings/llvm_abi.nim b/constantine/platforms/llvm/bindings/llvm_abi.nim index 596a9150..981bcb9a 100644 --- a/constantine/platforms/llvm/bindings/llvm_abi.nim +++ b/constantine/platforms/llvm/bindings/llvm_abi.nim @@ -43,8 +43,6 @@ type TargetRef* = distinct pointer ExecutionEngineRef* = distinct pointer TargetMachineRef* = distinct pointer - PassManagerRef* = distinct pointer - PassManagerBuilderRef* = distinct pointer PassBuilderOptionsRef* = distinct pointer TypeRef* = distinct pointer ValueRef* = distinct pointer @@ -215,53 +213,13 @@ proc targetMachineEmitToMemoryBuffer*(t: TargetMachineRef, m: ModuleRef, # - https://blog.llvm.org/posts/2021-03-26-the-new-pass-manager/ # - https://llvm.org/docs/NewPassManager.html -# https://llvm.org/doxygen/group__LLVMCCorePassManagers.html -# # header: "" - -proc createPassManager*(): PassManagerRef {.importc: "LLVMCreatePassManager".} -proc dispose*(pm: PassManagerRef) {.importc: "LLVMDisposePassManager".} -proc run*(pm: PassManagerRef, module: ModuleRef) {. importc: "LLVMRunPassManager".} - -# https://llvm.org/doxygen/group__LLVMCTransformsPassManagerBuilder.html -# header: "" - -proc createPassManagerBuilder*(): PassManagerBuilderRef {.importc: "LLVMPassManagerBuilderCreate".} -proc dispose*(pmb: PassManagerBuilderRef) {.importc: "LLVMPassManagerBuilderDispose".} -proc setOptLevel*(pmb: PassManagerBuilderRef, level: uint32) {.importc: "LLVMPassManagerBuilderSetOptLevel".} -proc setSizeLevel*(pmb: PassManagerBuilderRef, level: uint32) {.importc: "LLVMPassManagerBuilderSetSizeLevel".} -proc populateModulePassManager*(pmb: PassManagerBuilderRef, legacyPM: PassManagerRef) {. importc: "LLVMPassManagerBuilderPopulateModulePassManager".} - # https://llvm.org/doxygen/group__LLVMCCoreNewPM.html # header: "" proc createPassBuilderOptions*(): PassBuilderOptionsRef {.importc: "LLVMCreatePassBuilderOptions".} proc dispose*(pbo: PassBuilderOptionsRef) {.importc: "LLVMDisposePassBuilderOptions".} -proc runPasses(module: ModuleRef, passes: cstring, machine: TargetMachineRef, pbo: PassBuilderOptionsRef): ErrorRef {.used, importc: "LLVMRunPasses".} - -# https://llvm.org/doxygen/group__LLVMCTarget.html -proc addTargetLibraryInfo*(tli: TargetLibraryInfoRef, pm: PassManagerRef) {.importc: "LLVMAddTargetLibraryInfo".} - # There doesn't seem to be a way to instantiate TargetLibraryInfoRef :/ -proc addAnalysisPasses*(machine: TargetMachineRef, pm: PassManagerRef) {.importc: "LLVMAddAnalysisPasses".} - -# https://www.llvm.org/docs/Passes.html -# ------------------------------------- - -# https://llvm.org/doxygen/group__LLVMCTransformsInstCombine.html -proc addInstructionCombiningPass*(pm: PassManagerRef) {.importc: "LLVMAddInstructionCombiningPass".} - -# https://llvm.org/doxygen/group__LLVMCTransformsUtils.html -proc addPromoteMemoryToRegisterPass*(pm: PassManagerRef) {.importc: "LLVMAddPromoteMemoryToRegisterPass".} - -# https://llvm.org/doxygen/group__LLVMCTransformsScalar.html -proc addAggressiveDeadCodeEliminationPass*(pm: PassManagerRef) {.importc: "LLVMAddAggressiveDCEPass".} -proc addDeadStoreEliminationPass*(pm: PassManagerRef) {.importc: "LLVMAddDeadStoreEliminationPass".} -proc addGlobalValueNumberingPass*(pm: PassManagerRef) {.importc: "LLVMAddNewGVNPass".} -proc addMemCpyOptPass*(pm: PassManagerRef) {.importc: "LLVMAddMemCpyOptPass".} -proc addScalarReplacementOfAggregatesPass*(pm: PassManagerRef) {.importc: "LLVMAddScalarReplAggregatesPass".} - -# https://llvm.org/doxygen/group__LLVMCTransformsIPO.html -proc addDeduceFunctionAttributesPass*(pm: PassManagerRef) {.importc: "LLVMAddFunctionAttrsPass".} -proc addFunctionInliningPass*(pm: PassManagerRef) {.importc: "LLVMAddFunctionInliningPass".} +proc runPasses*(module: ModuleRef, passes: cstring, machine: TargetMachineRef, pbo: PassBuilderOptionsRef): ErrorRef {.used, importc: "LLVMRunPasses".} +proc setMergeFunctions*(pbo: PassBuilderOptionsRef, mergeFunctions = LlvmBool(1)) {.importc: "LLVMPassBuilderOptionsSetMergeFunctions".} # ############################################################ #