The define_expand for copysign<mode>3 will call
gen_copysign<mode>3_fcpsgn if either TARGET_CMPB || VECTOR_UNIT_VSX_P
(<MODE>mode) are true, but gen_copysign<mode>3_fcpsgn is missing the
check of VECTOR_UNIT_VSX_P (<MODE>mode) which results in an
unrecognizable insn ICE. This is fixed with the following patch.

Bootstrap/regtest on powerpc64le with no new regressions. Ok for trunk?
Ok for backport to GCC 5/6 branches after testing?

-Pat


2017-03-15  Pat Haugen  <pthau...@us.ibm.com>

        PR target/79951
        * config/rs6000/rs6000.md (copysign<mode>3_fcpsgn): Test
        for VECTOR_UNIT_VSX_P (<MODE>mode) too.

testsuite/ChangeLog:
2017-03-15  Pat Haugen  <pthau...@us.ibm.com>

        * gcc.target/powerpc/pr79951.c: New.



Index: config/rs6000/rs6000.md
===================================================================
--- config/rs6000/rs6000.md     (revision 246180)
+++ config/rs6000/rs6000.md     (working copy)
@@ -4831,7 +4831,7 @@ (define_insn "copysign<mode>3_fcpsgn"
        (unspec:SFDF [(match_operand:SFDF 1 "gpc_reg_operand" "<Ff>,<Fv>")
                      (match_operand:SFDF 2 "gpc_reg_operand" "<Ff>,<Fv>")]
                     UNSPEC_COPYSIGN))]
-  "TARGET_<MODE>_FPR && TARGET_CMPB"
+  "TARGET_<MODE>_FPR && (TARGET_CMPB || VECTOR_UNIT_VSX_P (<MODE>mode))"
   "@
    fcpsgn %0,%2,%1
    xscpsgndp %x0,%x2,%x1"
Index: testsuite/gcc.target/powerpc/pr79951.c
===================================================================
--- testsuite/gcc.target/powerpc/pr79951.c      (nonexistent)
+++ testsuite/gcc.target/powerpc/pr79951.c      (working copy)
@@ -0,0 +1,10 @@
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-require-effective-target powerpc_p8vector_ok } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" }
{ "-mcpu=power8" } } */
+/* { dg-options "-mcpu=power8 -S -mno-cmpb" } */
+
+float testf (float x, float y)
+{
+  return __builtin_copysignf (x, y);
+}
+

Reply via email to