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

Reply via email to