summaryrefslogtreecommitdiffstats
path: root/src/compiler/nir
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2019-07-19 13:07:39 -0500
committerJason Ekstrand <[email protected]>2019-07-19 19:45:36 +0000
commit6301f80b840d50f2f8ec4fc46adfe8ad43da53ab (patch)
tree214c701b13ac99818da2ac8a7a9aa3566cdf8d31 /src/compiler/nir
parente352b4d650d37730e5087792b9a74ef31d1974ab (diff)
nir: Only rematerialize comparisons with all SSA sources
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 <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/compiler/nir')
-rw-r--r--src/compiler/nir/nir_opt_rematerialize_compares.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_opt_rematerialize_compares.c b/src/compiler/nir/nir_opt_rematerialize_compares.c
index 806dbd2f29a..8af33ab436e 100644
--- a/src/compiler/nir/nir_opt_rematerialize_compares.c
+++ b/src/compiler/nir/nir_opt_rematerialize_compares.c
@@ -58,6 +58,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)
{
if (!instr->dest.dest.is_ssa)
@@ -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;