re PR target/31334 (Bad codegen for vector initializer with constants prop'd into...
authorAndrew Pinski <andrew_pinski@playstation.sony.com>
Fri, 28 Mar 2008 07:27:11 +0000 (07:27 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Fri, 28 Mar 2008 07:27:11 +0000 (00:27 -0700)
2008-03-28  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR target/31334
        * config/rs6000/rs6000.c (rs6000_expand_vector_init): Create a
        const_vector when all the vectors are constant.

2008-03-28  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR target/31334
        * gcc.target/powerpc/altivec-25.c: Nnew testcase.

From-SVN: r133674

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/altivec-25.c [new file with mode: 0644]

index f55e8a8519ab51192919750a3f711a8f0d57788d..a5cebe93f9491cd3c5eca01499706b9151a8ba75 100644 (file)
@@ -1,3 +1,9 @@
+2008-03-28  Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR target/31334
+       * config/rs6000/rs6000.c (rs6000_expand_vector_init): Create a
+       const_vector when all the vectors are constant.
+
 2008-03-27  Bob Wilson  <bob.wilson@acm.org>
 
        * config/xtensa/xtensa.c (gen_float_relational): Handle unordered
index 593408f56d538cad0461cc0862a43ccc75425ce6..a79970939876f373b831af4effcead099a934b3b 100644 (file)
@@ -2965,6 +2965,7 @@ rs6000_expand_vector_init (rtx target, rtx vals)
 
   if (n_var == 0)
     {
+      rtx const_vec = gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0));
       if (mode != V4SFmode && all_const_zero)
        {
          /* Zero register.  */
@@ -2972,10 +2973,10 @@ rs6000_expand_vector_init (rtx target, rtx vals)
                                  gen_rtx_XOR (mode, target, target)));
          return;
        }
-      else if (mode != V4SFmode && easy_vector_constant (vals, mode))
+      else if (mode != V4SFmode && easy_vector_constant (const_vec, mode))
        {
          /* Splat immediate.  */
-         emit_insn (gen_rtx_SET (VOIDmode, target, vals));
+         emit_insn (gen_rtx_SET (VOIDmode, target, const_vec));
          return;
        }
       else if (all_same)
@@ -2983,7 +2984,7 @@ rs6000_expand_vector_init (rtx target, rtx vals)
       else
        {
          /* Load from constant pool.  */
-         emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
+         emit_move_insn (target, const_vec);
          return;
        }
     }
index 7b6cda1bbbbde4cc3d1cbc734726082f87f6394a..13e59e7413c3cf7a33fb29052a4f58c1ebe3cb37 100644 (file)
@@ -1,3 +1,8 @@
+2008-03-28  Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR target/31334
+       * gcc.target/powerpc/altivec-25.c: Nnew testcase.
+
 2008-03-27  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR fortran/35724
diff --git a/gcc/testsuite/gcc.target/powerpc/altivec-25.c b/gcc/testsuite/gcc.target/powerpc/altivec-25.c
new file mode 100644 (file)
index 0000000..a3bd0fd
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-require-effective-target powerpc_altivec_ok } */
+/* { dg-options "-maltivec -O2 -Wall" } */
+
+
+#define vector __attribute__((__vector_size__(16) ))
+vector int f()
+{
+  int t = 4;
+  return (vector int){t,t,t,t};
+}
+vector int f1()
+{
+  return (vector int){4,4,4,4};
+}
+
+/* We should be able to materialize the constant vector without
+   any lvewx instructions as it is constant. */
+/* { dg-final { scan-assembler-not "lvewx" } } */
+