diff mbox series

[MIPS] Reject vector constants from the constant pool

Message ID 1570705698-23918-1-git-send-email-mihailo.stojanovic@rt-rk.com
State New
Headers show
Series [MIPS] Reject vector constants from the constant pool | expand

Commit Message

Mihailo Stojanovic Oct. 10, 2019, 11:08 a.m. UTC
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

Comments

Jeff Law Oct. 14, 2019, 9:08 p.m. UTC | #1
On 10/10/19 5:08 AM, Mihailo Stojanovic wrote:
> 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.
THanks.  Installed on the trunk.

jeff
diff mbox series

Patch

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 } } */