nir: Generalize nir_intrinsic_vote_eq
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 29 Aug 2017 00:33:33 +0000 (17:33 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 7 Mar 2018 20:13:47 +0000 (12:13 -0800)
The SPIR-V extension wants us to be able to do an AllEqual on any vector
or scalar type.  This has two implications:

 1) We need to be able to handle vectors so we switch the vote_eq
    intrinsics to be vectorized intrinsics.

 2) We need to handle floats which have different behavior with respect
    to +-0, NaN, etc. than the integer variant so we need two variants.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/amd/common/ac_nir_to_llvm.c
src/compiler/glsl/glsl_to_nir.cpp
src/compiler/nir/nir_intrinsics.h
src/compiler/nir/nir_lower_subgroups.c
src/compiler/nir/nir_opt_intrinsics.c
src/intel/compiler/brw_fs_nir.cpp

index cca796de71b1a2b858fed14f9f054049f802b4df..4b3b253c439bb00d74dc57099d3780a353239222 100644 (file)
@@ -4563,7 +4563,7 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
                result = LLVMBuildSExt(ctx->ac.builder, tmp, ctx->ac.i32, "");
                break;
        }
-       case nir_intrinsic_vote_eq: {
+       case nir_intrinsic_vote_ieq: {
                LLVMValueRef tmp = ac_build_vote_eq(&ctx->ac, get_src(ctx, instr->src[0]));
                result = LLVMBuildSExt(ctx->ac.builder, tmp, ctx->ac.i32, "");
                break;
index 7a9d15015e25f51f0ca4d823d507654bc0902f36..80eb15f1ab184c4cf13b8458c9b17c29d897615a 100644 (file)
@@ -814,7 +814,7 @@ nir_visitor::visit(ir_call *ir)
          op = nir_intrinsic_vote_all;
          break;
       case ir_intrinsic_vote_eq:
-         op = nir_intrinsic_vote_eq;
+         op = nir_intrinsic_vote_ieq;
          break;
       case ir_intrinsic_ballot:
          op = nir_intrinsic_ballot;
@@ -1163,8 +1163,9 @@ nir_visitor::visit(ir_call *ir)
       }
       case nir_intrinsic_vote_any:
       case nir_intrinsic_vote_all:
-      case nir_intrinsic_vote_eq: {
+      case nir_intrinsic_vote_ieq: {
          nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 32, NULL);
+         instr->num_components = 1;
 
          ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
          instr->src[0] = nir_src_for_ssa(evaluate_rvalue(value));
index 46f67a908ed0cfe91e6e5aab1e054bf84d296408..7543d83e786e2e39e9c854193cd2691fc8c1e9bd 100644 (file)
@@ -135,7 +135,8 @@ INTRINSIC(discard_if, 1, ARR(1), false, 0, 0, 0, xx, xx, xx, 0)
 /** ARB_shader_group_vote intrinsics */
 INTRINSIC(vote_any, 1, ARR(1), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE)
 INTRINSIC(vote_all, 1, ARR(1), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE)
-INTRINSIC(vote_eq,  1, ARR(1), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE)
+INTRINSIC(vote_feq, 1, ARR(0), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE)
+INTRINSIC(vote_ieq, 1, ARR(0), true, 1, 0, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE)
 
 /** Ballot ALU operations from SPIR-V.
  *
index e45a7d723ac6a1d679e1637b0c715b777f802f78..3753b5e6427de4c4208b173e89b2e842992c0b36 100644 (file)
@@ -121,7 +121,8 @@ lower_subgroups_intrin(nir_builder *b, nir_intrinsic_instr *intrin,
          return nir_ssa_for_src(b, intrin->src[0], 1);
       break;
 
-   case nir_intrinsic_vote_eq:
+   case nir_intrinsic_vote_feq:
+   case nir_intrinsic_vote_ieq:
       if (options->lower_vote_trivial)
          return nir_imm_int(b, NIR_TRUE);
       break;
index eb394af0c10830b678c057859d7654b57e317bca..37f08c77ef11b17d713a4ec1560f774baf631883 100644 (file)
@@ -50,7 +50,8 @@ opt_intrinsics_impl(nir_function_impl *impl)
             if (nir_src_as_const_value(intrin->src[0]))
                replacement = nir_ssa_for_src(&b, intrin->src[0], 1);
             break;
-         case nir_intrinsic_vote_eq:
+         case nir_intrinsic_vote_feq:
+         case nir_intrinsic_vote_ieq:
             if (nir_src_as_const_value(intrin->src[0]))
                replacement = nir_imm_int(&b, NIR_TRUE);
             break;
index 651997bb6ff50a8f48697df2926de005abde1f4a..40d6e8bfccbff634f11ea813e0e504755447e33e 100644 (file)
@@ -4423,7 +4423,7 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
       bld.MOV(retype(dest, BRW_REGISTER_TYPE_D), component(res1, 0));
       break;
    }
-   case nir_intrinsic_vote_eq: {
+   case nir_intrinsic_vote_ieq: {
       fs_reg value = get_nir_src(instr->src[0]);
       fs_reg uniformized = bld.emit_uniformize(value);
       const fs_builder ubld = bld.exec_all().group(1, 0);