Hello!

This patch fixes a bug in the lower_jumps pass if lower_sub_return is set to 
true.

Subroutines such as

void sub() {
  for (int i = 0; i < 2; ++i) {
    if (i)
      return;
  }
}

a continue instruction is inserted outside of the loop.

Subroutines such as

void sub() {
  for (int j = 0; j < 2; ++j) {
    for (int i = 0; i < 2; ++i) {
      if (i)
        return;
    }
  }
  alter_some_global_variable();
  return;
}

get transformed to

void sub() {
  bool return_flag = false;
  for (int j = 0; j < 2; ++j) {
    for (int i = 0; i < 2; ++i) {
      if (i) {
        return_flag = true;
        break;
      }
    }
    if (return_flag)
      break;
  }
  alter_some_global_variable();
  return;
}

Please review

Fabian
From 0b3692c21acfb173ec312e278751045450f31a95 Mon Sep 17 00:00:00 2001
From: Fabian Bieler <f...@harold-zoid.(none)>
Date: Tue, 23 Nov 2010 01:33:26 +0100
Subject: [PATCH] glsl: fix lowering conditional returns in subroutines

this fix applies to the lower_sub_return 'branch' of the lower_jumps pass
---
 src/glsl/lower_jumps.cpp |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/src/glsl/lower_jumps.cpp b/src/glsl/lower_jumps.cpp
index e1e7a5b..9009495 100644
--- a/src/glsl/lower_jumps.cpp
+++ b/src/glsl/lower_jumps.cpp
@@ -490,7 +490,11 @@ lower_continue:
       if(this->loop.may_set_return_flag) {
          assert(this->function.return_flag);
          ir_if* return_if = new(ir) ir_if(new(ir) ir_dereference_variable(this->function.return_flag));
-         return_if->then_instructions.push_tail(new(ir) ir_loop_jump(saved_loop.loop ? ir_loop_jump::jump_break : ir_loop_jump::jump_continue));
+         saved_loop.may_set_return_flag = true;
+         if(saved_loop.loop)
+            return_if->then_instructions.push_tail(new(ir) ir_loop_jump(ir_loop_jump::jump_break));
+         else
+            move_outer_block_inside(ir, &return_if->else_instructions);
          ir->insert_after(return_if);
       }
 
-- 
1.7.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to