radv/aco,nir/lower_subgroups: don't lower elect
authorRhys Perry <pendingchaos02@gmail.com>
Tue, 1 Sep 2020 15:35:24 +0000 (16:35 +0100)
committerMarge Bot <eric+marge@anholt.net>
Tue, 13 Oct 2020 12:47:20 +0000 (12:47 +0000)
ACO can implement this better.

fossil-db (Navi):
Totals from 33 (0.02% of 135946) affected shaders:
SGPRs: 1736 -> 1744 (+0.46%)
VGPRs: 1680 -> 1656 (-1.43%)
CodeSize: 246160 -> 245916 (-0.10%); split: -0.14%, +0.04%
MaxWaves: 449 -> 461 (+2.67%)
Instrs: 48301 -> 48266 (-0.07%); split: -0.12%, +0.05%
Cycles: 469740 -> 469240 (-0.11%); split: -0.18%, +0.08%

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6558>

src/amd/vulkan/radv_shader.c
src/compiler/nir/nir.h
src/compiler/nir/nir_lower_subgroups.c
src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp
src/gallium/drivers/radeonsi/si_shader_nir.c
src/intel/compiler/brw_nir.c

index a80b3a9..302a560 100644 (file)
@@ -601,6 +601,7 @@ radv_shader_compile_to_nir(struct radv_device *device,
                        .lower_quad_broadcast_dynamic = 1,
                        .lower_quad_broadcast_dynamic_to_const = gfx7minus,
                        .lower_shuffle_to_swizzle_amd = 1,
+                       .lower_elect = radv_use_llvm_for_stage(device, stage),
                });
 
        nir_lower_load_const_to_scalar(nir);
index 2765ad0..e44dc62 100644 (file)
@@ -4440,6 +4440,7 @@ typedef struct nir_lower_subgroups_options {
    bool lower_quad:1;
    bool lower_quad_broadcast_dynamic:1;
    bool lower_quad_broadcast_dynamic_to_const:1;
+   bool lower_elect:1;
 } nir_lower_subgroups_options;
 
 bool nir_lower_subgroups(nir_shader *shader,
index b76e353..ecd3d03 100644 (file)
@@ -550,6 +550,9 @@ lower_subgroups_instr(nir_builder *b, nir_instr *instr, void *_options)
    }
 
    case nir_intrinsic_elect: {
+      if (!options->lower_elect)
+         return NULL;
+
       nir_intrinsic_instr *first =
          nir_intrinsic_instr_create(b->shader,
                                     nir_intrinsic_first_invocation);
index 9141b14..b256121 100644 (file)
@@ -3114,6 +3114,7 @@ Converter::run()
    struct nir_lower_subgroups_options subgroup_options = {
       .subgroup_size = 32,
       .ballot_bit_size = 32,
+      .lower_elect = true,
    };
 
    /* prepare for IO lowering */
index 9556186..472243c 100644 (file)
@@ -663,6 +663,7 @@ static void si_lower_nir(struct si_screen *sscreen, struct nir_shader *nir)
       .lower_subgroup_masks = true,
       .lower_vote_trivial = false,
       .lower_vote_eq_to_ballot = true,
+      .lower_elect = true,
    };
    NIR_PASS_V(nir, nir_lower_subgroups, &subgroups_options);
 
index 2b9194b..245003c 100644 (file)
@@ -752,6 +752,7 @@ brw_preprocess_nir(const struct brw_compiler *compiler, nir_shader *nir,
       .lower_vote_trivial = !is_scalar,
       .lower_shuffle = true,
       .lower_quad_broadcast_dynamic = true,
+      .lower_elect = true,
    };
    OPT(nir_lower_subgroups, &subgroups_options);