One interesting and unexpected side effect of this series has been that dead code elimination is now required to clean up unused deref instructions. This can be a problem for passes which alter and/or delete the variable because they may leave invalid deref instructions lying around. This is a bit troublesome because it causes validation issues and can confused later passes if there are invalid deref instructions even if they are unused. I have added a helper that allows you to easily check if a deref instruction is in use and remove it and its ancestors if it is not. This seems to help a bit but means that you have to manually clean up derefs whenever you alter or remove a variable. Another option would be to write a simple dead deref elimination pass that other optimization passes can run.

I'm not 100% sure what I think of that. On the balance, though, I think the amount that removing deref chains simplifies the IR still makes it worth it.

On March 23, 2018 14:43:16 Jason Ekstrand <ja...@jlekstrand.net> wrote:

This is something that Connor and I have been talking about for some time
now.  The basic idea is to replace the current singly linked nir_deref list
with deref instructions.  This is similar to what LLVM does and it offers
quite a bit more freedom when we start getting more realistic pointers from
compute applications.

This series implements an almost complete conversion for both i965 and anv.
The two remaining gaps are nir_lower_locals_to_regs and nir_lower_samplers.
The former will have to wait for ir3 to be converted and the later will
have to wait for radeonsi.  I've got patches for nir_lower_samplers but not
nir_lower_samplers_as_deref which is required by at least radeonsi.  Once
those are in place, we should be able to drop the lowering pass from the
Intel back-end completely.

The next step (which I will start on next week) will be removing legacy
derefs from core NIR.  This will also involve significant reworks in some
passes such as vars_to_ssa which still uses legacy derefs internally even
for things which use deref instructions.

Clearly, we can't remove anything until all of the other drivers are
converted.  However, this series should be a good basis for anyone wanting
to work on converting another driver since almost all of the core NIR
passes now work with both types of derefs so you can convert in whatever
way makes sense.

This series can be found as a branch on gitlab:

https://gitlab.freedesktop.org/jekstrand/mesa/commits/review/nir-deref-instrs-v1

Cc: Rob Clark <robdcl...@gmail.com>
Cc: Timothy Arceri <tarc...@itsqueeze.com>
Cc: Eric Anholt <e...@anholt.net>
Cc: Connor Abbott <cwabbo...@gmail.com>
Cc: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
Cc: Karol Herbst <kher...@redhat.com>

Jason Ekstrand (61):
 nir: Add src/dest num_components helpers
 nir: Return a cursor from nir_instr_remove
 nir/vars_to_ssa: Remove copies from the correct set
 nir/lower_indirect_derefs: Support interp_var_at intrinsics
 intel/vec4: Set channel_sizes for MOV_INDIRECT sources
 nir/validator: Validate that all used variables exist
 nir: Add a deref instruction type
 nir/builder: Add deref building helpers
 nir: Add _deref versions of all of the _var intrinsics
 nir: Add deref sources to texture instructions
 nir: Add helpers for working with deref instructions
 anv,i965,radv,st,ir3: Call nir_lower_deref_instrs
 glsl/nir: Only claim to handle intrinsic functions
 glsl/nir: Use deref instructions instead of dref chains
 prog/nir: Simplify some load/store operations
 prog/nir: Use deref instructions for params
 nir/lower_atomics: Rework the main walker loop a bit
 nir: Support deref instructions in remove_dead_variables
 nir: Add a pass for fixing deref modes
 nir: Support deref instructions in lower_global_vars_to_local
 nir: Support deref instructions in lower_io_to_temporaries
 nir: Add a deref path helper struct
 nir: Support deref instructions in lower_var_copies
 nir: Support deref instructions in split_var_copies
 nir: Support deref instructions in lower_vars_to_ssa
 nir: Support deref instructions in lower_indirect_derefs
 nir/deref: Add a deref cleanup function
 nir: Support deref instructions in lower_system_values
 nir: Support deref instructions in lower_clip_cull
 nir: Support deref instructions in propagate_invariant
 nir: Support deref instructions in gather_info
 nir: Support deref instructions in lower_io
 nir: Support deref instructions in lower_atomics
 nir: Support deref instructions in lower_wpos_ytransform
 nir: Support deref instructions in lower_pos_center
 nir: Support deref instructions in remove_unused_varyings
 intel,ir3: Disable nir_opt_copy_prop_vars
 intel/nir: Fixup deref modes after lowering patch vertices
 i965: Move nir_lower_deref_instrs to right before locals_to_regs
 st/nir: Move lower_deref_instrs later
 spirv: Use deref instructions for most variables
 nir: Add a concept of per-member structs and a lowering pass
 nir/lower_system_values: Support SYSTEM_VALUE_LOCAL_GROUP_SIZE
 spirv: Use the LOCAL_GROUP_SIZE system value
 nir/spirv: Pass nir_variable_data into apply_var_decoration
 anv/pipeline: Lower more constant initializers earlier
 spirv: Use NIR per-member splitting
 spirv: Make push constants an offset-based pointer
 spirv: Clean up vtn_pointer_to_offset
 spirv: Allow pointers to have a deref at the base
 spirv: Update vtn_pointer_to/from_ssa to handle deref pointers
 spirv: Record the type of functions
 spirv/cfg: Make the builder fully capable for both walks
 nir,spirv: Rework function calls
 anv/pipeline: Do less deref instruction lowering
 anv/pipeline: Convert lower_input_attachments to deref instructions
 anv/pipeline: Convert YCbCr lowering to deref instructiosn
 anv/apply_pipeline_layout: Simplify extract_tex_src_plane
 anv/pipeline: Convert apply_pipeline_layout to deref instructions
 intel/fs: Use image_deref intrinsics instead of image_var
 intel/nir: Only lower load/store derefs

