From: Mihailo Stojanovic Date: Mon, 14 Oct 2019 21:07:56 +0000 (+0000) Subject: mips.c (mips_cannot_force_const_mem): Reject vector constants. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4236e880ee7902f789f8b99e21faea33ecb8a6dd;p=gcc.git mips.c (mips_cannot_force_const_mem): Reject vector constants. * config/mips/mips.c (mips_cannot_force_const_mem): Reject vector constants. * gcc.target/mips/constant-spill.c: New test. From-SVN: r276969 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index adc3550fc39..516e9c18138 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-10-14 Mihailo Stojanovic + + * config/mips/mips.c (mips_cannot_force_const_mem): Reject + vector constants. + 2019-10-14 Iain Sandoe * config/darwin.c: Use unsigned ints for the picbase label diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index e7c22123ed5..7f6a0db46fd 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -2409,7 +2409,8 @@ mips_cannot_force_const_mem (machine_mode mode, rtx x) references, reload will consider forcing C into memory and using one of the instruction's memory alternatives. Returning false here will force it to use an input reload instead. */ - if (CONST_INT_P (x) && mips_legitimate_constant_p (mode, x)) + if ((CONST_INT_P (x) || GET_CODE (x) == CONST_VECTOR) + && mips_legitimate_constant_p (mode, x)) return true; split_const (x, &base, &offset); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 281da7ff85e..08d4a79867d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-10-14 Mihailo Stojanovic + + * gcc.target/mips/constant-spill.c: New test. + 2019-10-14 Richard Biener PR tree-optimization/92069 diff --git a/gcc/testsuite/gcc.target/mips/constant-spill.c b/gcc/testsuite/gcc.target/mips/constant-spill.c new file mode 100644 index 00000000000..1494705338b --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/constant-spill.c @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-options "-mfp64 -mhard-float -mmsa" } */ +/* { dg-skip-if "code quality test" { *-*-* } { "-Os" "-O0" "-O1" "-O2" } { "" } } */ + +void foo (void); + +void bar (void) +{ + int x[4]; + int y[4]; + int i; + + while (1) + { + foo (); + + for (i = 0; i < 4; i++) + { + x[i] = 0; + y[i] = 0; + } + + asm volatile ("" + : + :"m"(x), "m"(y) + :"memory"); + } +} + +/* { dg-final { scan-assembler-not "ld.w" } } */ +/* { dg-final { scan-assembler-times "st.w" 2 } } */