[Mesa-dev] [PATCH 00/21] nir: Functions!

Jason Ekstrand jason at jlekstrand.net
Sun Feb 14 02:14:17 UTC 2016


This patch series adds actual function support to NIR.  Previously all NIR
usage relied on GLSL to have lowered functions away entirely.  As a result,
any support for functions that was there was dead code and not really
tested.  With SPIR-V on the horizon, NIR will need real function support.

The series starts by deleting some dead code in glsl_to_nir and then
reworking the way functions and parameters are handled.  Here's the new
(i.e., actually well-defined) scheme:

 - The nir_function_impl struct has a params array that contains pointers
   to the variables that are the functions arguments and a return_var array
   that, if not NULL points to the return variable.
 - Each of these variables has the "param" mode and does not exist in any
   variable list but instead is reachable only through the params array or
   the return_var pointer.
 - Each variable with the "param" mode has a location.  For parameters,
   that location is the index into the param array; for return values, the
   location is defined to be -1.
 - Parameters and return values are not printed with the list of locals but
   are, instead, only printed in the argument list and are now printed with
   their type.

Since glsl_to_nir, prog_to_nir, and tgsi_to_nir never produce any functions
other than main(), it's safe to do these reworks in basically any order.

The next part of the series builds up to doing function inlining.  However,
function inlining requires return lowering which pass depends on being able
to repair SSA form when it's done so we need an SSA repair pass.  This, in
turn requires a phi builder and, while we're at it, we might as well rework
the into-SSA pass.  Yeah, I know, it's kind of the long way there, but what
can you do?

Once we have an SSA repair pass, return lowering and function inlining come
fairly quickly.  However, in order to make return lowering possible, we
have to patch up control-flow handling so it doesn't break when we try
remove stuff from the top level of the function.

Jason Ekstrand (21):
  nir/glsl: Remove dead function parameter handling code
  nir: Add a new "param" variable mode for parameters and return
    variables
  nir: Add a helper for creating a "bare" nir_function_impl
  nir: Create function parameters in function_impl_create
  nir/print: Factor variable name lookup into a helper
  nir/print: Better function argument printing
  nir/validate: Better function validation
  nir/clone: Add support for cloning a single function_impl
  nir: Add a phi node placement helper
  nir/dominance: Handle unreachable blocks
  nir/vars_to_ssa: Use the new nir_phi_builder helper
  util/bitset: Allow iterating over const bitsets
  nir: Add a pass to repair SSA form
  nir/cf: Handle relinking top-level blocks
  nir: Add a function for comparing cursors
  nir/cf: Make extracting or re-inserting nothing a no-op
  nir/builder: Add a helper for inserting jump instructions
  nir: Add a cursor helper for getting a cursor after any phi nodes
  nir: Add return lowering pass
  nir/builder: Add helpers for easily inserting copy_var intrinsics
  nir: Add a pass to inline functions

 src/compiler/Makefile.sources            |   5 +
 src/compiler/nir/Makefile.sources        |   5 +
 src/compiler/nir/glsl_to_nir.cpp         |  51 +---
 src/compiler/nir/nir.c                   | 115 +++++++-
 src/compiler/nir/nir.h                   |  38 ++-
 src/compiler/nir/nir_builder.h           |  30 ++
 src/compiler/nir/nir_clone.c             | 112 +++++--
 src/compiler/nir/nir_control_flow.c      |  16 +-
 src/compiler/nir/nir_dominance.c         |   6 +-
 src/compiler/nir/nir_inline_functions.c  | 270 +++++++++++++++++
 src/compiler/nir/nir_lower_returns.c     | 246 ++++++++++++++++
 src/compiler/nir/nir_lower_vars_to_ssa.c | 484 +++++++++----------------------
 src/compiler/nir/nir_phi_builder.c       | 254 ++++++++++++++++
 src/compiler/nir/nir_phi_builder.h       |  84 ++++++
 src/compiler/nir/nir_print.c             |  76 +++--
 src/compiler/nir/nir_repair_ssa.c        | 157 ++++++++++
 src/compiler/nir/nir_validate.c          |  24 +-
 src/util/bitset.h                        |   2 +-
 18 files changed, 1490 insertions(+), 485 deletions(-)
 create mode 100644 src/compiler/nir/nir_inline_functions.c
 create mode 100644 src/compiler/nir/nir_lower_returns.c
 create mode 100644 src/compiler/nir/nir_phi_builder.c
 create mode 100644 src/compiler/nir/nir_phi_builder.h
 create mode 100644 src/compiler/nir/nir_repair_ssa.c

-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list