From d32690b43c91d4aab938da83704e4ebb68fccf6f Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 26 Jun 2019 07:37:20 +1000 Subject: [PATCH] gallivm: add coroutine pass manager support coroutines require a proper pass manager, so add the passes to the correct places Reviewed-by: Roland Scheidegger --- src/gallium/auxiliary/gallivm/lp_bld.h | 5 +++++ src/gallium/auxiliary/gallivm/lp_bld_init.c | 27 ++++++++++++++++++++++++++- src/gallium/auxiliary/gallivm/lp_bld_init.h | 1 + 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld.h b/src/gallium/auxiliary/gallivm/lp_bld.h index ca23005..a6a6c1a 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld.h +++ b/src/gallium/auxiliary/gallivm/lp_bld.h @@ -95,6 +95,11 @@ typedef void *LLVMMCJITMemoryManagerRef; #define LLVMInsertBasicBlock ILLEGAL_LLVM_FUNCTION #define LLVMCreateBuilder ILLEGAL_LLVM_FUNCTION +#if HAVE_LLVM >= 0x0800 +#define GALLIVM_HAVE_CORO 1 +#else +#define GALLIVM_HAVE_CORO 0 +#endif /* * Before LLVM 3.4 LLVMSetAlignment only supported GlobalValue, not diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c b/src/gallium/auxiliary/gallivm/lp_bld_init.c index 544c23e..b0781eb 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_init.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c @@ -44,7 +44,9 @@ #include #endif #include - +#if GALLIVM_HAVE_CORO +#include +#endif /* Only MCJIT is available as of LLVM SVN r216982 */ #if HAVE_LLVM >= 0x0306 @@ -125,6 +127,10 @@ create_pass_manager(struct gallivm_state *gallivm) gallivm->passmgr = LLVMCreateFunctionPassManagerForModule(gallivm->module); if (!gallivm->passmgr) return FALSE; + +#if GALLIVM_HAVE_CORO + gallivm->cgpassmgr = LLVMCreatePassManager(); +#endif /* * TODO: some per module pass manager with IPO passes might be helpful - * the generated texture functions may benefit from inlining if they are @@ -144,6 +150,12 @@ create_pass_manager(struct gallivm_state *gallivm) free(td_str); } +#if GALLIVM_HAVE_CORO + LLVMAddCoroEarlyPass(gallivm->cgpassmgr); + LLVMAddCoroSplitPass(gallivm->cgpassmgr); + LLVMAddCoroElidePass(gallivm->cgpassmgr); +#endif + if ((gallivm_perf & GALLIVM_PERF_NO_OPT) == 0) { /* * TODO: Evaluate passes some more - keeping in mind @@ -170,6 +182,9 @@ create_pass_manager(struct gallivm_state *gallivm) LLVMAddConstantPropagationPass(gallivm->passmgr); LLVMAddInstructionCombiningPass(gallivm->passmgr); LLVMAddGVNPass(gallivm->passmgr); +#if GALLIVM_HAVE_CORO + LLVMAddCoroCleanupPass(gallivm->passmgr); +#endif } else { /* We need at least this pass to prevent the backends to fail in @@ -193,6 +208,12 @@ gallivm_free_ir(struct gallivm_state *gallivm) LLVMDisposePassManager(gallivm->passmgr); } +#if GALLIVM_HAVE_CORO + if (gallivm->cgpassmgr) { + LLVMDisposePassManager(gallivm->cgpassmgr); + } +#endif + if (gallivm->engine) { /* This will already destroy any associated module */ LLVMDisposeExecutionEngine(gallivm->engine); @@ -219,6 +240,7 @@ gallivm_free_ir(struct gallivm_state *gallivm) gallivm->target = NULL; gallivm->module = NULL; gallivm->module_name = NULL; + gallivm->cgpassmgr = NULL; gallivm->passmgr = NULL; gallivm->context = NULL; gallivm->builder = NULL; @@ -610,6 +632,9 @@ gallivm_compile_module(struct gallivm_state *gallivm) if (gallivm_debug & GALLIVM_DEBUG_PERF) time_begin = os_time_get(); +#if GALLIVM_HAVE_CORO + LLVMRunPassManager(gallivm->cgpassmgr, gallivm->module); +#endif /* Run optimization passes */ LLVMInitializeFunctionPassManager(gallivm->passmgr); func = LLVMGetFirstFunction(gallivm->module); diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.h b/src/gallium/auxiliary/gallivm/lp_bld_init.h index 62ca0c7..56279ce 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_init.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.h @@ -46,6 +46,7 @@ struct gallivm_state LLVMExecutionEngineRef engine; LLVMTargetDataRef target; LLVMPassManagerRef passmgr; + LLVMPassManagerRef cgpassmgr; LLVMContextRef context; LLVMBuilderRef builder; LLVMMCJITMemoryManagerRef memorymgr; -- 2.7.4