S/390: z13 fix mode in vcond expansion
authorAndreas Krebbel <krebbel@linux.vnet.ibm.com>
Fri, 19 Feb 2016 10:34:12 +0000 (10:34 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Fri, 19 Feb 2016 10:34:12 +0000 (10:34 +0000)
For floating point vector compares the target mode is an integer mode
which accidently was used as register mode when forcing the compare
operands into regs.

gcc/ChangeLog:

* config/s390/s390.c (s390_expand_vcond): Use the compare operand
mode.

gcc/testsuite/ChangeLog:

* gcc.target/s390/vector/vec-vcond-1.c: New test.

From-SVN: r233552

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/vector/vec-vcond-1.c [new file with mode: 0644]

index d6c0aa9..1378f5b 100644 (file)
@@ -1,5 +1,10 @@
 2016-02-19  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
+       * config/s390/s390.c (s390_expand_vcond): Use the compare operand
+       mode.
+
+2016-02-19  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
+
        * config/s390/s390-protos.h: Add s390_expand_vec_movstr prototype.
        * config/s390/s390.c (s390_expand_vec_movstr): New function.
        * config/s390/s390.md ("movstr<P:mode>"): Call
index da05a04..cd53b15 100644 (file)
@@ -6329,10 +6329,10 @@ s390_expand_vcond (rtx target, rtx then, rtx els,
      can be handled by the optimization above but not by the
      following code.  Hence, force them into registers here.  */
   if (!REG_P (cmp_op1))
-    cmp_op1 = force_reg (target_mode, cmp_op1);
+    cmp_op1 = force_reg (GET_MODE (cmp_op1), cmp_op1);
 
   if (!REG_P (cmp_op2))
-    cmp_op2 = force_reg (target_mode, cmp_op2);
+    cmp_op2 = force_reg (GET_MODE (cmp_op2), cmp_op2);
 
   s390_expand_vec_compare (result_target, cond,
                           cmp_op1, cmp_op2);
index 2c1567a..abb2ed6 100644 (file)
@@ -1,5 +1,9 @@
 2016-02-19  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
+       * gcc.target/s390/vector/vec-vcond-1.c: New test.
+
+2016-02-19  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
+
        * gcc.target/s390/md/movstr-1.c: Allow also the z13 strings
        instruction pattern name to prevent the testcase from failing with
        -march=z13.
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-vcond-1.c b/gcc/testsuite/gcc.target/s390/vector/vec-vcond-1.c
new file mode 100644 (file)
index 0000000..ec65c6f
--- /dev/null
@@ -0,0 +1,23 @@
+/* A const vector operand is forced into a register in
+   s390_expand_vcond.
+   This testcase once failed because the target mode (v2di) was picked
+   for the reg instead of the mode of the other comparison
+   operand.  */
+
+/* { dg-do compile { target { s390*-*-* } } } */
+/* { dg-options "-O3 -mzarch -march=z13" } */
+
+typedef __attribute__((vector_size(16))) long   v2di;
+typedef __attribute__((vector_size(16))) double v2df;
+
+v2di
+foo (v2df a)
+{
+  return a == (v2df){ 0.0, 0.0 };
+}
+
+v2di
+bar (v2df a)
+{
+  return (v2df){ 1.0, 1.0 } == (v2df){ 0.0, 0.0 };
+}