From 634940f16812a80c2b3cc1d0e8c46a6c5d2c8086 Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Mon, 11 Dec 2017 18:54:55 +0000 Subject: [PATCH] backport: re PR target/81959 (PowerPC __float128 optimization fails with integer PRE_INC addresses) [gcc] 2017-12-11 Michael Meissner Back port from trunk 2017-12-01 Michael Meissner PR target/81959 * config/rs6000/rs6000.c (rs6000_address_for_fpconvert): Check for whether we can allocate pseudos before trying to fix an address. * config/rs6000/rs6000.md (float_si2_hw): Make sure the memory address is indexed or indirect. (floatuns_si2_hw2): Likewise. [gcct/testsuite] 2017-12-11 Michael Meissner Back port from trunk 2017-12-01 Michael Meissner PR target/81959 * gcc.target/powerpc/pr81959.c: New test. From-SVN: r255545 --- gcc/ChangeLog | 12 +++++++++++ gcc/config/rs6000/rs6000.c | 3 ++- gcc/config/rs6000/rs6000.md | 6 ++++++ gcc/testsuite/ChangeLog | 8 +++++++ gcc/testsuite/gcc.target/powerpc/pr81959.c | 25 ++++++++++++++++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr81959.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4d504110012..598a35ba916 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2017-12-11 Michael Meissner + + Back port from trunk + 2017-12-01 Michael Meissner + + PR target/81959 + * config/rs6000/rs6000.c (rs6000_address_for_fpconvert): Check for + whether we can allocate pseudos before trying to fix an address. + * config/rs6000/rs6000.md (float_si2_hw): Make sure the + memory address is indexed or indirect. + (floatuns_si2_hw2): Likewise. + 2017-12-11 Sudakshina Das Backported from trunk diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index a3a6e5a7a32..aa6ad717954 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -40023,7 +40023,8 @@ rs6000_address_for_fpconvert (rtx x) gcc_assert (MEM_P (x)); addr = XEXP (x, 0); - if (! legitimate_indirect_address_p (addr, strict_p) + if (can_create_pseudo_p () + && ! legitimate_indirect_address_p (addr, strict_p) && ! legitimate_indexed_address_p (addr, strict_p)) { if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC) diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index e92084268fe..8c3ccda8d91 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -14642,6 +14642,9 @@ { if (GET_CODE (operands[2]) == SCRATCH) operands[2] = gen_reg_rtx (DImode); + + if (MEM_P (operands[1])) + operands[1] = rs6000_address_for_fpconvert (operands[1]); }) (define_insn_and_split "float2" @@ -14705,6 +14708,9 @@ { if (GET_CODE (operands[2]) == SCRATCH) operands[2] = gen_reg_rtx (DImode); + + if (MEM_P (operands[1])) + operands[1] = rs6000_address_for_fpconvert (operands[1]); }) (define_insn_and_split "floatuns2" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 05f9d3110d0..37f6fa4403e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2017-12-11 Michael Meissner + + Back port from trunk + 2017-12-01 Michael Meissner + + PR target/81959 + * gcc.target/powerpc/pr81959.c: New test. + 2017-12-11 Sudakshina Das Backported from trunk diff --git a/gcc/testsuite/gcc.target/powerpc/pr81959.c b/gcc/testsuite/gcc.target/powerpc/pr81959.c new file mode 100644 index 00000000000..c4cc3733841 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr81959.c @@ -0,0 +1,25 @@ +/* { dg-do compile { target { powerpc64*-*-* && lp64 } } } */ +/* { dg-require-effective-target powerpc_p9vector_ok } */ +/* { dg-options "-mpower9-vector -O2 -mfloat128" } */ + +/* PR 81959, the compiler raised on unrecognizable insn message in converting + int to __float128, where the int had a PRE_INC in the address. */ + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE 1024 +#endif + +void +convert_int_to_float128 (__float128 * __restrict__ p, + int * __restrict__ q) +{ + unsigned long i; + + for (i = 0; i < ARRAY_SIZE; i++) + p[i] = (__float128)q[i]; +} + +/* { dg-final { scan-assembler {\mlfiwax\M|\mlxsiwax\M} } } */ +/* { dg-final { scan-assembler {\mxscvsdqp\M} } } */ +/* { dg-final { scan-assembler-not {\mmtvsrd\M} } } */ +/* { dg-final { scan-assembler-not {\mmtvsrw[sz]\M} } } */