vc4: Optimize the other case of SEL_X_Y wih a 0 -> SEL_X_0(a).
authorEric Anholt <eric@anholt.net>
Thu, 9 Oct 2014 07:40:51 +0000 (09:40 +0200)
committerEric Anholt <eric@anholt.net>
Fri, 10 Oct 2014 13:03:12 +0000 (15:03 +0200)
Cleans up some output to be more obvious in a piglit test I'm looking at.

src/gallium/drivers/vc4/vc4_opt_algebraic.c

index c1144583f63ab0865a45ce8fbac4358a624dcb7b..ec526fb3d18f4e8dbe3fd3428e6891f508fd96a2 100644 (file)
@@ -174,7 +174,10 @@ qir_opt_algebraic(struct vc4_compile *c)
                                  */
                                 replace_with_mov(c, inst, inst->src[1]);
                                 progress = true;
-                        } else if (is_zero(c, defs, inst->src[1])) {
+                                break;
+                        }
+
+                        if (is_zero(c, defs, inst->src[1])) {
                                 /* Replace references to a 0 uniform value
                                  * with the SEL_X_0 equivalent.
                                  */
@@ -183,7 +186,26 @@ qir_opt_algebraic(struct vc4_compile *c)
                                 inst->src[1] = c->undef;
                                 progress = true;
                                 dump_to(c, inst);
+                                break;
                         }
+
+                        if (is_zero(c, defs, inst->src[0])) {
+                                /* Replace references to a 0 uniform value
+                                 * with the SEL_X_0 equivalent, flipping the
+                                 * condition being evaluated since the operand
+                                 * order is flipped.
+                                 */
+                                dump_from(c, inst);
+                                inst->op -= QOP_SEL_X_Y_ZS;
+                                inst->op ^= 1;
+                                inst->op += QOP_SEL_X_0_ZS;
+                                inst->src[0] = inst->src[1];
+                                inst->src[1] = c->undef;
+                                progress = true;
+                                dump_to(c, inst);
+                                break;
+                        }
+
                         break;
 
                 case QOP_FSUB: