nir: Handle swizzle in nir_alu_srcs_negative_equal
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 10 Jun 2019 22:05:14 +0000 (15:05 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 8 Jul 2019 18:30:11 +0000 (11:30 -0700)
commit12217de08cb1fd3dcedcaacb8757ee2f26fc3002
tree12e2b70bd87d390405c761cfebaa70d079908d59
parentad50e812a3413a379bed3119537d3492257a8854
nir: Handle swizzle in nir_alu_srcs_negative_equal

When I added this function, I was not sure if swizzles of immediate
values were a thing that occurred in NIR.  The only existing user of
these functions is the partial redundancy elimination for compares.
Since comparison instructions are inherently scalar, this does not
occur.

However, a couple later patches, "nir/algebraic: Recognize
open-coded flrp(-1, 1, a) and flrp(1, -1, a)" combined with "intel/vec4:
Try to emit a single load for multiple 3-src instruction operands",
collaborate to create a few thousand instances.

No shader-db changes on any Intel platform.

v2: Handle the swizzle in nir_alu_srcs_negative_equal and leave
nir_const_value_negative_equal unchanged.  Suggested by Jason.

v3: Correctly handle write masks.  Add note (and assertion) that the
caller is responsible for various compatibility checks.  The single
existing caller only calls this for combinations of scalar fadd and
float comparison instructions, so all of the requirements are met.  A
later patch (intel/vec4: Try to emit a single load for multiple 3-src
instruction operands) will call this for sources of the same
instruction, so all of the requirements are met.

v4: Add unit test for nir_opt_comparison_pre that is fixed by this
commit.

Reviewed-by: Matt Turner <mattst88@gmail.com>
src/compiler/nir/nir_instr_set.c
src/compiler/nir/tests/comparison_pre_tests.cpp
src/compiler/nir/tests/negative_equal_tests.cpp