From: José Fonseca Date: Mon, 12 May 2014 13:29:04 +0000 (+0100) Subject: gallivm: Run passes per module, not per function. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2ea923cf571235dfe573c35c3f0d90f632bd86d8;p=mesa.git gallivm: Run passes per module, not per function. This is how it is meant to be done nowadays. Reviewed-by: Roland Scheidegger --- diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c b/src/gallium/auxiliary/gallivm/lp_bld_init.c index 2d854e996f6..a3549c171e9 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_init.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c @@ -498,32 +498,6 @@ gallivm_destroy(struct gallivm_state *gallivm) } -/** - * Validate and optimze a function. - */ -static void -gallivm_optimize_function(struct gallivm_state *gallivm, - LLVMValueRef func) -{ - if (0) { - debug_printf("optimizing %s...\n", LLVMGetValueName(func)); - } - - assert(gallivm->passmgr); - - /* Apply optimizations to LLVM IR */ - LLVMRunFunctionPassManager(gallivm->passmgr, func); - - if (0) { - if (gallivm_debug & GALLIVM_DEBUG_IR) { - /* Print the LLVM IR to stderr */ - lp_debug_dump_value(func); - debug_printf("\n"); - } - } -} - - /** * Validate a function. */ @@ -540,8 +514,6 @@ gallivm_verify_function(struct gallivm_state *gallivm, } #endif - gallivm_optimize_function(gallivm, func); - if (gallivm_debug & GALLIVM_DEBUG_IR) { /* Print the LLVM IR to stderr */ lp_debug_dump_value(func); @@ -553,8 +525,27 @@ gallivm_verify_function(struct gallivm_state *gallivm, void gallivm_compile_module(struct gallivm_state *gallivm) { + LLVMValueRef func; + assert(!gallivm->compiled); + if (gallivm->builder) { + LLVMDisposeBuilder(gallivm->builder); + gallivm->builder = NULL; + } + + /* Run optimization passes */ + LLVMInitializeFunctionPassManager(gallivm->passmgr); + func = LLVMGetFirstFunction(gallivm->module); + while (func) { + if (0) { + debug_printf("optimizing %s...\n", LLVMGetValueName(func)); + } + LLVMRunFunctionPassManager(gallivm->passmgr, func); + func = LLVMGetNextFunction(func); + } + LLVMFinalizeFunctionPassManager(gallivm->passmgr); + /* Dump byte code to a file */ if (0) { LLVMWriteBitcodeToFile(gallivm->module, "llvmpipe.bc");