Mesa (master): glsl: fix lower jumps for nested non-void returns
Timothy Arceri
tarceri at kemper.freedesktop.org
Sat Apr 8 01:20:03 UTC 2017
Module: Mesa
Branch: master
Commit: bfabef0e7104dc4043a74ef44e71ecc7636cfe12
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=bfabef0e7104dc4043a74ef44e71ecc7636cfe12
Author: Timothy Arceri <tarceri at itsqueeze.com>
Date: Fri Apr 7 11:24:37 2017 +1000
glsl: fix lower jumps for nested non-void returns
Fixes the case were a loop contains a return and the loop is
nested inside an if.
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
https://bugs.freedesktop.org/show_bug.cgi?id=100303
---
src/compiler/glsl/lower_jumps.cpp | 6 ++++++
src/compiler/glsl/tests/lower_jumps/create_test_cases.py | 5 ++++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/src/compiler/glsl/lower_jumps.cpp b/src/compiler/glsl/lower_jumps.cpp
index e165172301..7dc34056a1 100644
--- a/src/compiler/glsl/lower_jumps.cpp
+++ b/src/compiler/glsl/lower_jumps.cpp
@@ -945,6 +945,12 @@ lower_continue:
*/
if (this->function.signature->return_type->is_void())
return_if->then_instructions.push_tail(new(ir) ir_return(NULL));
+ else {
+ assert(this->function.return_value);
+ ir_variable* return_value = this->function.return_value;
+ return_if->then_instructions.push_tail(
+ new(ir) ir_return(new(ir) ir_dereference_variable(return_value)));
+ }
}
ir->insert_after(return_if);
diff --git a/src/compiler/glsl/tests/lower_jumps/create_test_cases.py b/src/compiler/glsl/tests/lower_jumps/create_test_cases.py
index 20f5ace199..623487eb44 100644
--- a/src/compiler/glsl/tests/lower_jumps/create_test_cases.py
+++ b/src/compiler/glsl/tests/lower_jumps/create_test_cases.py
@@ -628,7 +628,10 @@ def test_lower_return_non_void_at_end_of_loop():
loop(assign_x('a', const_float(1)) +
lowered_return_simple(const_float(2)) +
break_()) +
- if_not_return_flag(assign_x('b', const_float(3)) +
+ if_return_flag(assign_x('return_value', '(var_ref return_value)') +
+ assign_x('return_flag', const_bool(1)) +
+ assign_x('execute_flag', const_bool(0)),
+ assign_x('b', const_float(3)) +
lowered_return(const_float(4))) +
final_return()
))
More information about the mesa-commit
mailing list