Mesa (master): glsl: Lower unconditional return statements.

Paul Berry stereotype441 at kemper.freedesktop.org
Fri Jul 8 17:03:40 UTC 2011


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

Author: Paul Berry <stereotype441 at gmail.com>
Date:   Fri Jul  1 12:14:07 2011 -0700

glsl: Lower unconditional return statements.

Previously, lower_jumps.cpp only lowered return statements that
appeared inside of an if statement.

Without this patch, lower_jumps.cpp might not lower certain return
statements, causing some back-ends to fail (as in bug #36669).

Fixes unit test test_lower_returns_1.

---

 src/glsl/lower_jumps.cpp |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/src/glsl/lower_jumps.cpp b/src/glsl/lower_jumps.cpp
index fa247c6..eceba09 100644
--- a/src/glsl/lower_jumps.cpp
+++ b/src/glsl/lower_jumps.cpp
@@ -851,6 +851,20 @@ lower_continue:
        */
       visit_block(&ir->body);
 
+      /* If the body ended in an unconditional return of non-void,
+       * then we don't need to lower it because it's the one canonical
+       * return.
+       *
+       * If the body ended in a return of void, eliminate it because
+       * it is redundant.
+       */
+      if (ir->return_type->is_void() &&
+          get_jump_strength((ir_instruction *) ir->body.get_tail())) {
+         ir_jump *jump = (ir_jump *) ir->body.get_tail();
+         assert (jump->ir_type == ir_type_return);
+         jump->remove();
+      }
+
       if(this->function.return_value)
          ir->body.push_tail(new(ir) ir_return(new (ir) ir_dereference_variable(this->function.return_value)));
 




More information about the mesa-commit mailing list