mirror of
https://gitee.com/openharmony/third_party_mesa3d
synced 2024-11-23 07:19:50 +00:00
gallivm: add coroutine pass manager support
coroutines require a proper pass manager, so add the passes to the correct places Reviewed-by: Roland Scheidegger <sroland@vmware.com>
This commit is contained in:
parent
9cf1340e4f
commit
d32690b43c
@ -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
|
||||
|
@ -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);
|
||||
|
@ -46,6 +46,7 @@ struct gallivm_state
|
||||
LLVMExecutionEngineRef engine;
|
||||
LLVMTargetDataRef target;
|
||||
LLVMPassManagerRef passmgr;
|
||||
LLVMPassManagerRef cgpassmgr;
|
||||
LLVMContextRef context;
|
||||
LLVMBuilderRef builder;
|
||||
LLVMMCJITMemoryManagerRef memorymgr;
|
||||
|
Loading…
Reference in New Issue
Block a user