nir: Only rematerialize comparisons with all SSA sources
authorJason Ekstrand <jason@jlekstrand.net>
Fri, 19 Jul 2019 18:07:39 +0000 (13:07 -0500)
committerJason Ekstrand <jason@jlekstrand.net>
Fri, 19 Jul 2019 19:45:36 +0000 (19:45 +0000)
Otherwise, you may end up moving a register read and that could result
in an incorrect shader.  This commit fixes a rendering issue in Elite:
Dangerous.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111152
Fixes: 3ee2e84c60 "nir: Rematerialize compare instructions"
Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/compiler/nir/nir_opt_rematerialize_compares.c

index 806dbd2f29adf27cf0bc8c2f2be89868ac0542af..8af33ab436ee141b698b780b12fe686999312b9d 100644 (file)
@@ -57,6 +57,18 @@ is_two_src_comparison(const nir_alu_instr *instr)
    }
 }
 
+static bool
+all_srcs_are_ssa(const nir_alu_instr *instr)
+{
+   for (unsigned i = 0; i < nir_op_infos[instr->op].num_inputs; i++) {
+      if (!instr->src[i].src.is_ssa)
+         return false;
+   }
+
+   return true;
+}
+
+
 static bool
 all_uses_are_bcsel(const nir_alu_instr *instr)
 {
@@ -96,6 +108,9 @@ nir_opt_rematerialize_compares_impl(nir_shader *shader, nir_function_impl *impl)
          if (!is_two_src_comparison(alu))
             continue;
 
+         if (!all_srcs_are_ssa(alu))
+            continue;
+
          if (!all_uses_are_bcsel(alu))
             continue;