S/390: Fix problem with vec_init expander
authorAndreas Krebbel <krebbel@linux.ibm.com>
Mon, 15 Oct 2018 08:07:13 +0000 (08:07 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Mon, 15 Oct 2018 08:07:13 +0000 (08:07 +0000)
gcc/ChangeLog:

2018-10-15  Andreas Krebbel  <krebbel@linux.ibm.com>

* config/s390/s390.c (s390_expand_vec_init): Force vector element
into reg if it isn't a general operand.

gcc/testsuite/ChangeLog:

2018-10-15  Andreas Krebbel  <krebbel@linux.ibm.com>

* g++.dg/vec-init-1.C: New test.

From-SVN: r265158

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/vec-init-1.C [new file with mode: 0644]

index 8144181a567601ba96170450fd92a7545b3a28bd..4f33576c1252dc777030b7f0683a2b7e4fe20ddf 100644 (file)
@@ -1,3 +1,8 @@
+2018-10-15  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       * config/s390/s390.c (s390_expand_vec_init): Force vector element
+       into reg if it isn't a general operand.
+
 2018-10-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/87599
index 71039fe6ce96dbb0e991029bfd9af1d727830989..ab22c2c8be55953a07d92f5c2cb397b6da77e9c1 100644 (file)
@@ -6627,11 +6627,16 @@ s390_expand_vec_init (rtx target, rtx vals)
       return;
     }
 
+  /* Use vector replicate instructions.  vlrep/vrepi/vrep  */
   if (all_same)
     {
-      emit_insn (gen_rtx_SET (target,
-                             gen_rtx_VEC_DUPLICATE (mode,
-                                                    XVECEXP (vals, 0, 0))));
+      rtx elem = XVECEXP (vals, 0, 0);
+
+      /* vec_splats accepts general_operand as source.  */
+      if (!general_operand (elem, GET_MODE (elem)))
+       elem = force_reg (inner_mode, elem);
+
+      emit_insn (gen_rtx_SET (target, gen_rtx_VEC_DUPLICATE (mode, elem)));
       return;
     }
 
index 8824474e85d16b2f2ef0975fcec95dc5a2095cdb..f12a7437d1ddc0f0b1dda048250d0c01169b1955 100644 (file)
@@ -1,3 +1,7 @@
+2018-10-15  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       * g++.dg/vec-init-1.C: New test.
+
 2018-10-14  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/87599
diff --git a/gcc/testsuite/g++.dg/vec-init-1.C b/gcc/testsuite/g++.dg/vec-init-1.C
new file mode 100644 (file)
index 0000000..f35d39c
--- /dev/null
@@ -0,0 +1,26 @@
+/* On S/390 this ends up calling the vec_init RTL expander with a
+   parallel of two symbol_refs.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O3 -fPIC" } */
+
+
+struct test
+{
+    struct base
+    {
+       int key;
+    };
+    struct derived : public base
+    {
+       int key;
+    };
+
+    derived core;
+    derived &dRef;
+    base &bRef;
+
+    test() : dRef (core), bRef (core) {}
+};
+
+test test;