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@vmware.com> https://bugs.freedesktop.org/show_bug.cgi?id=100303
This commit is contained in:
@@ -945,6 +945,12 @@ lower_continue:
|
|||||||
*/
|
*/
|
||||||
if (this->function.signature->return_type->is_void())
|
if (this->function.signature->return_type->is_void())
|
||||||
return_if->then_instructions.push_tail(new(ir) ir_return(NULL));
|
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);
|
ir->insert_after(return_if);
|
||||||
|
@@ -628,7 +628,10 @@ def test_lower_return_non_void_at_end_of_loop():
|
|||||||
loop(assign_x('a', const_float(1)) +
|
loop(assign_x('a', const_float(1)) +
|
||||||
lowered_return_simple(const_float(2)) +
|
lowered_return_simple(const_float(2)) +
|
||||||
break_()) +
|
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))) +
|
lowered_return(const_float(4))) +
|
||||||
final_return()
|
final_return()
|
||||||
))
|
))
|
||||||
|
Reference in New Issue
Block a user