[Mesa-dev] [PATCH 00/47] nir: rewrite nir_foreach_block() and friends

Connor Abbott cwabbott0 at gmail.com
Wed Apr 13 04:34:39 UTC 2016


This is a series based on an idea I had a while ago. It gets one
instance of an awful callback-based interface for iterating over things.
The other instance, nir_foreach_source(), would be harder to fix since
iterating over the sources actually needs state (in order to handle
indirect sources). Now, instead of doing:

struct my_small_state {
   nir_builder b;
   bool progress;
};

...

bool my_trivial_function(nir_block *b, void *void_state)
{
   struct my_small_state *state = void_state;
   ...
}

...

struct my_small_state state;
nir_builder_init(&state.b, impl);
state.progress = false;

nir_foreach_block(impl, my_trivial_function, &state);

you can just do:

bool progress = false;
nir_builder b;
nir_builder_init(&b, impl);

nir_foreach_block(impl, block) {
   ...
}

It's a lot of churn, but it results in a much nicer API, as you can see
from the diffstat: almost 200 lines of code are deleted, despite the
impl of the new nir_foreach_block() taking more code. I took the liberty
of refactoring the code I touched to take advantage of the newer API, in
order to see just how much nicer we can make things. When the callback
function was just a simple walk across instructions, I inlined it, and
most of the time the little state structures passed around became
unnecessary given that we're now free to pass whatever parameters we
want. Someone might want to bikeshed some of my choices, though.

Right now, it's split into a number of patches to help
reviewability/rebasability, but obviously the entire thing needs to be
squashed before pushing. The patches aren't in any particular order,
since none of them are really related to each other, and the order will
be lost when squashing anyways. Nobody should hold off pushing other
things until this is done, but I'd like to get it in as soon as possible
to avoid rebase hell.

Piglit tested on i965, but only compile tested on vc4 and freedreno.

Finally, the series is also available at:

git://people.freedesktop.org/~cwabbott0/mesa nir-foreach-block-rewrite

