summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2011-06-08 11:25:04 -0700
committerEric Anholt <[email protected]>2011-06-10 13:17:01 -0700
commit20f087863d00fed9823791a447932e74d77cc546 (patch)
treee6399cae5832651458d1c0a3ddd7a6bfce7b05e1
parent23ef4a6063668c187d00a0502207f0c03be5f994 (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.cpp20
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;
}