nir: Implement a nir_sweep() pass.
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 28 Mar 2015 02:50:29 +0000 (19:50 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 7 Apr 2015 21:34:14 +0000 (14:34 -0700)
commita10d493715cc3669a6e7647c5e514a386de886c0
tree0da325c4516b49df0b66625c153f644f2507b3aa
parentde2014cf1e12826a53a1132f6d80c889f375b2e8
nir: Implement a nir_sweep() pass.

This pass performs a mark and sweep pass over a nir_shader's associated
memory - anything still connected to the program will be kept, and any
dead memory we dropped on the floor will be freed.

The expectation is that this will be called when finished building and
optimizing the shader.  However, it's also fine to call it earlier, and
many times, to free up memory earlier.

v2: (feedback from Jason Ekstrand)
- Skip sweeping impl->start_block, as it's already in the CF list.
- Don't sweep SSA defs (they're owned by their defining instruction)
- Don't steal phi sources (they're owned by nir_phi_instr).
- Don't steal tex->src (it's owned by the tex_inst itself)
- Don't sweep dereference chains (top-level dereferences are owned by
  the instruction; sub-dereferences are owned by the parent deref).
- Don't sweep sources and destinations (SSA defs are handled as part of
  the defining instruction, and registers are handled as part of
  function implementations).
- Just steal instructions; don't walk them (no longer required).

v3: (feedback from Jason Ekstrand)
- Steal indirect sources from nir_src/nir_dest.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/glsl/Makefile.sources
src/glsl/nir/nir.h
src/glsl/nir/nir_sweep.c [new file with mode: 0644]