gallivm: Run passes per module, not per function.
authorJosé Fonseca <jfonseca@vmware.com>
Mon, 12 May 2014 13:29:04 +0000 (14:29 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 14 May 2014 10:05:00 +0000 (11:05 +0100)
This is how it is meant to be done nowadays.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_init.c

index 2d854e996f6f0ddfbf64d9f8f08f8cc56bab0bfe..a3549c171e962aaa252a83a7d2b2a3d6e23cf87c 100644 (file)
@@ -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");