OSDN Git Service

target/xtensa: fix break_dependency for repeated resources
authorMax Filippov <jcmvbkbc@gmail.com>
Fri, 22 Mar 2019 03:22:03 +0000 (20:22 -0700)
committerMax Filippov <jcmvbkbc@gmail.com>
Fri, 22 Mar 2019 04:47:50 +0000 (21:47 -0700)
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>
target/xtensa/translate.c
tests/tcg/xtensa/test_flix.S

index 77bc04d..65561d2 100644 (file)
@@ -1041,7 +1041,6 @@ static bool break_dependency(struct slot_prop *a,
             copy[n].resource = b->in[j].resource;
             copy[n].arg = b->arg + index;
             ++n;
-            ++i;
             ++j;
             rv = true;
         }
index 7c259e7..7af06b2 100644 (file)
@@ -55,6 +55,23 @@ test sum
     .previous
 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
 
 test_suite_end