Mesa (master): freedreno/ir3: avoid fan-in sources referring to same instruction

Rob Clark robclark at kemper.freedesktop.org
Fri Oct 3 01:07:08 UTC 2014


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

Author: Ilia Mirkin <imirkin at alum.mit.edu>
Date:   Tue Sep 30 23:27:25 2014 -0400

freedreno/ir3: avoid fan-in sources referring to same instruction

Since the RA has to be done s.t. each one gets its own (adjacent)
register, it would complicate matters if instructions were allowed to be
repeated. This enables copy-propagation use in situations where
previously that might have happened.

Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
Signed-off-by: Rob Clark <robclark at freedesktop.org>

---

 src/gallium/drivers/freedreno/ir3/ir3_cp.c |   12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cp.c b/src/gallium/drivers/freedreno/ir3/ir3_cp.c
index 73c2a27..83bcb7a 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_cp.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_cp.c
@@ -70,7 +70,7 @@ static void walk_children(struct ir3_instruction *instr, bool keep)
 static struct ir3_instruction *
 instr_cp_fanin(struct ir3_instruction *instr)
 {
-	unsigned i;
+	unsigned i, j;
 
 	/* we need to handle fanin specially, to detect cases
 	 * when we need to keep a mov
@@ -92,7 +92,15 @@ instr_cp_fanin(struct ir3_instruction *instr)
 			if (is_meta(cand) && (cand->opc == OPC_META_FO))
 				cand = instr_cp(src->instr, true);
 
-			src->instr = cand;
+			/* we can't have 2 registers referring to the same instruction, so
+			 * go through and check if any already refer to the candidate
+			 * instruction. if so, don't do the propagation.
+			 */
+			for (j = 1; j < instr->regs_count; j++)
+				if (instr->regs[j]->instr == cand)
+					break;
+			if (j == instr->regs_count)
+				src->instr = cand;
 		}
 	}
 




More information about the mesa-commit mailing list