[Mesa-dev] [PATCH] spirv: Don’t check for NaN for most OpFOrd* comparisons

Iago Toral itoral at igalia.com
Wed Apr 25 10:14:58 UTC 2018


Thanks Neil!

Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>

Maybe we need other drivers (radv?) to double-check that this doesn't
break stuff for them either?

Iago

On Tue, 2018-04-24 at 16:55 +0200, Neil Roberts wrote:
> For all of the OpFOrd* comparisons except OpFOrdNotEqual the hardware
> should probably already return false if one of the operands is NaN so
> we don’t need to have an explicit check for it. This seems to at
> least
> work on Intel hardware. This should reduce the number of instructions
> generated for the most common comparisons.
> 
> For what it’s worth, the original code to handle this was added in
> e062eb6415de3a. The commit message for that says that it was to fix
> some CTS tests for OpFUnord* opcodes. Even if the hardware doesn’t
> handle NaNs this patch shouldn’t affect those tests. At any rate they
> have since been moved out of the mustpass list. Incidentally those
> tests fail on the nvidia proprietary driver so it doesn’t seem like
> handling NaNs correctly is a priority.
> ---
> 
> I made a VkRunner test case for all of the OpFOrd* and OpFUnord*
> opcodes with and without NaNs on the test branch. It can be run like
> this:
> 
> git clone -b tests https://github.com/Igalia/vkrunner.git
> cd vkrunner
> ./autogen.sh && make -j8
> ./src/vkrunner examples/unordered-comparison.shader_test
> 
>  src/compiler/spirv/vtn_alu.c | 17 ++++++-----------
>  1 file changed, 6 insertions(+), 11 deletions(-)
> 
> diff --git a/src/compiler/spirv/vtn_alu.c
> b/src/compiler/spirv/vtn_alu.c
> index 71e743cdd1e..3134849ba90 100644
> --- a/src/compiler/spirv/vtn_alu.c
> +++ b/src/compiler/spirv/vtn_alu.c
> @@ -597,23 +597,18 @@ vtn_handle_alu(struct vtn_builder *b, SpvOp
> opcode,
>        break;
>     }
>  
> -   case SpvOpFOrdEqual:
> -   case SpvOpFOrdNotEqual:
> -   case SpvOpFOrdLessThan:
> -   case SpvOpFOrdGreaterThan:
> -   case SpvOpFOrdLessThanEqual:
> -   case SpvOpFOrdGreaterThanEqual: {
> +   case SpvOpFOrdNotEqual: {
> +      /* For all the SpvOpFOrd* comparisons apart from NotEqual, the
> value
> +       * from the ALU will probably already be false if the operands
> are not
> +       * ordered so we don’t need to handle it specially.
> +       */
>        bool swap;
>        unsigned src_bit_size = glsl_get_bit_size(vtn_src[0]->type);
>        unsigned dst_bit_size = glsl_get_bit_size(type);
>        nir_op op = vtn_nir_alu_op_for_spirv_opcode(b, opcode, &swap,
>                                                    src_bit_size,
> dst_bit_size);
>  
> -      if (swap) {
> -         nir_ssa_def *tmp = src[0];
> -         src[0] = src[1];
> -         src[1] = tmp;
> -      }
> +      assert(!swap);
>  
>        val->ssa->def =
>           nir_iand(&b->nb,


More information about the mesa-dev mailing list