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