From: Ian Romanick <[email protected]>

An expression like 'mix(false, true, condition)' is the same as just
'condition'.  Similarly, an expression like 'mix(true, false,
condition)' is the same as just '!condition'.

Expressions like 'mix(true, true, condition)' should already be handled
elsewhere.

Many, many more of the shaders hurt by "glsl: Optimize certain
if-statements to ir_triop_csel" are even or impoved now.  The helped
vs. hurt ratio is 2323:307 on Ivy Bride without NIR, and it is still
1045:1975.

Shader-db results:

GM45 (0x2A42):
total instructions in shared programs: 3545378 -> 3544299 (-0.03%)
instructions in affected programs:     115235 -> 114156 (-0.94%)
helped:                                393

Iron Lake (0x0046):
total instructions in shared programs: 4975572 -> 4974090 (-0.03%)
instructions in affected programs:     150594 -> 149112 (-0.98%)
helped:                                534

Sandy Bridge (0x0116):
total instructions in shared programs: 6800913 -> 6799711 (-0.02%)
instructions in affected programs:     196165 -> 194963 (-0.61%)
helped:                                808

Sandy Bridge (0x0116) NIR:
total instructions in shared programs: 6815782 -> 6792447 (-0.34%)
instructions in affected programs:     198743 -> 175408 (-11.74%)
helped:                                656
HURT:                                  152

Ivy Bridge (0x0166):
total instructions in shared programs: 6275305 -> 6274069 (-0.02%)
instructions in affected programs:     181703 -> 180467 (-0.68%)
helped:                                798

Ivy Bridge (0x0166) NIR:
total instructions in shared programs: 6322876 -> 6300986 (-0.35%)
instructions in affected programs:     185337 -> 163447 (-11.81%)
helped:                                650
HURT:                                  152
GAINED:                                2

Haswell (0x0426):
total instructions in shared programs: 5761392 -> 5760186 (-0.02%)
instructions in affected programs:     160962 -> 159756 (-0.75%)
helped:                                798

Haswell (0x0426) NIR:
total instructions in shared programs: 5798963 -> 5780281 (-0.32%)
instructions in affected programs:     163859 -> 145177 (-11.40%)
helped:                                650
HURT:                                  152
GAINED:                                2

Broadwell (0x162E):
total instructions in shared programs: 6809460 -> 6808264 (-0.02%)
instructions in affected programs:     162030 -> 160834 (-0.74%)
helped:                                802

Broadwell (0x162E) NIR:
total instructions in shared programs: 7013761 -> 6994887 (-0.27%)
instructions in affected programs:     163346 -> 144472 (-11.55%)
helped:                                650
HURT:                                  152
GAINED:                                4

Signed-off-by: Ian Romanick <[email protected]>
---
 src/glsl/opt_algebraic.cpp | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp
index 7d58e9b..0f15f52 100644
--- a/src/glsl/opt_algebraic.cpp
+++ b/src/glsl/opt_algebraic.cpp
@@ -1121,6 +1121,20 @@ ir_algebraic_visitor::handle_expression(ir_expression 
*ir)
         return ir->operands[1];
       if (is_vec_zero(op_const[0]))
         return ir->operands[2];
+
+      if (ir->type->base_type == GLSL_TYPE_BOOL) {
+         /* Optimize an expression like 'mix(false, true, condition)' to
+          * just 'condition'.
+          */
+         if (is_vec_zero(op_const[1]) && is_vec_one(op_const[2]))
+            return ir->operands[0];
+
+         /* Optimize an expression like 'mix(true, false, condition)' to
+          * just '!condition'.
+          */
+         if (is_vec_one(op_const[1]) && is_vec_zero(op_const[2]))
+            return logic_not(ir->operands[0]);
+      }
       break;
 
    default:
-- 
2.1.0

_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to