Hi!

As mentioned in the PR, for the following testcase we emit a power9
instruction even with -mcpu=power8.  Similar movsf_hardfloat instruction
uses wb constraint for the stxssp insn source rather than wu, which it
only uses for stxsspx (power7?).

Bootstrapped/regtested on powerpc64{,le}-linux, ok for trunk?

2017-02-03  Jakub Jelinek  <ja...@redhat.com>

        PR target/79354
        * config/rs6000/rs6000.md (movsi_from_sf): Use wb constraint instead of
        wu for stxssp alternative.

        * gcc.target/powerpc/pr79354.c: New test.
        * gcc.c-torture/execute/pr79354.c: New test.

--- gcc/config/rs6000/rs6000.md.jj      2017-02-02 11:04:27.000000000 +0100
+++ gcc/config/rs6000/rs6000.md 2017-02-03 02:29:42.754962983 +0100
@@ -6814,7 +6814,7 @@ (define_insn_and_split "movsi_from_sf"
 
        (unspec:SI [(match_operand:SF 1 "input_operand"
                "r,          m,           Z,           Z,        r,
-                f,          wu,          wu,          wIwH,     r,
+                f,          wb,          wu,          wIwH,     r,
                 wK")]
                    UNSPEC_SI_FROM_SF))
 
--- gcc/testsuite/gcc.target/powerpc/pr79354.c.jj       2017-02-03 
02:37:44.147938375 +0100
+++ gcc/testsuite/gcc.target/powerpc/pr79354.c  2017-02-03 02:38:34.838303987 
+0100
@@ -0,0 +1,23 @@
+/* PR target/79354 */
+/* { dg-do compile { target { powerpc64*-*-* && lp64 } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { 
"-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p8vector_ok } */
+/* { dg-options "-mcpu=power8 -O2" } */
+/* { dg-final { scan-assembler-not "stxssp\[^x]" } } */
+
+
+int b, f, g;
+float e;
+unsigned long d;
+
+void
+foo (int *a)
+{
+  for (g = 0; g < 32; g++)
+    if (f)
+      {
+        e = d;
+        __builtin_memcpy (&b, &e, sizeof (float));
+        b = *a;
+      }
+}
--- gcc/testsuite/gcc.c-torture/execute/pr79354.c.jj    2017-02-03 
02:36:36.746781897 +0100
+++ gcc/testsuite/gcc.c-torture/execute/pr79354.c       2017-02-03 
02:36:07.000000000 +0100
@@ -0,0 +1,30 @@
+/* PR target/79354 */
+
+int b, f, g;
+float e;
+unsigned long d;
+
+__attribute__((noinline, noclone)) void
+foo (int *a)
+{
+  for (g = 0; g < 32; g++)
+    if (f)
+      {
+        e = d;
+        __builtin_memcpy (&b, &e, sizeof (float));
+        b = *a;
+      }
+}
+
+int
+main ()
+{
+  int h = 5;
+  f = 1;
+  asm volatile ("" : : : "memory");
+  foo (&h);
+  asm volatile ("" : : : "memory");
+  foo (&b);
+  asm volatile ("" : : : "memory");
+  return 0;
+}

        Jakub

Reply via email to