From: Nicolai Hähnle Date: Tue, 26 Jul 2016 08:04:57 +0000 (+0200) Subject: glsl: fix optimization of discard nested multiple levels X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=21556d86fc74d91ab58a7496a876ad33e0f950df;p=mesa.git glsl: fix optimization of discard nested multiple levels The order of optimizations can lead to the conditional discard optimization being applied twice to the same discard statement. In this case, we must ensure that both conditions are applied. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96762 Cc: mesa-stable@lists.freedesktop.org Tested-by: Kai Wasserbäch Reviewed-by: Tapani Pälli Reviewed-by: Kenneth Graunke --- diff --git a/src/compiler/glsl/opt_conditional_discard.cpp b/src/compiler/glsl/opt_conditional_discard.cpp index 03665c37364..6d8a23460d9 100644 --- a/src/compiler/glsl/opt_conditional_discard.cpp +++ b/src/compiler/glsl/opt_conditional_discard.cpp @@ -72,7 +72,14 @@ opt_conditional_discard_visitor::visit_leave(ir_if *ir) /* Move the condition and replace the ir_if with the ir_discard. */ ir_discard *discard = (ir_discard *) ir->then_instructions.get_head_raw(); - discard->condition = ir->condition; + if (!discard->condition) + discard->condition = ir->condition; + else { + void *ctx = ralloc_parent(ir); + discard->condition = new(ctx) ir_expression(ir_binop_logic_and, + ir->condition, + discard->condition); + } ir->replace_with(discard); progress = true;