public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH], Fix PR/target 80099 (internal error with -mno-upper-regs-sf)
@ 2017-04-12 22:45 Michael Meissner
  2017-04-14  8:48 ` Segher Boessenkool
  0 siblings, 1 reply; 6+ messages in thread
From: Michael Meissner @ 2017-04-12 22:45 UTC (permalink / raw)
  To: gcc-patches, Segher Boessenkool, David Edelsohn, Bill Schmidt

[-- Attachment #1: Type: text/plain, Size: 1244 bytes --]

The problem is rs6000_expand_vector_extract did not check for SFmode being
allowed in the Altivec (upper) registers, but the insn implementing the
variable extract had it as a condition.

In looking at the variable extract code, it currently does not require SFmode
to go in the Altivec registers, but it does require DImode to go into the
Altivec registers (vec_extract of V2DFmode will require DFmode to go in Altivec
registers instead of DImode).

I have tested this patch on a little endian power8 system and there were no
regressions with either bootstrap or make check.

[gcc]
2017-04-12  Michael Meissner  <meissner@linux.vnet.ibm.com>

	PR target/80099
	* config/rs6000/rs6000.c (rs6000_expand_vector_extract): Make sure
	that DFmode or DImode as appropriate can go in Altivec registers
	before generating the faster sequences for variable vec_extracts.
	* config/rs6000/vsx.md (vsx_extract_v4sf): Remove unneeded
	TARGET_UPPER_REGS_SF condition.

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

	PR target/80099
	* gcc.target/powerpc/pr80099.c: New test.

-- 
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meissner@linux.vnet.ibm.com, phone: +1 (978) 899-4797

[-- Attachment #2: pr80099.patch01b --]
[-- Type: text/plain, Size: 3000 bytes --]

Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 246852)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -7586,15 +7586,23 @@ rs6000_expand_vector_extract (rtx target
       switch (mode)
 	{
 	case V2DFmode:
-	  emit_insn (gen_vsx_extract_v2df_var (target, vec, elt));
-	  return;
+	  if (TARGET_UPPER_REGS_DF)
+	    {
+	      emit_insn (gen_vsx_extract_v2df_var (target, vec, elt));
+	      return;
+	    }
+	  break;
 
 	case V2DImode:
-	  emit_insn (gen_vsx_extract_v2di_var (target, vec, elt));
-	  return;
+	  if (TARGET_UPPER_REGS_DI)
+	    {
+	      emit_insn (gen_vsx_extract_v2di_var (target, vec, elt));
+	      return;
+	    }
+	  break;
 
 	case V4SFmode:
-	  if (TARGET_UPPER_REGS_SF)
+	  if (TARGET_UPPER_REGS_DI)
 	    {
 	      emit_insn (gen_vsx_extract_v4sf_var (target, vec, elt));
 	      return;
@@ -7602,16 +7610,28 @@ rs6000_expand_vector_extract (rtx target
 	  break;
 
 	case V4SImode:
-	  emit_insn (gen_vsx_extract_v4si_var (target, vec, elt));
-	  return;
+	  if (TARGET_UPPER_REGS_DI)
+	    {
+	      emit_insn (gen_vsx_extract_v4si_var (target, vec, elt));
+	      return;
+	    }
+	  break;
 
 	case V8HImode:
-	  emit_insn (gen_vsx_extract_v8hi_var (target, vec, elt));
-	  return;
+	  if (TARGET_UPPER_REGS_DI)
+	    {
+	      emit_insn (gen_vsx_extract_v8hi_var (target, vec, elt));
+	      return;
+	    }
+	  break;
 
 	case V16QImode:
-	  emit_insn (gen_vsx_extract_v16qi_var (target, vec, elt));
-	  return;
+	  if (TARGET_UPPER_REGS_DI)
+	    {
+	      emit_insn (gen_vsx_extract_v16qi_var (target, vec, elt));
+	      return;
+	    }
+	  break;
 
 	default:
 	  gcc_unreachable ();
Index: gcc/config/rs6000/vsx.md
===================================================================
--- gcc/config/rs6000/vsx.md	(revision 246852)
+++ gcc/config/rs6000/vsx.md	(working copy)
@@ -2419,8 +2419,7 @@ (define_insn_and_split "vsx_extract_v4sf
 		   UNSPEC_VSX_EXTRACT))
    (clobber (match_scratch:DI 3 "=r,&b,&b"))
    (clobber (match_scratch:V2DI 4 "=&v,X,X"))]
-  "VECTOR_MEM_VSX_P (V4SFmode) && TARGET_DIRECT_MOVE_64BIT
-   && TARGET_UPPER_REGS_SF"
+  "VECTOR_MEM_VSX_P (V4SFmode) && TARGET_DIRECT_MOVE_64BIT"
   "#"
   "&& reload_completed"
   [(const_int 0)]
Index: gcc/testsuite/gcc.target/powerpc/pr80099.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/pr80099.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/pr80099.c	(working copy)
@@ -0,0 +1,12 @@
+/* { dg-do compile { target { powerpc*-*-* && lp64 } } } */
+/* { dg-require-effective-target powerpc_p8vector_ok } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-options "-mcpu=power8 -O2 -mno-upper-regs-di" } */
+
+/* PR target/80099: compiler internal error if -mno-upper-regs-di used.  */
+
+int a;
+int int_from_mem (vector float *c)
+{
+  return __builtin_vec_extract (*c, a);
+}

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-04-18 10:11 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-12 22:45 [PATCH], Fix PR/target 80099 (internal error with -mno-upper-regs-sf) Michael Meissner
2017-04-14  8:48 ` Segher Boessenkool
2017-04-14 22:07   ` Michael Meissner
2017-04-14 22:56     ` Segher Boessenkool
2017-04-15  6:10       ` Michael Meissner
2017-04-18 10:38         ` Segher Boessenkool

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).