i965/peephole_ffma: Only match a mul+add if none of the ops are exact
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 28 Mar 2016 18:47:27 +0000 (11:47 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 4 Apr 2016 20:48:10 +0000 (13:48 -0700)
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/drivers/dri/i965/brw_nir_opt_peephole_ffma.c

index 6e8b1f99505f83fe34d212d0d29072957d48628e..22ff2e3c9f8073169de7e6db65d9e993edcca0ce 100644 (file)
@@ -84,6 +84,17 @@ get_mul_for_src(nir_alu_src *src, int num_components,
       return NULL;
 
    nir_alu_instr *alu = nir_instr_as_alu(instr);
+
+   /* We want to bail if any of the other ALU operations involved is labled
+    * exact.  One reason for this is that, while the value that is changing is
+    * actually the result of the add and not the multiply, the intention of
+    * the user when they specify an exact multiply is that they want *that*
+    * value and what they don't care about is the add.  Another reason is that
+    * SPIR-V explicitly requires this behaviour.
+    */
+   if (alu->exact)
+      return NULL;
+
    switch (alu->op) {
    case nir_op_imov:
    case nir_op_fmov: