target/xtensa: fix break_dependency for repeated resources
break_dependency incorrectly handles the case of dependency on an opcode
that references the same register multiple times. E.g. the following
instruction is translated incorrectly:
{ or a2, a3, a3 ; or a3, a2, a2 }
This happens because resource indices of both dependency graph nodes are
incremented, and a copy for the second instance of the same register in
the ending node is not done.
Only increment resource index of the ending node of the dependency.
Add test.
Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
This commit is contained in:
parent
62a172e6a7
commit
b9ec52188f
@ -1041,7 +1041,6 @@ static bool break_dependency(struct slot_prop *a,
|
|||||||
copy[n].resource = b->in[j].resource;
|
copy[n].resource = b->in[j].resource;
|
||||||
copy[n].arg = b->arg + index;
|
copy[n].arg = b->arg + index;
|
||||||
++n;
|
++n;
|
||||||
++i;
|
|
||||||
++j;
|
++j;
|
||||||
rv = true;
|
rv = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -55,6 +55,23 @@ test sum
|
|||||||
.previous
|
.previous
|
||||||
test_end
|
test_end
|
||||||
|
|
||||||
|
test rep_dependency
|
||||||
|
|
||||||
|
{
|
||||||
|
movi a2, 1
|
||||||
|
movi a3, 2
|
||||||
|
nop
|
||||||
|
}
|
||||||
|
{
|
||||||
|
or a2, a3, a3
|
||||||
|
or a3, a2, a2
|
||||||
|
nop
|
||||||
|
}
|
||||||
|
assert eqi, a2, 2
|
||||||
|
assert eqi, a3, 1
|
||||||
|
|
||||||
|
test_end
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
test_suite_end
|
test_suite_end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user