re PR target/81959 (PowerPC __float128 optimization fails with integer PRE_INC addresses)
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Fri, 1 Dec 2017 23:52:20 +0000 (23:52 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Fri, 1 Dec 2017 23:52:20 +0000 (23:52 +0000)
[gcc]
2017-12-01  Michael Meissner  <meissner@linux.vnet.ibm.com>

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_<mode>si2_hw): Make sure the
memory address is indexed or indirect.
(floatuns_<mode>si2_hw2): Likewise.

[gcct/testsuite]
2017-12-01  Michael Meissner  <meissner@linux.vnet.ibm.com>

PR target/81959
* gcc.target/powerpc/pr81959.c: New test.

From-SVN: r255341

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr81959.c [new file with mode: 0644]

index b4a0986f25cf1fc15f5e9f80f9946c3e7270e8d1..805782f9c7c7c1f63f6db1d74f6556d878eb432d 100644 (file)
@@ -1,3 +1,12 @@
+2017-12-01  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       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_<mode>si2_hw): Make sure the
+       memory address is indexed or indirect.
+       (floatuns_<mode>si2_hw2): Likewise.
+
 2017-12-01  Jason Merrill  <jason@redhat.com>
 
        * Makefile.in (TAGS): Add c-family/*.cc.
index 551d9c4df79710c33dddf99af8a5f750d97ce8fe..5f5f6d51ef85519257bd74bfd7831cc1b07bdaa2 100644 (file)
@@ -37886,7 +37886,8 @@ rs6000_address_for_fpconvert (rtx x)
 
   gcc_assert (MEM_P (x));
   addr = XEXP (x, 0);
-  if (! legitimate_indirect_address_p (addr, reload_completed)
+  if (can_create_pseudo_p ()
+      && ! legitimate_indirect_address_p (addr, reload_completed)
       && ! legitimate_indexed_address_p (addr, reload_completed))
     {
       if (GET_CODE (addr) == PRE_INC || GET_CODE (addr) == PRE_DEC)
index 12d5564d26376d7c25c49cb779ac8cac996775c1..f8c91c72704a07da180c34585929732b5561ae5d 100644 (file)
 {
   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 "float<QHI:mode><IEEE128:mode>2"
 {
   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 "floatuns<QHI:mode><IEEE128:mode>2"
index c86275d2551958c1f821c19a9bf5b34398a5f32f..dadd4c95da1e1d1aaa8cd510ed59f1eaa6654192 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-01  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR target/81959
+       * gcc.target/powerpc/pr81959.c: New test.
+
 2017-12-01  Wilco Dijkstra  <wdijkstr@arm.com>
 
        * gcc.dg/asm-4.c: Skip on AArch64 with ILP32 as test is incorrect.
diff --git a/gcc/testsuite/gcc.target/powerpc/pr81959.c b/gcc/testsuite/gcc.target/powerpc/pr81959.c
new file mode 100644 (file)
index 0000000..c4cc373
--- /dev/null
@@ -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}         } } */