From: Kito Cheng <kito.ch...@gmail.com>

Kito Cheng  <kito.ch...@gmail.com>
Shiva Chen  <shiva0...@gmail.com>

ChangeLog:
gcc/
        * config/nds32/nds32-pipelines-auxiliary.c (wext_odd_dep_p):
        Handle subreg.

gcc/testsuite
        * gcc.target/nds32/wext-dep.c: New.
---
 gcc/config/nds32/nds32-pipelines-auxiliary.c | 16 ++++++++++++----
 gcc/testsuite/gcc.target/nds32/wext-dep.c    | 11 +++++++++++
 2 files changed, 23 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/nds32/wext-dep.c

diff --git a/gcc/config/nds32/nds32-pipelines-auxiliary.c 
b/gcc/config/nds32/nds32-pipelines-auxiliary.c
index 0c043d4..07ba037 100644
--- a/gcc/config/nds32/nds32-pipelines-auxiliary.c
+++ b/gcc/config/nds32/nds32-pipelines-auxiliary.c
@@ -363,14 +363,19 @@ wext_odd_dep_p (rtx insn, rtx def_reg)
     return reg_overlap_p (def_reg, use_reg);
 
   gcc_assert (REG_P (def_reg) || GET_CODE (def_reg) == SUBREG);
-  gcc_assert (REG_P (use_reg));
+  gcc_assert (REG_P (use_reg) || GET_CODE (use_reg) == SUBREG);
 
   if (REG_P (def_reg))
     {
-      if (!TARGET_BIG_ENDIAN)
-       return REGNO (def_reg) == REGNO (use_reg) + 1;
+      if REG_P (use_reg)
+       {
+         if (!TARGET_BIG_ENDIAN)
+           return REGNO (def_reg) == REGNO (use_reg) + 1;
+         else
+           return REGNO (def_reg) == REGNO (use_reg);
+       }
       else
-       return  REGNO (def_reg) == REGNO (use_reg);
+       return true;
     }
 
   if (GET_CODE (def_reg) == SUBREG)
@@ -378,6 +383,9 @@ wext_odd_dep_p (rtx insn, rtx def_reg)
       if (!reg_overlap_p (def_reg, use_reg))
        return false;
 
+      if (GET_CODE (use_reg) == SUBREG)
+       return true;
+
       if (!TARGET_BIG_ENDIAN)
        return SUBREG_BYTE (def_reg) == 4;
       else
diff --git a/gcc/testsuite/gcc.target/nds32/wext-dep.c 
b/gcc/testsuite/gcc.target/nds32/wext-dep.c
new file mode 100644
index 0000000..2af04d0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/nds32/wext-dep.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-mext-dsp -mcpu=n15" { target nds32*-*-* } } */
+
+/* The test case check that wext_odd_dep_p in nds32-pipelines-auxiliary.c
+   could handle the use_reg is SUBREG. */
+typedef long long T;
+typedef T vl_t __attribute__((vector_size(2 * sizeof (T))));
+
+void foo(vl_t *a, vl_t *b, int c) {
+  *a = *b >> c;
+}
-- 
1.8.3.1

Reply via email to