aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <andrew_pinski@playstation.sony.com>2008-03-28 07:27:11 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2008-03-28 00:27:11 -0700
commit501fb355e6fa564e8acdcf9ac1c1766c61afd097 (patch)
tree93d46895673dfc10520d7fad5f42cd4ab9b51384 /gcc
parent15f4eb4428764da231f74ef77d677abad74355f8 (diff)
downloadgcc-501fb355e6fa564e8acdcf9ac1c1766c61afd097.zip
gcc-501fb355e6fa564e8acdcf9ac1c1766c61afd097.tar.gz
gcc-501fb355e6fa564e8acdcf9ac1c1766c61afd097.tar.bz2
re PR target/31334 (Bad codegen for vector initializer with constants prop'd into a vector initializer)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/powerpc/altivec-25.c20
4 files changed, 35 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f55e8a8..a5cebe9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 593408f..a799709 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -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;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7b6cda1b..13e59e7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..a3bd0fd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/altivec-25.c
@@ -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" } } */
+