[Mesa-dev] [PATCH] llvmpipe: do IR counting for shader cache management after optimization.

sroland at vmware.com sroland at vmware.com
Fri May 16 13:47:01 PDT 2014


From: Roland Scheidegger <sroland at vmware.com>

2ea923cf571235dfe573c35c3f0d90f632bd86d8 had the side effect of IR counting
now being done after IR optimization instead of before. Some quick analysis
shows that there's roughly 1.5 times more IR instructions before optimization
than after, hence the effective shader cache size got quite a bit smaller.
Could counter this with an increase of the instruction limit but it probably
makes more sense to count them after optimizations, so move that code.
---
 src/gallium/auxiliary/gallivm/lp_bld_type.c | 20 +++++++++++++++++++-
 src/gallium/auxiliary/gallivm/lp_bld_type.h |  2 +-
 src/gallium/drivers/llvmpipe/lp_state_fs.c  |  4 ++--
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/src/gallium/auxiliary/gallivm/lp_bld_type.c b/src/gallium/auxiliary/gallivm/lp_bld_type.c
index 9b25e15..5a80199 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_type.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_type.c
@@ -394,7 +394,7 @@ lp_build_context_init(struct lp_build_context *bld,
 /**
  * Count the number of instructions in a function.
  */
-unsigned
+static unsigned
 lp_build_count_instructions(LLVMValueRef function)
 {
    unsigned num_instrs = 0;
@@ -414,3 +414,21 @@ lp_build_count_instructions(LLVMValueRef function)
 
    return num_instrs;
 }
+
+
+/**
+ * Count the number of instructions in a module.
+ */
+unsigned
+lp_build_count_ir_module(LLVMModuleRef module)
+{
+   LLVMValueRef func;
+   unsigned num_instrs = 0;
+
+   func = LLVMGetFirstFunction(module);
+   while (func) {
+      num_instrs += lp_build_count_instructions(func);
+      func = LLVMGetNextFunction(func);
+   }
+   return num_instrs;
+}
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_type.h b/src/gallium/auxiliary/gallivm/lp_bld_type.h
index d0b490b..191cf92 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_type.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_type.h
@@ -447,7 +447,7 @@ lp_build_context_init(struct lp_build_context *bld,
 
 
 unsigned
-lp_build_count_instructions(LLVMValueRef function);
+lp_build_count_ir_module(LLVMModuleRef module);
 
 
 #endif /* !LP_BLD_TYPE_H */
diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
index 4872e0d..0b74d15 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
@@ -2438,8 +2438,6 @@ generate_fragment(struct llvmpipe_context *lp,
    LLVMBuildRetVoid(builder);
 
    gallivm_verify_function(gallivm, function);
-
-   variant->nr_instrs += lp_build_count_instructions(function);
 }
 
 
@@ -2629,6 +2627,8 @@ generate_variant(struct llvmpipe_context *lp,
 
    gallivm_compile_module(variant->gallivm);
 
+   variant->nr_instrs += lp_build_count_ir_module(variant->gallivm->module);
+
    if (variant->function[RAST_EDGE_TEST]) {
       variant->jit_function[RAST_EDGE_TEST] = (lp_jit_frag_func)
             gallivm_jit_function(variant->gallivm,
-- 
1.9.1


More information about the mesa-dev mailing list