glsl: fix optimization of discard nested multiple levels
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Tue, 26 Jul 2016 08:04:57 +0000 (10:04 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 28 Jul 2016 09:47:04 +0000 (10:47 +0100)
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 <kai@dev.carbon-project.org>
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/glsl/opt_conditional_discard.cpp

index 03665c373648f46e0852056c6d4808bc871eca03..6d8a23460d9a34e9e4d2def40c6f0646c14cbcee 100644 (file)
@@ -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;