intel/fs: Mark source 0 of bcsel as needing Boolean resolve
authorIan Romanick <ian.d.romanick@intel.com>
Fri, 7 Jun 2019 22:45:03 +0000 (15:45 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 11 Jun 2019 19:12:07 +0000 (12:12 -0700)
The other sources of the bcsel behave like the sources of an and or
other logical operation.  However, source zero behaves differently.
It is evaluated as a Boolean, so it needs to be resolved.

No shader-db changes, but the tests mentioned in the bug get a couple
instructions added back.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110857
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
src/intel/compiler/brw_nir_analyze_boolean_resolves.c

index 63d094168b9d2ae23c24cd364f4ac066e8358ba8..8e40a9f53cb44468376c201a77776f6d9408515f 100644 (file)
@@ -145,6 +145,12 @@ analyze_boolean_resolves_block(nir_block *block)
             uint8_t src0_status = get_resolve_status_for_src(&alu->src[first + 0].src);
             uint8_t src1_status = get_resolve_status_for_src(&alu->src[first + 1].src);
 
+            /* src0 of a bcsel is evaluated as a Boolean with the expectation
+             * that it has already been resolved.  Mark it as such.
+             */
+            if (alu->op == nir_op_b32csel)
+               src_mark_needs_resolve(&alu->src[0].src, NULL);
+
             if (src0_status == src1_status) {
                resolve_status = src0_status;
             } else if (src0_status == BRW_NIR_NON_BOOLEAN ||