diff mbox

, PR 72853, Fix Power9 issue with scalar double Altivec d-form instructions

Message ID 20160810035326.GA27533@ibm-tiger.the-meissners.org
State New
Headers show

Commit Message

Michael Meissner Aug. 10, 2016, 3:53 a.m. UTC
As we are starting to run the testsuite through the power9 simulator using a
compiler built with the --with-cpu=power9 configuration option, we discovered
that one of the tests (20021120-1.c) failed due to the wrong instruction being
generated.  It turns out that the wY constraint (which in turn calls
mem_operand_ds_form) was allowing indexed addresses.  Since the alternative for
STXSD (Ativec DS-form instruction occurred before STXSDX (VSX X-form
instruction), the STXSD was generated.

This patch fixes this problem and it causes no regressions.  Can I check it
into the trunk?  In addition, this bug shows up in GCC 6.2.  Assuming there are
no regressions after applying this patch, can I check it into the 6.2 branch as
well?

[gcc]
2016-08-09  Michael Meissner  <meissner@linux.vnet.ibm.com>

	PR target/72853
	* config/rs6000/rs6000.c (mem_operand_ds_form): Add check for op
	being an offsettable address.

[gcc/testsuite]
2016-08-09  Michael Meissner  <meissner@linux.vnet.ibm.com>

	PR target/72853
	* gcc.target/powerpc/pr72853.c: New test.

Comments

Segher Boessenkool Aug. 10, 2016, 4:13 a.m. UTC | #1
On Tue, Aug 09, 2016 at 11:53:26PM -0400, Michael Meissner wrote:
> Index: gcc/config/rs6000/rs6000.c
> ===================================================================
> --- gcc/config/rs6000/rs6000.c	(revision 239301)
> +++ gcc/config/rs6000/rs6000.c	(working copy)
> @@ -7739,6 +7739,9 @@ mem_operand_ds_form (rtx op, machine_mod
>    int extra;
>    rtx addr = XEXP (op, 0);
>  
> +  if (!MEM_P (op) || !offsettable_address_p (false, mode, addr))
> +    return false;

Either the MEM_P test is superfluous, or it should come before the
XEXP above?  Maybe the MEM_P part should be an assert?

Okay with that fixed (for trunk and 6).  Thanks,


Segher
diff mbox

Patch

Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 239301)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -7739,6 +7739,9 @@  mem_operand_ds_form (rtx op, machine_mod
   int extra;
   rtx addr = XEXP (op, 0);
 
+  if (!MEM_P (op) || !offsettable_address_p (false, mode, addr))
+    return false;
+
   op = address_offset (addr);
   if (op == NULL_RTX)
     return true;
Index: gcc/testsuite/gcc.target/powerpc/pr72853.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/pr72853.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/pr72853.c	(working copy)
@@ -0,0 +1,108 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-options "-mcpu=power9 -O3 -mupper-regs-df -mupper-regs-sf -funroll-loops" } */
+
+/* derived from 20021120-1.c, compiled for -mcpu=power9.  */
+
+extern void abort (void);
+extern void exit (int);
+
+volatile double gd[32];
+volatile float gf[32];
+
+void
+foo (int n)
+{
+  double d00, d10, d20, d30, d01, d11, d21, d31, d02, d12, d22, d32, d03, d13,
+    d23, d33, d04, d14, d24, d34, d05, d15, d25, d35, d06, d16, d26, d36, d07,
+    d17, d27, d37;
+  float f00, f10, f20, f30, f01, f11, f21, f31, f02, f12, f22, f32, f03, f13,
+    f23, f33, f04, f14, f24, f34, f05, f15, f25, f35, f06, f16, f26, f36, f07,
+    f17, f27, f37;
+  volatile double *pd;
+  volatile float *pf;
+  int i;
+
+  pd = gd;
+  d00 = *(pd++), d10 = *(pd++), d20 = *(pd++), d30 = *(pd++), d01 =
+    *(pd++), d11 = *(pd++), d21 = *(pd++), d31 = *(pd++), d02 = *(pd++), d12 =
+    *(pd++), d22 = *(pd++), d32 = *(pd++), d03 = *(pd++), d13 = *(pd++), d23 =
+    *(pd++), d33 = *(pd++), d04 = *(pd++), d14 = *(pd++), d24 = *(pd++), d34 =
+    *(pd++), d05 = *(pd++), d15 = *(pd++), d25 = *(pd++), d35 = *(pd++), d06 =
+    *(pd++), d16 = *(pd++), d26 = *(pd++), d36 = *(pd++), d07 = *(pd++), d17 =
+    *(pd++), d27 = *(pd++), d37 = *(pd++);
+  for (i = 0; i < n; i++)
+    {
+      pf = gf;
+      f00 = *(pf++), f10 = *(pf++), f20 = *(pf++), f30 = *(pf++), f01 =
+	*(pf++), f11 = *(pf++), f21 = *(pf++), f31 = *(pf++), f02 =
+	*(pf++), f12 = *(pf++), f22 = *(pf++), f32 = *(pf++), f03 =
+	*(pf++), f13 = *(pf++), f23 = *(pf++), f33 = *(pf++), f04 =
+	*(pf++), f14 = *(pf++), f24 = *(pf++), f34 = *(pf++), f05 =
+	*(pf++), f15 = *(pf++), f25 = *(pf++), f35 = *(pf++), f06 =
+	*(pf++), f16 = *(pf++), f26 = *(pf++), f36 = *(pf++), f07 =
+	*(pf++), f17 = *(pf++), f27 = *(pf++), f37 = *(pf++);
+      pd = gd;
+      d00 += *(pd++), d10 += *(pd++), d20 += *(pd++), d30 += *(pd++), d01 +=
+	*(pd++), d11 += *(pd++), d21 += *(pd++), d31 += *(pd++), d02 +=
+	*(pd++), d12 += *(pd++), d22 += *(pd++), d32 += *(pd++), d03 +=
+	*(pd++), d13 += *(pd++), d23 += *(pd++), d33 += *(pd++), d04 +=
+	*(pd++), d14 += *(pd++), d24 += *(pd++), d34 += *(pd++), d05 +=
+	*(pd++), d15 += *(pd++), d25 += *(pd++), d35 += *(pd++), d06 +=
+	*(pd++), d16 += *(pd++), d26 += *(pd++), d36 += *(pd++), d07 +=
+	*(pd++), d17 += *(pd++), d27 += *(pd++), d37 += *(pd++);
+      pd = gd;
+      d00 += *(pd++), d10 += *(pd++), d20 += *(pd++), d30 += *(pd++), d01 +=
+	*(pd++), d11 += *(pd++), d21 += *(pd++), d31 += *(pd++), d02 +=
+	*(pd++), d12 += *(pd++), d22 += *(pd++), d32 += *(pd++), d03 +=
+	*(pd++), d13 += *(pd++), d23 += *(pd++), d33 += *(pd++), d04 +=
+	*(pd++), d14 += *(pd++), d24 += *(pd++), d34 += *(pd++), d05 +=
+	*(pd++), d15 += *(pd++), d25 += *(pd++), d35 += *(pd++), d06 +=
+	*(pd++), d16 += *(pd++), d26 += *(pd++), d36 += *(pd++), d07 +=
+	*(pd++), d17 += *(pd++), d27 += *(pd++), d37 += *(pd++);
+      pd = gd;
+      d00 += *(pd++), d10 += *(pd++), d20 += *(pd++), d30 += *(pd++), d01 +=
+	*(pd++), d11 += *(pd++), d21 += *(pd++), d31 += *(pd++), d02 +=
+	*(pd++), d12 += *(pd++), d22 += *(pd++), d32 += *(pd++), d03 +=
+	*(pd++), d13 += *(pd++), d23 += *(pd++), d33 += *(pd++), d04 +=
+	*(pd++), d14 += *(pd++), d24 += *(pd++), d34 += *(pd++), d05 +=
+	*(pd++), d15 += *(pd++), d25 += *(pd++), d35 += *(pd++), d06 +=
+	*(pd++), d16 += *(pd++), d26 += *(pd++), d36 += *(pd++), d07 +=
+	*(pd++), d17 += *(pd++), d27 += *(pd++), d37 += *(pd++);
+      pf = gf;
+      *(pf++) = f00, *(pf++) = f10, *(pf++) = f20, *(pf++) = f30, *(pf++) =
+	f01, *(pf++) = f11, *(pf++) = f21, *(pf++) = f31, *(pf++) =
+	f02, *(pf++) = f12, *(pf++) = f22, *(pf++) = f32, *(pf++) =
+	f03, *(pf++) = f13, *(pf++) = f23, *(pf++) = f33, *(pf++) =
+	f04, *(pf++) = f14, *(pf++) = f24, *(pf++) = f34, *(pf++) =
+	f05, *(pf++) = f15, *(pf++) = f25, *(pf++) = f35, *(pf++) =
+	f06, *(pf++) = f16, *(pf++) = f26, *(pf++) = f36, *(pf++) =
+	f07, *(pf++) = f17, *(pf++) = f27, *(pf++) = f37;
+    }
+  pd = gd;
+  *(pd++) = d00, *(pd++) = d10, *(pd++) = d20, *(pd++) = d30, *(pd++) =
+    d01, *(pd++) = d11, *(pd++) = d21, *(pd++) = d31, *(pd++) = d02, *(pd++) =
+    d12, *(pd++) = d22, *(pd++) = d32, *(pd++) = d03, *(pd++) = d13, *(pd++) =
+    d23, *(pd++) = d33, *(pd++) = d04, *(pd++) = d14, *(pd++) = d24, *(pd++) =
+    d34, *(pd++) = d05, *(pd++) = d15, *(pd++) = d25, *(pd++) = d35, *(pd++) =
+    d06, *(pd++) = d16, *(pd++) = d26, *(pd++) = d36, *(pd++) = d07, *(pd++) =
+    d17, *(pd++) = d27, *(pd++) = d37;
+}
+
+int
+main ()
+{
+  int i;
+
+  for (i = 0; i < 32; i++)
+    gd[i] = i, gf[i] = i;
+  foo (1);
+  for (i = 0; i < 32; i++)
+    if (gd[i] != i * 4 || gf[i] != i)
+      abort ();
+  exit (0);
+}
+
+/* { dg-final { scan-assembler-not "stxsd \[0-9\]+,\[0-9\]+,\[0-9\]"  } } */