From a0883b0800b7a63d8b68a418df694ff1da5b9381 Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Wed, 10 Aug 2016 13:49:12 +0000 Subject: [PATCH] re PR target/72853 (gcc/testsuite/gcc.c-torture/execute/20021120-1.c generates incorrect stxssp op with -mcpu=power9) [gcc] 2016-08-10 Michael Meissner PR target/72853 * config/rs6000/rs6000.c (mem_operand_ds_form): Add check for op being an offsettable address. [gcc/testsuite] 2016-08-10 Michael Meissner PR target/72853 * gcc.target/powerpc/pr72853.c: New test. From-SVN: r239325 --- gcc/ChangeLog | 6 ++ gcc/config/rs6000/rs6000.c | 3 + gcc/testsuite/ChangeLog | 5 + gcc/testsuite/gcc.target/powerpc/pr72853.c | 108 +++++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr72853.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7dbe48608f0..afa402028d7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-08-10 Michael Meissner + + PR target/72853 + * config/rs6000/rs6000.c (mem_operand_ds_form): Add check for op + being an offsettable address. + 2016-08-10 Martin Liska PR gcov-profile/58306 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 5aa056cb4c8..3c85dd18174 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -7739,6 +7739,9 @@ mem_operand_ds_form (rtx op, machine_mode mode) int extra; rtx addr = XEXP (op, 0); + if (!offsettable_address_p (false, mode, addr)) + return false; + op = address_offset (addr); if (op == NULL_RTX) return true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c9f58fec411..54e63dfd435 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-08-10 Michael Meissner + + PR target/72853 + * gcc.target/powerpc/pr72853.c: New test. + 2016-08-10 Martin Liska PR gcov-profile/58306 diff --git a/gcc/testsuite/gcc.target/powerpc/pr72853.c b/gcc/testsuite/gcc.target/powerpc/pr72853.c new file mode 100644 index 00000000000..8eae7d4a41d --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr72853.c @@ -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\]" } } */ -- 2.30.2