aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2018-12-11 14:07:52 -0800
committerEric Anholt <[email protected]>2018-12-14 17:48:01 -0800
commita7e15a50866cf6bff1114d6e34ee8beab23ee7bb (patch)
tree9c2cded5063d54d80b468eab5205715de0ed915e
parent5b2cc038522de2bd4b522d6376aef34c65af02d5 (diff)
v3d: Avoid assertion failures when removing end-of-shader instructions.
After generating VIR, we leave c->cursor pointing at the end of the shader. If the shader had dead code at the end (for example from preamble instructions in a shader with no side effects), we would assertion fail that we were leaving the cursor pointing at freed memory. Since anything following DCE should be setting up a new cursor anyway, just clear the cursor at the start.
-rw-r--r--src/broadcom/compiler/vir_opt_dead_code.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/broadcom/compiler/vir_opt_dead_code.c b/src/broadcom/compiler/vir_opt_dead_code.c
index 362fc9e52a3..4aedbb6540f 100644
--- a/src/broadcom/compiler/vir_opt_dead_code.c
+++ b/src/broadcom/compiler/vir_opt_dead_code.c
@@ -101,6 +101,12 @@ vir_opt_dead_code(struct v3d_compile *c)
bool progress = false;
bool *used = calloc(c->num_temps, sizeof(bool));
+ /* Defuse the "are you removing the cursor?" assertion in the core.
+ * You'll need to set up a new cursor for any new instructions after
+ * doing DCE (which we would expect, anyway).
+ */
+ c->cursor.link = NULL;
+
vir_for_each_inst_inorder(inst, c) {
for (int i = 0; i < vir_get_nsrc(inst); i++) {
if (inst->src[i].file == QFILE_TEMP)