Mesa (master): freedreno/ir3: don't be confused by eliminated indirects

Rob Clark robclark at kemper.freedesktop.org
Fri Jul 3 12:57:13 UTC 2015


Module: Mesa
Branch: master
Commit: a84505c71920f2c70bc8d83cee3e223cd2d976ad
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a84505c71920f2c70bc8d83cee3e223cd2d976ad

Author: Rob Clark <robclark at freedesktop.org>
Date:   Thu Jul  2 15:38:34 2015 -0400

freedreno/ir3: don't be confused by eliminated indirects

If an instruction using address register value gets eliminated, we need
to remove it from the indirects list, otherwise it causes mayhem in
sched for scheduling address register usage.

Signed-off-by: Rob Clark <robclark at freedesktop.org>

---

 src/gallium/drivers/freedreno/ir3/ir3_depth.c |    9 +++++++++
 src/gallium/drivers/freedreno/ir3/ir3_sched.c |    5 +++++
 2 files changed, 14 insertions(+)

diff --git a/src/gallium/drivers/freedreno/ir3/ir3_depth.c b/src/gallium/drivers/freedreno/ir3/ir3_depth.c
index 3a10824..0f346b2 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_depth.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_depth.c
@@ -167,6 +167,15 @@ ir3_depth(struct ir3 *ir)
 		remove_unused_by_block(block);
 	}
 
+	/* note that we can end up with unused indirects, but we should
+	 * not end up with unused predicates.
+	 */
+	for (i = 0; i < ir->indirects_count; i++) {
+		struct ir3_instruction *instr = ir->indirects[i];
+		if (instr->depth == DEPTH_UNUSED)
+			ir->indirects[i] = NULL;
+	}
+
 	/* cleanup unused inputs: */
 	for (i = 0; i < ir->ninputs; i++) {
 		struct ir3_instruction *in = ir->inputs[i];
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_sched.c b/src/gallium/drivers/freedreno/ir3/ir3_sched.c
index 414d14e..0cb1589 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_sched.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_sched.c
@@ -299,6 +299,8 @@ add_eligible_instrs(struct ir3_sched_ctx *ctx, struct ir3_sched_notes *notes,
 			bool ready = false;
 			for (unsigned i = 0; (i < ir->indirects_count) && !ready; i++) {
 				struct ir3_instruction *indirect = ir->indirects[i];
+				if (!indirect)
+					continue;
 				if (indirect->address != instr)
 					continue;
 				ready = could_sched(indirect, instr);
@@ -338,6 +340,9 @@ split_addr(struct ir3_sched_ctx *ctx)
 	for (i = 0; i < ir->indirects_count; i++) {
 		struct ir3_instruction *indirect = ir->indirects[i];
 
+		if (!indirect)
+			continue;
+
 		/* skip instructions already scheduled: */
 		if (is_scheduled(indirect))
 			continue;




More information about the mesa-commit mailing list