re PR target/80099 (ICE in rs6000_expand_vector_extract, at config/rs6000/rs6000...
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Tue, 18 Apr 2017 16:41:06 +0000 (16:41 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Tue, 18 Apr 2017 16:41:06 +0000 (16:41 +0000)
[gcc]
2017-04-18  Michael Meissner  <meissner@linux.vnet.ibm.com>

PR target/80099
* config/rs6000/rs6000.c (rs6000_expand_vector_extract): Eliminate
unneeded test for TARGET_UPPER_REGS_SF.
* config/rs6000/vsx.md (vsx_extract_v4sf_var): Likewise.

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

PR target/80099
* gcc.target/powerpc/pr80099-1.c: New test.
* gcc.target/powerpc/pr80099-2.c: Likewise.
* gcc.target/powerpc/pr80099-3.c: Likewise.
* gcc.target/powerpc/pr80099-4.c: Likewise.
* gcc.target/powerpc/pr80099-5.c: Likewise.

From-SVN: r246972

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/vsx.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr80099-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr80099-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr80099-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr80099-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/powerpc/pr80099-5.c [new file with mode: 0644]

index 07b3384..fa3e257 100644 (file)
@@ -1,3 +1,10 @@
+2017-04-18  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR target/80099
+       * config/rs6000/rs6000.c (rs6000_expand_vector_extract): Eliminate
+       unneeded test for TARGET_UPPER_REGS_SF.
+       * config/rs6000/vsx.md (vsx_extract_v4sf_var): Likewise.
+
 2017-04-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/80444
index 0fd2365..8f68d84 100644 (file)
@@ -7600,12 +7600,8 @@ rs6000_expand_vector_extract (rtx target, rtx vec, rtx elt)
          return;
 
        case V4SFmode:
-         if (TARGET_UPPER_REGS_SF)
-           {
-             emit_insn (gen_vsx_extract_v4sf_var (target, vec, elt));
-             return;
-           }
-         break;
+         emit_insn (gen_vsx_extract_v4sf_var (target, vec, elt));
+         return;
 
        case V4SImode:
          emit_insn (gen_vsx_extract_v4si_var (target, vec, elt));
index bfc1527..28fc5b5 100644 (file)
                   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 4d1cd15..000f471 100644 (file)
@@ -1,3 +1,12 @@
+2017-04-18  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       PR target/80099
+       * gcc.target/powerpc/pr80099-1.c: New test.
+       * gcc.target/powerpc/pr80099-2.c: Likewise.
+       * gcc.target/powerpc/pr80099-3.c: Likewise.
+       * gcc.target/powerpc/pr80099-4.c: Likewise.
+       * gcc.target/powerpc/pr80099-5.c: Likewise.
+
 2017-04-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/80444
diff --git a/gcc/testsuite/gcc.target/powerpc/pr80099-1.c b/gcc/testsuite/gcc.target/powerpc/pr80099-1.c
new file mode 100644 (file)
index 0000000..9f34c5f
--- /dev/null
@@ -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-sf" } */
+
+/* PR target/80099: compiler internal error if -mno-upper-regs-sf used.  */
+
+int a;
+int int_from_mem (vector float *c)
+{
+  return __builtin_vec_extract (*c, a);
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/pr80099-2.c b/gcc/testsuite/gcc.target/powerpc/pr80099-2.c
new file mode 100644 (file)
index 0000000..5800db6
--- /dev/null
@@ -0,0 +1,128 @@
+/* { 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-sf" } */
+
+/* PR target/80099 was an issue with -mno-upper-regs-sf.  Test for all variable
+   extract types with various -mno-upper-regs-* options.  */
+
+double
+d_extract_arg_n (vector double v, unsigned long n)
+{
+  return __builtin_vec_extract (v, n);
+}
+
+float
+f_extract_arg_n (vector float v, unsigned long n)
+{
+  return __builtin_vec_extract (v, n);
+}
+
+long
+sl_extract_arg_n (vector long v, unsigned long n)
+{
+  return (long) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+ul_extract_arg_n (vector unsigned long v, unsigned long n)
+{
+  return (unsigned long) __builtin_vec_extract (v, n);
+}
+
+long
+si_extract_arg_n (vector int v, unsigned long n)
+{
+  return (int) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+ui_extract_arg_n (vector unsigned int v, unsigned long n)
+{
+  return (unsigned int) __builtin_vec_extract (v, n);
+}
+
+long
+ss_extract_arg_n (vector short v, unsigned long n)
+{
+  return (short) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+us_extract_arg_n (vector unsigned short v, unsigned long n)
+{
+  return (unsigned short) __builtin_vec_extract (v, n);
+}
+
+long
+sc_extract_arg_n (vector signed char v, unsigned long n)
+{
+  return (signed char) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+uc_extract_arg_n (vector unsigned char v, unsigned long n)
+{
+  return (unsigned char) __builtin_vec_extract (v, n);
+}
+
+\f
+double
+d_extract_mem_n (vector double *p, unsigned long n)
+{
+  return __builtin_vec_extract (*p, n);
+}
+
+float
+f_extract_mem_n (vector float *p, unsigned long n)
+{
+  return __builtin_vec_extract (*p, n);
+}
+
+long
+sl_extract_mem_n (vector long *p, unsigned long n)
+{
+  return (long) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+ul_extract_mem_n (vector unsigned long *p, unsigned long n)
+{
+  return (unsigned long) __builtin_vec_extract (*p, n);
+}
+
+long
+si_extract_mem_n (vector int *p, unsigned long n)
+{
+  return (int) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+ui_extract_mem_n (vector unsigned int *p, unsigned long n)
+{
+  return (unsigned int) __builtin_vec_extract (*p, n);
+}
+
+long
+ss_extract_mem_n (vector short *p, unsigned long n)
+{
+  return (short) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+us_extract_mem_n (vector unsigned short *p, unsigned long n)
+{
+  return (unsigned short) __builtin_vec_extract (*p, n);
+}
+
+long
+sc_extract_mem_n (vector signed char *p, unsigned long n)
+{
+  return (signed char) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+uc_extract_mem_n (vector unsigned char *p, unsigned long n)
+{
+  return (unsigned char) __builtin_vec_extract (*p, n);
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/pr80099-3.c b/gcc/testsuite/gcc.target/powerpc/pr80099-3.c
new file mode 100644 (file)
index 0000000..71c2b40
--- /dev/null
@@ -0,0 +1,128 @@
+/* { 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-df" } */
+
+/* PR target/80099 was an issue with -mno-upper-regs-sf.  Test for all variable
+   extract types with various -mno-upper-regs-* options.  */
+
+double
+d_extract_arg_n (vector double v, unsigned long n)
+{
+  return __builtin_vec_extract (v, n);
+}
+
+float
+f_extract_arg_n (vector float v, unsigned long n)
+{
+  return __builtin_vec_extract (v, n);
+}
+
+long
+sl_extract_arg_n (vector long v, unsigned long n)
+{
+  return (long) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+ul_extract_arg_n (vector unsigned long v, unsigned long n)
+{
+  return (unsigned long) __builtin_vec_extract (v, n);
+}
+
+long
+si_extract_arg_n (vector int v, unsigned long n)
+{
+  return (int) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+ui_extract_arg_n (vector unsigned int v, unsigned long n)
+{
+  return (unsigned int) __builtin_vec_extract (v, n);
+}
+
+long
+ss_extract_arg_n (vector short v, unsigned long n)
+{
+  return (short) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+us_extract_arg_n (vector unsigned short v, unsigned long n)
+{
+  return (unsigned short) __builtin_vec_extract (v, n);
+}
+
+long
+sc_extract_arg_n (vector signed char v, unsigned long n)
+{
+  return (signed char) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+uc_extract_arg_n (vector unsigned char v, unsigned long n)
+{
+  return (unsigned char) __builtin_vec_extract (v, n);
+}
+
+\f
+double
+d_extract_mem_n (vector double *p, unsigned long n)
+{
+  return __builtin_vec_extract (*p, n);
+}
+
+float
+f_extract_mem_n (vector float *p, unsigned long n)
+{
+  return __builtin_vec_extract (*p, n);
+}
+
+long
+sl_extract_mem_n (vector long *p, unsigned long n)
+{
+  return (long) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+ul_extract_mem_n (vector unsigned long *p, unsigned long n)
+{
+  return (unsigned long) __builtin_vec_extract (*p, n);
+}
+
+long
+si_extract_mem_n (vector int *p, unsigned long n)
+{
+  return (int) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+ui_extract_mem_n (vector unsigned int *p, unsigned long n)
+{
+  return (unsigned int) __builtin_vec_extract (*p, n);
+}
+
+long
+ss_extract_mem_n (vector short *p, unsigned long n)
+{
+  return (short) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+us_extract_mem_n (vector unsigned short *p, unsigned long n)
+{
+  return (unsigned short) __builtin_vec_extract (*p, n);
+}
+
+long
+sc_extract_mem_n (vector signed char *p, unsigned long n)
+{
+  return (signed char) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+uc_extract_mem_n (vector unsigned char *p, unsigned long n)
+{
+  return (unsigned char) __builtin_vec_extract (*p, n);
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/pr80099-4.c b/gcc/testsuite/gcc.target/powerpc/pr80099-4.c
new file mode 100644 (file)
index 0000000..145dd17
--- /dev/null
@@ -0,0 +1,128 @@
+/* { 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 was an issue with -mno-upper-regs-sf.  Test for all variable
+   extract types with various -mno-upper-regs-* options.  */
+
+double
+d_extract_arg_n (vector double v, unsigned long n)
+{
+  return __builtin_vec_extract (v, n);
+}
+
+float
+f_extract_arg_n (vector float v, unsigned long n)
+{
+  return __builtin_vec_extract (v, n);
+}
+
+long
+sl_extract_arg_n (vector long v, unsigned long n)
+{
+  return (long) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+ul_extract_arg_n (vector unsigned long v, unsigned long n)
+{
+  return (unsigned long) __builtin_vec_extract (v, n);
+}
+
+long
+si_extract_arg_n (vector int v, unsigned long n)
+{
+  return (int) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+ui_extract_arg_n (vector unsigned int v, unsigned long n)
+{
+  return (unsigned int) __builtin_vec_extract (v, n);
+}
+
+long
+ss_extract_arg_n (vector short v, unsigned long n)
+{
+  return (short) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+us_extract_arg_n (vector unsigned short v, unsigned long n)
+{
+  return (unsigned short) __builtin_vec_extract (v, n);
+}
+
+long
+sc_extract_arg_n (vector signed char v, unsigned long n)
+{
+  return (signed char) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+uc_extract_arg_n (vector unsigned char v, unsigned long n)
+{
+  return (unsigned char) __builtin_vec_extract (v, n);
+}
+
+\f
+double
+d_extract_mem_n (vector double *p, unsigned long n)
+{
+  return __builtin_vec_extract (*p, n);
+}
+
+float
+f_extract_mem_n (vector float *p, unsigned long n)
+{
+  return __builtin_vec_extract (*p, n);
+}
+
+long
+sl_extract_mem_n (vector long *p, unsigned long n)
+{
+  return (long) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+ul_extract_mem_n (vector unsigned long *p, unsigned long n)
+{
+  return (unsigned long) __builtin_vec_extract (*p, n);
+}
+
+long
+si_extract_mem_n (vector int *p, unsigned long n)
+{
+  return (int) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+ui_extract_mem_n (vector unsigned int *p, unsigned long n)
+{
+  return (unsigned int) __builtin_vec_extract (*p, n);
+}
+
+long
+ss_extract_mem_n (vector short *p, unsigned long n)
+{
+  return (short) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+us_extract_mem_n (vector unsigned short *p, unsigned long n)
+{
+  return (unsigned short) __builtin_vec_extract (*p, n);
+}
+
+long
+sc_extract_mem_n (vector signed char *p, unsigned long n)
+{
+  return (signed char) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+uc_extract_mem_n (vector unsigned char *p, unsigned long n)
+{
+  return (unsigned char) __builtin_vec_extract (*p, n);
+}
diff --git a/gcc/testsuite/gcc.target/powerpc/pr80099-5.c b/gcc/testsuite/gcc.target/powerpc/pr80099-5.c
new file mode 100644 (file)
index 0000000..9ebc0fe
--- /dev/null
@@ -0,0 +1,128 @@
+/* { 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" } */
+
+/* PR target/80099 was an issue with -mno-upper-regs-sf.  Test for all variable
+   extract types with various -mno-upper-regs-* options.  */
+
+double
+d_extract_arg_n (vector double v, unsigned long n)
+{
+  return __builtin_vec_extract (v, n);
+}
+
+float
+f_extract_arg_n (vector float v, unsigned long n)
+{
+  return __builtin_vec_extract (v, n);
+}
+
+long
+sl_extract_arg_n (vector long v, unsigned long n)
+{
+  return (long) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+ul_extract_arg_n (vector unsigned long v, unsigned long n)
+{
+  return (unsigned long) __builtin_vec_extract (v, n);
+}
+
+long
+si_extract_arg_n (vector int v, unsigned long n)
+{
+  return (int) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+ui_extract_arg_n (vector unsigned int v, unsigned long n)
+{
+  return (unsigned int) __builtin_vec_extract (v, n);
+}
+
+long
+ss_extract_arg_n (vector short v, unsigned long n)
+{
+  return (short) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+us_extract_arg_n (vector unsigned short v, unsigned long n)
+{
+  return (unsigned short) __builtin_vec_extract (v, n);
+}
+
+long
+sc_extract_arg_n (vector signed char v, unsigned long n)
+{
+  return (signed char) __builtin_vec_extract (v, n);
+}
+
+unsigned long
+uc_extract_arg_n (vector unsigned char v, unsigned long n)
+{
+  return (unsigned char) __builtin_vec_extract (v, n);
+}
+
+\f
+double
+d_extract_mem_n (vector double *p, unsigned long n)
+{
+  return __builtin_vec_extract (*p, n);
+}
+
+float
+f_extract_mem_n (vector float *p, unsigned long n)
+{
+  return __builtin_vec_extract (*p, n);
+}
+
+long
+sl_extract_mem_n (vector long *p, unsigned long n)
+{
+  return (long) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+ul_extract_mem_n (vector unsigned long *p, unsigned long n)
+{
+  return (unsigned long) __builtin_vec_extract (*p, n);
+}
+
+long
+si_extract_mem_n (vector int *p, unsigned long n)
+{
+  return (int) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+ui_extract_mem_n (vector unsigned int *p, unsigned long n)
+{
+  return (unsigned int) __builtin_vec_extract (*p, n);
+}
+
+long
+ss_extract_mem_n (vector short *p, unsigned long n)
+{
+  return (short) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+us_extract_mem_n (vector unsigned short *p, unsigned long n)
+{
+  return (unsigned short) __builtin_vec_extract (*p, n);
+}
+
+long
+sc_extract_mem_n (vector signed char *p, unsigned long n)
+{
+  return (signed char) __builtin_vec_extract (*p, n);
+}
+
+unsigned long
+uc_extract_mem_n (vector unsigned char *p, unsigned long n)
+{
+  return (unsigned char) __builtin_vec_extract (*p, n);
+}