]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
S/390: Fix problem with vec_init expander
authorAndreas Krebbel <krebbel@linux.ibm.com>
Fri, 19 Oct 2018 08:55:27 +0000 (08:55 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Fri, 19 Oct 2018 08:55:27 +0000 (08:55 +0000)
gcc/ChangeLog:

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

Backport from mainline
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-19  Andreas Krebbel  <krebbel@linux.ibm.com>

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

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

From-SVN: r265309

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

index 242c8278a66faddaa092412aa43c4c50c55da781..941159efb598e96664e0879082ce2db7a3cd0fd0 100644 (file)
@@ -1,3 +1,11 @@
+2018-10-19  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       Backport from mainline
+       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-17  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR middle-end/87623
index 603f5d6486efbd7a13ba6e2841459228eaac4971..f6b7dfc2bbe07b00ec359c98665a892048c335cd 100644 (file)
@@ -6596,11 +6596,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 98bcaaaca26e4305e206297866bdf444d837451e..ba29eafdc1b986ed80dfed481126f144b06bd301 100644 (file)
@@ -1,3 +1,10 @@
+2018-10-19  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       Backport from mainline
+       2018-10-15  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       * g++.dg/vec-init-1.C: New test.
+
 2018-10-17  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc.c-torture/execute/pr87623.c: New test.
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;