gallivm: Setup a global optimization pass.
Modules are still free to setup their own optimization passes, but for the normal case it should not be necessary.
This commit is contained in:
@@ -32,6 +32,8 @@
|
||||
#include "lp_bld_debug.h"
|
||||
#include "lp_bld_init.h"
|
||||
|
||||
#include <llvm-c/Transforms/Scalar.h>
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
unsigned gallivm_debug = 0;
|
||||
@@ -50,6 +52,7 @@ LLVMModuleRef lp_build_module = NULL;
|
||||
LLVMExecutionEngineRef lp_build_engine = NULL;
|
||||
LLVMModuleProviderRef lp_build_provider = NULL;
|
||||
LLVMTargetDataRef lp_build_target = NULL;
|
||||
LLVMPassManagerRef lp_build_pass = NULL;
|
||||
|
||||
|
||||
/*
|
||||
@@ -127,6 +130,33 @@ lp_build_init(void)
|
||||
if (!lp_build_target)
|
||||
lp_build_target = LLVMGetExecutionEngineTargetData(lp_build_engine);
|
||||
|
||||
if (!lp_build_pass) {
|
||||
lp_build_pass = LLVMCreateFunctionPassManager(lp_build_provider);
|
||||
LLVMAddTargetData(lp_build_target, lp_build_pass);
|
||||
|
||||
if ((gallivm_debug & GALLIVM_DEBUG_NO_OPT) == 0) {
|
||||
/* These are the passes currently listed in llvm-c/Transforms/Scalar.h,
|
||||
* but there are more on SVN. */
|
||||
/* TODO: Add more passes */
|
||||
LLVMAddCFGSimplificationPass(lp_build_pass);
|
||||
LLVMAddPromoteMemoryToRegisterPass(lp_build_pass);
|
||||
LLVMAddConstantPropagationPass(lp_build_pass);
|
||||
if(util_cpu_caps.has_sse4_1) {
|
||||
/* FIXME: There is a bug in this pass, whereby the combination of fptosi
|
||||
* and sitofp (necessary for trunc/floor/ceil/round implementation)
|
||||
* somehow becomes invalid code.
|
||||
*/
|
||||
LLVMAddInstructionCombiningPass(lp_build_pass);
|
||||
}
|
||||
LLVMAddGVNPass(lp_build_pass);
|
||||
} else {
|
||||
/* We need at least this pass to prevent the backends to fail in
|
||||
* unexpected ways.
|
||||
*/
|
||||
LLVMAddPromoteMemoryToRegisterPass(lp_build_pass);
|
||||
}
|
||||
}
|
||||
|
||||
util_cpu_detect();
|
||||
|
||||
#if 0
|
||||
|
||||
@@ -38,6 +38,7 @@ extern LLVMModuleRef lp_build_module;
|
||||
extern LLVMExecutionEngineRef lp_build_engine;
|
||||
extern LLVMModuleProviderRef lp_build_provider;
|
||||
extern LLVMTargetDataRef lp_build_target;
|
||||
extern LLVMPassManagerRef lp_build_pass;
|
||||
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user