diff --git a/constantine/math_compiler/codegen_nvidia.nim b/constantine/math_compiler/codegen_nvidia.nim index 72df96b49..0315ad131 100644 --- a/constantine/math_compiler/codegen_nvidia.nim +++ b/constantine/math_compiler/codegen_nvidia.nim @@ -169,7 +169,6 @@ proc codegenNvidiaPTX*(asy: Assembler_LLVM, sm: tuple[major, minor: int32]): str ## - https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#compute-capabilities ## ## This requires the following function to be called beforehand: - ## - initializePasses() ## - initializeFullNVPTXTarget() debug: doAssert asy.backend == bkNvidiaPTX @@ -188,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 4927c1357..981bcb9ac 100644 --- a/constantine/platforms/llvm/bindings/llvm_abi.nim +++ b/constantine/platforms/llvm/bindings/llvm_abi.nim @@ -43,10 +43,7 @@ type TargetRef* = distinct pointer ExecutionEngineRef* = distinct pointer TargetMachineRef* = distinct pointer - PassManagerRef* = distinct pointer - PassManagerBuilderRef* = distinct pointer PassBuilderOptionsRef* = distinct pointer - PassRegistryRef* = distinct pointer TypeRef* = distinct pointer ValueRef* = distinct pointer MetadataRef = distinct pointer @@ -216,78 +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/docs/doxygen/group__LLVMCInitialization.html -# header: "" - -{.push used.} -proc getGlobalPassRegistry(): PassRegistryRef {.importc: "LLVMGetGlobalPassRegistry".} - -proc initializeCore(registry: PassRegistryRef) {.importc: "LLVMInitializeCore".} -proc initializeTransformUtils(registry: PassRegistryRef) {.importc: "LLVMInitializeTransformUtils".} -proc initializeScalarOpts(registry: PassRegistryRef) {.importc: "LLVMInitializeScalarOpts".} -proc initializeVectorization(registry: PassRegistryRef) {.importc: "LLVMInitializeVectorization".} -proc initializeInstCombine(registry: PassRegistryRef) {.importc: "LLVMInitializeInstCombine".} -proc initializeIPO(registry: PassRegistryRef) {.importc: "LLVMInitializeIPO".} -proc initializeAnalysis(registry: PassRegistryRef) {.importc: "LLVMInitializeAnalysis".} -proc initializeIPA(registry: PassRegistryRef) {.importc: "LLVMInitializeIPA".} -proc initializeCodeGen(registry: PassRegistryRef) {.importc: "LLVMInitializeCodeGen".} -proc initializeTarget(registry: PassRegistryRef) {.importc: "LLVMInitializeTarget".} - -# Removed in LLVM 16 -# ------------------ -# proc initializeObjCARCOpts(registry: PassRegistryRef) {.importc: "LLVMInitializeObjCARCOpts".} -# proc initializeAggressiveInstCombiner(registry: PassRegistryRef) {.importc: "LLVMInitializeAggressiveInstCombiner".} -# proc initializeInstrumentation(registry: PassRegistryRef) {.importc: "LLVMInitializeInstrumentation".} - -{.pop.} - -# 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".} # ############################################################ # diff --git a/constantine/platforms/llvm/llvm.nim b/constantine/platforms/llvm/llvm.nim index 39e106f66..c064897bf 100644 --- a/constantine/platforms/llvm/llvm.nim +++ b/constantine/platforms/llvm/llvm.nim @@ -138,29 +138,6 @@ template emitToString*(t: TargetMachineRef, m: ModuleRef, codegen: CodeGenFileTy mb.dispose() emitted -# Target Machine -# ------------------------------------------------------------ - -proc initializePasses* = - let registry = getGlobalPassRegistry() - - registry.initializeCore() - registry.initializeTransformUtils() - registry.initializeScalarOpts() - registry.initializeVectorization() - registry.initializeInstCombine() - registry.initializeIPO() - registry.initializeAnalysis() - registry.initializeIPA() - registry.initializeCodeGen() - registry.initializeTarget() - - # Removed in LLVM 16 - # -------------------------------- - # registry.initializeObjCARCOpts() - # registry.initializeAggressiveInstCombiner() - # registry.initializeInstrumentation() - # Builder # ------------------------------------------------------------ diff --git a/constantine/platforms/type_ff.nim b/constantine/platforms/type_ff.nim deleted file mode 100644 index 8ce6fb327..000000000 --- a/constantine/platforms/type_ff.nim +++ /dev/null @@ -1,13 +0,0 @@ -# Constantine -# Copyright (c) 2018-2019 Status Research & Development GmbH -# Copyright (c) 2020-Present Mamy André-Ratsimbazafy -# Licensed and distributed under either of -# * MIT license (license terms in the root directory or at http://opensource.org/licenses/MIT). -# * Apache v2 license (license terms in the root directory or at http://www.apache.org/licenses/LICENSE-2.0). -# at your option. This file may not be copied, modified, or distributed except according to those terms. - -import - ./abstractions, - ../named/config_fields_and_curves - -# TODO: Keep internal and use bigint(Fp[Foo]) and bigint(Fr[Foo]) diff --git a/tests/gpu/t_nvidia_fp.nim b/tests/gpu/t_nvidia_fp.nim index e40a3c0ef..1384aa92d 100644 --- a/tests/gpu/t_nvidia_fp.nim +++ b/tests/gpu/t_nvidia_fp.nim @@ -58,7 +58,6 @@ proc genFieldMulPTX(asy: Assembler_LLVM, cm: CurveMetadata) = # Init LLVM # ------------------------- initializeFullNVPTXTarget() -initializePasses() # Init GPU # -------------------------