[Mesa-dev] [PATCH v2] i965/fs: Always invert predicate of SEL with swapped arguments

Ian Romanick idr at freedesktop.org
Tue Apr 7 12:40:40 PDT 2015


From: Ian Romanick <ian.d.romanick at intel.com>

Commit b616164 added an optimization of b2f generation of a comparison.
It also included an extra optimization of one of the comparison values
is a constant of zero.  The trick was that some value was known to be
zero, so that value could be used in the SEL instruction instead of
potentially loading 0.0 into a register.

This change switched the order of the arguments to the SEL, and, for
some unknown reason, I thought that the predicate should therefore
only be inverted for the == case.  Clearly, it should always be
inverted.

Fixes piglit fs-notEqual-of-expression.shader_test and
fs-equal-of-expression.shader_test.

v2: Don't do the "register already has zero" optimization for the '== 0'
case.  In that case, the register does not have zero when we want to
produce a zero result.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89722
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org> [v1]
---
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index e6fb0cb..da0a08d 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -502,15 +502,15 @@ fs_visitor::try_emit_b2f_of_comparison(ir_expression *ir)
     *     and(16)         g4<1>D          g2<8,8,1>D      1D
     *     and(16)         m6<1>D          -g4<8,8,1>D     0x3f800000UD
     *
-    * When the comparison is either == 0.0 or != 0.0 using the knowledge that
-    * the true (or false) case already results in zero would allow better code
-    * generation by possibly avoiding a load-immediate instruction.
+    * When the comparison is != 0.0 using the knowledge that the false case
+    * already results in zero would allow better code generation by possibly
+    * avoiding a load-immediate instruction.
     */
    ir_expression *cmp = ir->operands[0]->as_expression();
    if (cmp == NULL)
       return false;
 
-   if (cmp->operation == ir_binop_equal || cmp->operation == ir_binop_nequal) {
+   if (cmp->operation == ir_binop_nequal) {
       for (unsigned i = 0; i < 2; i++) {
          ir_constant *c = cmp->operands[i]->as_constant();
          if (c == NULL || !c->is_zero())
@@ -538,7 +538,7 @@ fs_visitor::try_emit_b2f_of_comparison(ir_expression *ir)
 
             fs_inst *inst = emit(SEL(this->result, op[i ^ 1], fs_reg(1.0f)));
             inst->predicate = BRW_PREDICATE_NORMAL;
-            inst->predicate_inverse = cmp->operation == ir_binop_equal;
+            inst->predicate_inverse = true;
             return true;
          }
       }
-- 
2.1.0



More information about the mesa-dev mailing list