nir: Introduce a nir_opt_move_comparisons() pass.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 8 Aug 2016 20:57:29 +0000 (13:57 -0700)
committerTimothy Arceri <timothy.arceri@collabora.com>
Wed, 11 Jan 2017 22:47:29 +0000 (09:47 +1100)
commitfd957b17511b9a7654e70e0f4a21c2c7547f95c6
treeda402384b559b927f890fbc6e43c8702caf2b6b4
parente8328e55e7ac26bbf3b3a47a1bb1cae4ab9130a2
nir: Introduce a nir_opt_move_comparisons() pass.

This tries to move comparisons (a common source of boolean values)
closer to their first use.  For GPUs which use condition codes,
this can eliminate a lot of temporary booleans and comparisons
which reload the condition code register based on a boolean.

V2: (Timothy Arceri)
 - fix move comparision for phis so we dont end up with:

    vec1 32 ssa_227 = phi block_34: ssa_1, block_38: ssa_240
    vec1 32 ssa_235 = feq ssa_227, ssa_1
    vec1 32 ssa_230 = phi block_34: ssa_221, block_38: ssa_235

 - add nir_op_i2b/nir_op_f2b to the list of comparisons.

V3: (Timothy Arceri)
 - tidy up suggested by Jason.
 - add inot/fnot to move comparison list

V4: (Jason Ekstrand)
 - clean up move_comparison_source
 - get rid of the tuple
 - rework phi handling

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> [v1]
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/Makefile.sources
src/compiler/nir/nir.h
src/compiler/nir/nir_opt_move_comparisons.c [new file with mode: 0644]