Connor Abbott (47):
  nir: rewrite nir_foreach_block and friends
  nir/dominance: update to new foreach_block
  nir/from_ssa: fixup for new foreach_block()
  nir/inline_functions: fixup for new foreach_block()
  nir/liveness: adapt to new foreach_block()
  nir/lower_alu_to_scalar: fixup for new foreach_block()
  nir/lower_clip: fixup for new foreach_block()
  nir/nir: fixup for new foreach_block()
  nir/lower_gs_intrinsics: fixup for new foreach_block()
  nir/lower_locals_to_regs: fixup for new foreach_block
  nir/lower_load_const: fixup for new foreach_block()
  nir/lower_atomics: fixup for new foreach_block(
  nir/nir_lower_global_vars: fixup for new foreach_block()
  nir/lower_indirect_derefs: fixup for new foreach_block()
  nir/lower_phis_to_scalar: fixup for new foreach_block()
  nir/lower_system_values: fixup for new foreach_block()
  nir/lower_io: adapt to new foreach_block()
  nir/lower_to_source_mods: fixup for new foreeach_block()
  nir/lower_outputs_to_temporaries: fixup for new foreach_block()
  nir/lower_tex: fixup for new foreach_block()
  nir/lower_idiv: fixup for new foreach_block()
  nir/lower_vec_to_movs: fixup for new foreach_block()
  nir/lower_vars_to_ssa: fixup for new foreach_block()
  nir/move_vec_src_uses_to_dest: fixup for new foreach_block()
  nir/lower_two_sided_color: fixup for new foreach_block()
  nir/lower_var_copies: fixup for new foreach_block()
  nir/normalize_cubemap_coords: fixup for new foreach_block()
  nir/lower_samplers: fixup for new foreach_block()
  nir/opt_constant_folding: fixup for new foreach_block()
  nir/opt_gcm: fixup for new foreach_block()
  nir/opt_dce: fixup for new foreach_block()
  nir/opt_dead_cf: fixup for new foreach_block()
  nir/opt_undef: fixup for new foreach_block()
  nir/opt_remove_phis: fixup for new foreach_block()
  nir/opt_cp: use nir_block_get_following_if()
  nir/opt_cp: fixup for new foreach_block()
  nir/phi_builder: fixup for new foreach_block()
  nir/opt_peephole_select: fixup for new foreach_block()
  nir/repair_ssa: fixup for new foreach_block()
  nir/split_var_copies: fixup for new foreach_block()
  nir/remove_dead_variables: fixup for new foreach_block()
  nir/nir_worklist: fixup for new foreach_block()
  nir/validate: fixup for new foreach_block()
  nir/algebraic: fixup for new foreach_block()
  i965/nir: fixup for new foreach_block()
  ir3: fixup for new nir_foreach_block()
  vc4: fixup for new nir_foreach_block()

 src/compiler/nir/nir.c                             | 228 +++++++++++----------
 src/compiler/nir/nir.h                             |  57 +++++-
 src/compiler/nir/nir_algebraic.py                  |  34 ++-
 src/compiler/nir/nir_dominance.c                   | 160 ++++++---------
 src/compiler/nir/nir_from_ssa.c                    |  57 +++---
 src/compiler/nir/nir_inline_functions.c            |  53 +++--
 src/compiler/nir/nir_liveness.c                    |  24 +--
 src/compiler/nir/nir_lower_alu_to_scalar.c         |  18 +-
 src/compiler/nir/nir_lower_atomics.c               |  36 +---
 src/compiler/nir/nir_lower_clip.c                  |  50 ++---
 src/compiler/nir/nir_lower_global_vars_to_local.c  |  38 ++--
 src/compiler/nir/nir_lower_gs_intrinsics.c         |   8 +-
 src/compiler/nir/nir_lower_idiv.c                  |  21 +-
 src/compiler/nir/nir_lower_indirect_derefs.c       |  39 ++--
 src/compiler/nir/nir_lower_io.c                    |   9 +-
 src/compiler/nir/nir_lower_load_const_to_scalar.c  |  18 +-
 src/compiler/nir/nir_lower_locals_to_regs.c        |   9 +-
 .../nir/nir_lower_outputs_to_temporaries.c         |  28 ++-
 src/compiler/nir/nir_lower_phis_to_scalar.c        |   9 +-
 src/compiler/nir/nir_lower_samplers.c              |  40 +---
 src/compiler/nir/nir_lower_system_values.c         |  27 +--
 src/compiler/nir/nir_lower_tex.c                   |  58 +++---
 src/compiler/nir/nir_lower_to_source_mods.c        |  15 +-
 src/compiler/nir/nir_lower_two_sided_color.c       |   8 +-
 src/compiler/nir/nir_lower_var_copies.c            |  34 ++-
 src/compiler/nir/nir_lower_vars_to_ssa.c           |  14 +-
 src/compiler/nir/nir_lower_vec_to_movs.c           |  24 +--
 src/compiler/nir/nir_move_vec_src_uses_to_dest.c   |   7 +-
 src/compiler/nir/nir_normalize_cubemap_coords.c    |  26 +--
 src/compiler/nir/nir_opt_constant_folding.c        |  29 ++-
 src/compiler/nir/nir_opt_copy_propagate.c          |  32 +--
 src/compiler/nir/nir_opt_dce.c                     |  33 ++-
 src/compiler/nir/nir_opt_dead_cf.c                 |  43 ++--
 src/compiler/nir/nir_opt_gcm.c                     |   9 +-
 src/compiler/nir/nir_opt_peephole_select.c         |  37 ++--
 src/compiler/nir/nir_opt_remove_phis.c             |  12 +-
 src/compiler/nir/nir_opt_undef.c                   |  23 +--
 src/compiler/nir/nir_phi_builder.c                 |  12 +-
 src/compiler/nir/nir_remove_dead_variables.c       |  48 ++---
 src/compiler/nir/nir_repair_ssa.c                  |  16 +-
 src/compiler/nir/nir_split_var_copies.c            |   8 +-
 src/compiler/nir/nir_validate.c                    |  14 +-
 src/compiler/nir/nir_worklist.c                    |  12 +-
 .../drivers/freedreno/ir3/ir3_nir_lower_if_else.c  |  51 ++---
 src/gallium/drivers/vc4/vc4_nir_lower_blend.c      |   9 +-
 src/gallium/drivers/vc4/vc4_nir_lower_io.c         |  20 +-
 src/gallium/drivers/vc4/vc4_nir_lower_txf_ms.c     |  24 +--
 src/gallium/drivers/vc4/vc4_program.c              |  15 +-
 src/mesa/drivers/dri/i965/brw_fs_nir.cpp           |   7 +-
 src/mesa/drivers/dri/i965/brw_nir.c                |  90 ++++----
 .../dri/i965/brw_nir_analyze_boolean_resolves.c    |   6 +-
 .../dri/i965/brw_nir_attribute_workarounds.c       |   7 +-
 .../drivers/dri/i965/brw_nir_opt_peephole_ffma.c   |  29 ++-
 src/mesa/drivers/dri/i965/brw_vec4_nir.cpp         |   8 +-
 54 files changed, 776 insertions(+), 967 deletions(-)

-- 
2.5.0



More information about the mesa-dev mailing list