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); +} +