summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2021-07-20 13:37:31 -0700
committerDylan Baker <dylan.c.baker@intel.com>2021-07-21 11:53:50 -0700
commit9d0be7b61320ab107150f08fe8aea01decad99b8 (patch)
tree7fecd9bbc371bbee777fceafe2e38f4218ee4558
parentf2bdec9ecd9221d410015dc30e175564c86e223a (diff)
nir/gcm: Clear out pass_flags before starting
With this pass enabled in Intel drivers, running shader-db on shaders/unity/38.shader_test resulted in Program received signal SIGSEGV, Segmentation fault. gcm_schedule_early_src (src=0x555555d45348, void_state=0x7fffffffba40) at ../../SOURCE/master/src/compiler/nir/nir_opt_gcm.c:297 297 if (info->early_block->index < src_info->early_block->index) (gdb) print src_info->early_block $1 = (nir_block *) 0x0 I tracked this down to an early exit from gcm_schedule_early_instr on the parent instruction because instr->pass_flags was 0x1c. That should be an impossible value for this pass, so I inferred that pass_flags must have dirt left from some previous pass. Fixes: 8dfe6f672f4 ("nir/GCM: Use pass_flags instead of bitsets for tracking visited/pinned") Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/597> (cherry picked from commit 436668874a1508edf127be16873c6811fe13a3e6)
-rw-r--r--.pick_status.json2
-rw-r--r--src/compiler/nir/nir_opt_gcm.c5
2 files changed, 6 insertions, 1 deletions
diff --git a/.pick_status.json b/.pick_status.json
index 32176d8b405..45a8e66a85f 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -58,7 +58,7 @@
"description": "nir/gcm: Clear out pass_flags before starting",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "8dfe6f672f4f3e226089c6cc8d392fcd39dff5cb"
},
diff --git a/src/compiler/nir/nir_opt_gcm.c b/src/compiler/nir/nir_opt_gcm.c
index 891da57fe35..d6fd35f84c2 100644
--- a/src/compiler/nir/nir_opt_gcm.c
+++ b/src/compiler/nir/nir_opt_gcm.c
@@ -604,6 +604,11 @@ opt_gcm_impl(nir_function_impl *impl, bool value_number)
nir_metadata_require(impl, nir_metadata_block_index |
nir_metadata_dominance);
+ /* A previous pass may have left pass_flags dirty, so clear it all out. */
+ nir_foreach_block(block, impl)
+ nir_foreach_instr(instr, block)
+ instr->pass_flags = 0;
+
struct gcm_state state;
state.impl = impl;