src/amd/vulkan/radv_shader.c                       |  10 +
src/compiler/Makefile.sources                      |   3 +
src/compiler/glsl/glsl_to_nir.cpp                  | 265 ++++------
src/compiler/nir/meson.build                       |   3 +
src/compiler/nir/nir.c                             | 107 ++--
src/compiler/nir/nir.h                             | 175 +++++-
src/compiler/nir/nir_builder.h                     | 236 +++++++++
src/compiler/nir/nir_clone.c                       |  65 ++-
src/compiler/nir/nir_deref.c                       | 393 ++++++++++++++
src/compiler/nir/nir_deref.h                       |  55 ++
src/compiler/nir/nir_gather_info.c                 |  26 +-
src/compiler/nir/nir_inline_functions.c            | 193 +------
src/compiler/nir/nir_instr_set.c                   |  78 +++
src/compiler/nir/nir_intrinsics.h                  |  88 ++++
src/compiler/nir/nir_linking_helpers.c             |  50 +-
src/compiler/nir/nir_lower_atomics.c               | 137 ++++-
.../nir/nir_lower_clip_cull_distance_arrays.c      |  69 ++-
src/compiler/nir/nir_lower_global_vars_to_local.c  |  62 ++-
src/compiler/nir/nir_lower_indirect_derefs.c       | 169 +++++-
src/compiler/nir/nir_lower_io.c                    |  70 ++-
src/compiler/nir/nir_lower_io_to_temporaries.c     |   2 +
src/compiler/nir/nir_lower_system_values.c         |  23 +-
src/compiler/nir/nir_lower_var_copies.c            |  90 +++-
src/compiler/nir/nir_lower_vars_to_ssa.c           |  77 ++-
src/compiler/nir/nir_lower_wpos_center.c           |  13 +-
src/compiler/nir/nir_lower_wpos_ytransform.c       |  51 +-
src/compiler/nir/nir_opt_copy_prop_vars.c          |  19 +-
src/compiler/nir/nir_opt_copy_propagate.c          |  62 ++-
src/compiler/nir/nir_opt_dce.c                     |   7 +
src/compiler/nir/nir_print.c                       | 119 +++--
src/compiler/nir/nir_propagate_invariant.c         |  23 +-
src/compiler/nir/nir_remove_dead_variables.c       | 117 +++-
src/compiler/nir/nir_serialize.c                   | 137 +++--
src/compiler/nir/nir_split_per_member_structs.c    | 289 ++++++++++
src/compiler/nir/nir_split_var_copies.c            |  42 ++
src/compiler/nir/nir_sweep.c                       |   4 -
src/compiler/nir/nir_validate.c                    | 143 +++--
src/compiler/spirv/spirv_to_nir.c                  | 180 ++++---
src/compiler/spirv/vtn_cfg.c                       | 231 ++++----
src/compiler/spirv/vtn_glsl450.c                   |  19 +-
src/compiler/spirv/vtn_private.h                   |  28 +-
src/compiler/spirv/vtn_variables.c                 | 586 +++++++--------------
src/gallium/drivers/freedreno/ir3/ir3_cmdline.c    |   3 +
src/gallium/drivers/freedreno/ir3/ir3_nir.c        |   2 +-
src/intel/compiler/brw_fs.h                        |   2 +-
src/intel/compiler/brw_fs_nir.cpp                  | 157 +++---
src/intel/compiler/brw_nir.c                       |   4 +-
src/intel/compiler/brw_vec4.cpp                    |   5 +-
src/intel/vulkan/anv_nir_apply_pipeline_layout.c   | 187 +++----
src/intel/vulkan/anv_nir_lower_input_attachments.c |  31 +-
src/intel/vulkan/anv_nir_lower_ycbcr_textures.c    |  34 +-
src/intel/vulkan/anv_pipeline.c                    |  19 +-
src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp     |   2 +
src/mesa/drivers/dri/i965/brw_program.c            |   1 +
src/mesa/program/prog_to_nir.c                     |  65 +--
src/mesa/state_tracker/st_glsl_to_nir.cpp          |   2 +
56 files changed, 3451 insertions(+), 1579 deletions(-)
create mode 100644 src/compiler/nir/nir_deref.c
create mode 100644 src/compiler/nir/nir_deref.h
create mode 100644 src/compiler/nir/nir_split_per_member_structs.c

--
2.5.0.400.gff86faf



_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to