aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/gallivm
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/auxiliary/gallivm')
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld.h5
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_init.c27
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_init.h1
3 files changed, 32 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld.h b/src/gallium/auxiliary/gallivm/lp_bld.h
index ca23005b808..a6a6c1add0a 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 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);
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.h b/src/gallium/auxiliary/gallivm/lp_bld_init.h
index 62ca0c7faa4..56279ce1aac 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;