This rejects vector constants from the constant pool, which removes unnecessary reloads of zero constant around function call in the test case.
Tested with mips-mti-linux-gnu. gcc/ChangeLog: * config/mips/mips.c (mips_cannot_force_const_mem): Reject vector constants. gcc/testsuite/ChangeLog: * gcc.target/mips/constant-spill.c: New test. --- gcc/config/mips/mips.c | 3 ++- gcc/testsuite/gcc.target/mips/constant-spill.c | 31 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/mips/constant-spill.c diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index e7c2212..7f6a0db 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/gcc.target/mips/constant-spill.c b/gcc/testsuite/gcc.target/mips/constant-spill.c new file mode 100644 index 0000000..1494705 --- /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 } } */ -- 2.7.4