diff options
-rw-r--r-- | src/compiler/glsl/lower_jumps.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/compiler/glsl/lower_jumps.cpp b/src/compiler/glsl/lower_jumps.cpp index ed1b6d1ea63..1b893e521b8 100644 --- a/src/compiler/glsl/lower_jumps.cpp +++ b/src/compiler/glsl/lower_jumps.cpp @@ -932,14 +932,21 @@ lower_continue: * break statement if necessary. */ return_if->then_instructions.push_tail(new(ir) ir_loop_jump(ir_loop_jump::jump_break)); - else - /* Otherwise, all we need to do is ensure that the - * instructions that follow are only executed if the - * return flag is clear. We can do that by moving those - * instructions into the else clause of the generated if + else { + /* Otherwise, ensure that the instructions that follow are only + * executed if the return flag is clear. We can do that by moving + * those instructions into the else clause of the generated if * statement. */ move_outer_block_inside(ir, &return_if->else_instructions); + + /* In case the loop is embeded inside an if add a new return to + * the return flag then branch and let a future pass tidy it up. + */ + if (this->function.signature->return_type->is_void()) + return_if->then_instructions.push_tail(new(ir) ir_return(NULL)); + } + ir->insert_after(return_if); } |