summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Clark <robclark@freedesktop.org>2016-04-24 11:40:12 -0400
committerRob Clark <robclark@freedesktop.org>2016-04-24 13:40:57 -0400
commit0831eb94b9adde3f1542ca75a1f80dbe165b8f31 (patch)
tree42e24a59bea37a8518e727b2ae95e7cb62b1a16e
parent36c9ea6e79267d62e8d71cc51c6d6db4bdb6f977 (diff)
freedreno/ir3: relax restriction in grouping
Currently we were two restrictive, and would insert an output move in cases like: MOV OUT[0], IN[0].xyzw Loosen the restriction to allow the current instruction to appear in the neighbor list but only at it's current possition. Signed-off-by: Rob Clark <robclark@freedesktop.org>
-rw-r--r--src/gallium/drivers/freedreno/ir3/ir3_group.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_group.c b/src/gallium/drivers/freedreno/ir3/ir3_group.c
index f229fe6eecd..633d66c58d4 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_group.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_group.c
@@ -92,8 +92,10 @@ static struct group_ops instr_ops = { instr_get, instr_insert_mov };
/* verify that cur != instr, but cur is also not in instr's neighbor-list: */
static bool
-in_neighbor_list(struct ir3_instruction *instr, struct ir3_instruction *cur)
+in_neighbor_list(struct ir3_instruction *instr, struct ir3_instruction *cur, int pos)
{
+ int idx = 0;
+
if (!instr)
return false;
@@ -101,7 +103,7 @@ in_neighbor_list(struct ir3_instruction *instr, struct ir3_instruction *cur)
return true;
for (instr = ir3_neighbor_first(instr); instr; instr = instr->cp.right)
- if (instr == cur)
+ if ((idx++ != pos) && (instr == cur))
return true;
return false;
@@ -137,7 +139,7 @@ restart:
/* we also can't have an instr twice in the group: */
for (j = i + 1; (j < n) && !conflict; j++)
- if (in_neighbor_list(ops->get(arr, j), instr))
+ if (in_neighbor_list(ops->get(arr, j), instr, i))
conflict = true;
if (conflict) {