Mesa (master): glsl: Skip the rest of loop unrolling if no loops were found .

Eric Anholt anholt at kemper.freedesktop.org
Tue Jan 18 18:34:21 UTC 2011


Module: Mesa
Branch: master
Commit: 58c988ada56114b56477983f66b4039219f1a82c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=58c988ada56114b56477983f66b4039219f1a82c

Author: Eric Anholt <eric at anholt.net>
Date:   Mon Jan 17 22:07:55 2011 -0800

glsl: Skip the rest of loop unrolling if no loops were found.

Shaves 1.6% (+/- 1.0%) off of ff_fragment_shader glean texCombine time
(n=5).

---

 src/glsl/glsl_parser_extras.cpp |    6 ++++--
 src/glsl/loop_analysis.cpp      |    3 +++
 src/glsl/loop_analysis.h        |    2 ++
 3 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
index cbeacd5..77885d4 100644
--- a/src/glsl/glsl_parser_extras.cpp
+++ b/src/glsl/glsl_parser_extras.cpp
@@ -748,8 +748,10 @@ do_common_optimization(exec_list *ir, bool linked, unsigned max_unroll_iteration
    progress = optimize_redundant_jumps(ir) || progress;
 
    loop_state *ls = analyze_loop_variables(ir);
-   progress = set_loop_controls(ir, ls) || progress;
-   progress = unroll_loops(ir, ls, max_unroll_iterations) || progress;
+   if (ls->loop_found) {
+      progress = set_loop_controls(ir, ls) || progress;
+      progress = unroll_loops(ir, ls, max_unroll_iterations) || progress;
+   }
    delete ls;
 
    return progress;
diff --git a/src/glsl/loop_analysis.cpp b/src/glsl/loop_analysis.cpp
index ff7adf0..3cf86eb 100644
--- a/src/glsl/loop_analysis.cpp
+++ b/src/glsl/loop_analysis.cpp
@@ -38,6 +38,7 @@ loop_state::loop_state()
    this->ht = hash_table_ctor(0, hash_table_pointer_hash,
 			      hash_table_pointer_compare);
    this->mem_ctx = talloc_init("loop state");
+   this->loop_found = false;
 }
 
 
@@ -52,7 +53,9 @@ loop_variable_state *
 loop_state::insert(ir_loop *ir)
 {
    loop_variable_state *ls = new(this->mem_ctx) loop_variable_state;
+
    hash_table_insert(this->ht, ls, ir);
+   this->loop_found = true;
 
    return ls;
 }
diff --git a/src/glsl/loop_analysis.h b/src/glsl/loop_analysis.h
index 7b0511f..2297308 100644
--- a/src/glsl/loop_analysis.h
+++ b/src/glsl/loop_analysis.h
@@ -214,6 +214,8 @@ public:
 
    loop_variable_state *insert(ir_loop *ir);
 
+   bool loop_found;
+
 private:
    loop_state();
 




More information about the mesa-commit mailing list