i965/vec4: Fix cmod propagation not to propagate non-identity cmod into CMP(N).
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 1 Jun 2016 23:27:52 +0000 (16:27 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Sat, 4 Jun 2016 01:38:51 +0000 (18:38 -0700)
commita2135c6fd95d3e48f222a702c2b814e3cf37eb7d
tree3352d000842415d0cf4829745306fcd9ee8e693b
parent7a3a0d921235712fa8d22f85552cc382a793ce95
i965/vec4: Fix cmod propagation not to propagate non-identity cmod into CMP(N).

The conditional mod of these instructions determines the semantics of
the comparison itself (rather than being evaluated based on the result
of the instruction as is usually the case for most other instructions
that allow conditional mods), so it's in general not legal to
propagate a conditional mod into a CMP instruction.  This prevents
cmod propagation from (mis)optimizing:

 cmp.z.f0 tmp, ...
 mov.z.f0 null, tmp

into:

 cmp.z.f0 tmp, ...

which gives the negation of the flag result of the original sequence.
I originally noticed this while working on SIMD32 in the scalar
back-end, but the same scenario is likely to be possible in vec4
programs so this commit ports the bugfix with the same name from the
scalar back-end to the vec4 cmod propagation pass.

Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/brw_vec4_cmod_propagation.cpp