aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/gallivm/lp_bld_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/auxiliary/gallivm/lp_bld_init.c')
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_init.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c b/src/gallium/auxiliary/gallivm/lp_bld_init.c
index 544c23ee96d..b0781eb97c2 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_init.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c
@@ -44,7 +44,9 @@
#include <llvm-c/Transforms/Utils.h>
#endif
#include <llvm-c/BitWriter.h>
-
+#if GALLIVM_HAVE_CORO
+#include <llvm-c/Transforms/Coroutines.h>
+#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);