This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH rs6000] Fix PR79951, ICE for unrecognizable insn with -mno-cmpb
- From: Pat Haugen <pthaugen at linux dot vnet dot ibm dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Segher Boessenkool <segher at gcc dot gnu dot org>, David Edelsohn <dje dot gcc at gmail dot com>
- Date: Wed, 15 Mar 2017 18:09:57 -0500
- Subject: [PATCH rs6000] Fix PR79951, ICE for unrecognizable insn with -mno-cmpb
- Authentication-results: sourceware.org; auth=none
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 <pthaugen@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 <pthaugen@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);
+}
+