diff options
author | Eric Anholt <[email protected]> | 2011-06-08 11:25:04 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2011-06-10 13:17:01 -0700 |
commit | 20f087863d00fed9823791a447932e74d77cc546 (patch) | |
tree | e6399cae5832651458d1c0a3ddd7a6bfce7b05e1 | |
parent | 23ef4a6063668c187d00a0502207f0c03be5f994 (diff) |
glsl: Fix incorrect optimization of instructions before discard statements.
The function was named "find_unconditional_discard", but didn't
actually check that the discard statement found was unconditional.
Fixes piglit glsl-fs-discard-04.
Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r-- | src/glsl/opt_discard_simplification.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/glsl/opt_discard_simplification.cpp b/src/glsl/opt_discard_simplification.cpp index 7c2928d271c..a19947ddd6c 100644 --- a/src/glsl/opt_discard_simplification.cpp +++ b/src/glsl/opt_discard_simplification.cpp @@ -104,9 +104,23 @@ static ir_discard * find_unconditional_discard(exec_list &instructions) { foreach_list(n, &instructions) { - ir_discard *ir = ((ir_instruction *) n)->as_discard(); - if (ir != NULL && ir->condition == NULL) - return ir; + ir_instruction *ir = (ir_instruction *)n; + + if (ir->ir_type == ir_type_return || + ir->ir_type == ir_type_loop_jump) + return NULL; + + /* So far, this code doesn't know how to look inside of flow + * control to see if a discard later on at this level is + * unconditional. + */ + if (ir->ir_type == ir_type_if || + ir->ir_type == ir_type_loop) + return NULL; + + ir_discard *discard = ir->as_discard(); + if (discard != NULL && discard->condition == NULL) + return discard; } return NULL; } |