[multiple changes]
authorAndrew Pinski <apinski@cavium.com>
Tue, 13 Jan 2015 13:55:23 +0000 (13:55 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Tue, 13 Jan 2015 13:55:23 +0000 (05:55 -0800)
2015-01-13  Andrew Pinski   <apinski@cavium.com>

        * config/aarch64/aarch64.c (aarch64_operands_ok_for_ldpstp): Reject
        volatile mems.
        (aarch64_operands_adjust_ok_for_ldpstp): Likewise.

2015-01-13  Andrew Pinski  <apinski@cavium.com>

        * gcc.target/aarch64/volatileloadpair-1.c: New testcase.
        * gcc.target/aarch64/volatileloadpair-2.c: New testcase.

From-SVN: r219530

gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/volatileloadpair-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/volatileloadpair-2.c [new file with mode: 0644]

index 4d9809b..2b1449b 100644 (file)
@@ -1,3 +1,9 @@
+2015-01-13  Andrew Pinski   <apinski@cavium.com>
+
+       * config/aarch64/aarch64.c (aarch64_operands_ok_for_ldpstp): Reject
+       volatile mems.
+       (aarch64_operands_adjust_ok_for_ldpstp): Likewise.
+
 2015-01-13  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/63974
index 5100532..3b6c67a 100644 (file)
@@ -10630,6 +10630,10 @@ aarch64_operands_ok_for_ldpstp (rtx *operands, bool load,
       reg_2 = operands[3];
     }
 
+  /* The mems cannot be volatile.  */
+  if (MEM_VOLATILE_P (mem_1) || MEM_VOLATILE_P (mem_2))
+    return false;
+
   /* Check if the addresses are in the form of [base+offset].  */
   extract_base_offset_in_addr (mem_1, &base_1, &offset_1);
   if (base_1 == NULL_RTX || offset_1 == NULL_RTX)
@@ -10737,6 +10741,11 @@ aarch64_operands_adjust_ok_for_ldpstp (rtx *operands, bool load,
   if (!MEM_P (mem_1) || aarch64_mem_pair_operand (mem_1, mode))
     return false;
 
+  /* The mems cannot be volatile.  */
+  if (MEM_VOLATILE_P (mem_1) || MEM_VOLATILE_P (mem_2)
+      || MEM_VOLATILE_P (mem_3) ||MEM_VOLATILE_P (mem_4))
+    return false;
+
   /* Check if the addresses are in the form of [base+offset].  */
   extract_base_offset_in_addr (mem_1, &base_1, &offset_1);
   if (base_1 == NULL_RTX || offset_1 == NULL_RTX)
index 819a122..8a5a62e 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-13  Andrew Pinski  <apinski@cavium.com>
+
+       * gcc.target/aarch64/volatileloadpair-1.c: New testcase.
+       * gcc.target/aarch64/volatileloadpair-2.c: New testcase.
+
 2015-01-13  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/64406
diff --git a/gcc/testsuite/gcc.target/aarch64/volatileloadpair-1.c b/gcc/testsuite/gcc.target/aarch64/volatileloadpair-1.c
new file mode 100644 (file)
index 0000000..76162a5
--- /dev/null
@@ -0,0 +1,46 @@
+/* { dg-do compile } */
+/* { dg-do options "-O2" } */
+/* volatile references should not produce load pair. */
+/* { dg-final { scan-assembler-not "ldp\t" } } */
+
+int f0(volatile int *a)
+{
+  int b = a[0];
+  int c = a[1];
+  return b + c;
+}
+
+int f1(volatile int *a)
+{
+  int b = a[1];
+  int c = a[0];
+  return b + c;
+}
+
+int f2(volatile int *a)
+{
+  int b = a[1];
+  int c = a[2];
+  return b + c;
+}
+
+int f3(volatile int *a)
+{
+  int b = a[2];
+  int c = a[1];
+  return b + c;
+}
+
+int f4(volatile int *a)
+{
+  int b = a[2];
+  int c = a[3];
+  return b + c;
+}
+
+int f5(volatile int *a)
+{
+  int b = a[3];
+  int c = a[2];
+  return b + c;
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/volatileloadpair-2.c b/gcc/testsuite/gcc.target/aarch64/volatileloadpair-2.c
new file mode 100644 (file)
index 0000000..133bda2
--- /dev/null
@@ -0,0 +1,49 @@
+/* { dg-do compile } */
+/* { dg-do options "-O2" } */
+/* volatile references should not produce load pair. */
+/* { dg-final { scan-assembler-not "ldp\t" } } */
+
+int f0(volatile int *a)
+{
+  int b = a[0];
+  int c = a[1];
+  int d = a[2];
+  int e = a[3];
+  return b + c + d + e;
+}
+
+int f1(volatile int *a)
+{
+  int b = a[1];
+  int c = a[0];
+  int d = a[2];
+  int e = a[3];
+  return b + c + d + e;
+}
+
+int f2(volatile int *a)
+{
+  int b = a[1];
+  int c = a[0];
+  int d = a[3];
+  int e = a[2];
+  return b + c + d + e;
+}
+
+int f3(volatile int *a)
+{
+  int b = a[1];
+  int c = a[3];
+  int d = a[0];
+  int e = a[2];
+  return b + c + d + e;
+}
+
+int f4(volatile int *a)
+{
+  int b = a[1];
+  int c = a[3];
+  int d = a[2];
+  int e = a[0];
+  return b + c + d + e;
+}