summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorirar <irar@138bc75d-0d04-0410-961f-82ee72b054a4>2009-11-30 12:17:43 +0000
committerirar <irar@138bc75d-0d04-0410-961f-82ee72b054a4>2009-11-30 12:17:43 +0000
commit06e408502c9023a3a6ef56880c18aaa40c879b74 (patch)
tree4026dd213967db8ac7bbe7c6a014b6b01af77493
parentd2056d0d7f92584c015cb7540384edb50de2ee05 (diff)
downloadgcc-06e408502c9023a3a6ef56880c18aaa40c879b74.tar.gz
* tree-vect-stmts.c (vectorizable_assignment): Support
multiple types. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154794 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gfortran.dg/vect/vect-7.f9016
-rw-r--r--gcc/tree-vect-stmts.c43
4 files changed, 54 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d38d8a7a6d8..c015dd4ecbc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2009-11-30 Ira Rosen <irar@il.ibm.com>
+
+ * tree-vect-stmts.c (vectorizable_assignment): Support
+ multiple types.
+
2009-11-30 Richard Guenther <rguenther@suse.de>
* doc/contrib.texi (Contributors): Add myself.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6d75d60e37d..4320d65045b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2009-11-30 Ira Rosen <irar@il.ibm.com>
+
+ * gfortran.dg/vect/vect-7.f90: New test.
+
2009-11-30 Richard Guenther <rguenther@suse.de>
PR middle-end/42119
diff --git a/gcc/testsuite/gfortran.dg/vect/vect-7.f90 b/gcc/testsuite/gfortran.dg/vect/vect-7.f90
new file mode 100644
index 00000000000..adf01379d40
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/vect/vect-7.f90
@@ -0,0 +1,16 @@
+! { dg-do compile }
+! { dg-require-effective-target vect_double }
+
+subroutine foo (x,nnd)
+ dimension x(nnd)
+ integer i
+
+ do i=1,nnd
+ x(i) = 1.d0 + (1.d0*i)/nnd
+ end do
+
+end subroutine foo
+
+! { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target vect_unpack } } }
+! { dg-final { cleanup-tree-dump "vect" } }
+
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 7ce91cadb34..99230909d7d 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -1809,10 +1809,12 @@ vectorizable_assignment (gimple stmt, gimple_stmt_iterator *gsi,
enum vect_def_type dt[2] = {vect_unknown_def_type, vect_unknown_def_type};
int nunits = TYPE_VECTOR_SUBPARTS (vectype);
int ncopies;
- int i;
+ int i, j;
VEC(tree,heap) *vec_oprnds = NULL;
tree vop;
bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
+ gimple new_stmt = NULL;
+ stmt_vec_info prev_stmt_info = NULL;
/* Multiple types in SLP are handled by creating the appropriate number of
vectorized stmts for each SLP node. Hence, NCOPIES is always 1 in
@@ -1823,8 +1825,6 @@ vectorizable_assignment (gimple stmt, gimple_stmt_iterator *gsi,
ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits;
gcc_assert (ncopies >= 1);
- if (ncopies > 1)
- return false; /* FORNOW */
if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo)
return false;
@@ -1870,20 +1870,35 @@ vectorizable_assignment (gimple stmt, gimple_stmt_iterator *gsi,
vec_dest = vect_create_destination_var (scalar_dest, vectype);
/* Handle use. */
- vect_get_vec_defs (op, NULL, stmt, &vec_oprnds, NULL, slp_node);
-
- /* Arguments are ready. create the new vector stmt. */
- for (i = 0; VEC_iterate (tree, vec_oprnds, i, vop); i++)
+ for (j = 0; j < ncopies; j++)
{
- *vec_stmt = gimple_build_assign (vec_dest, vop);
- new_temp = make_ssa_name (vec_dest, *vec_stmt);
- gimple_assign_set_lhs (*vec_stmt, new_temp);
- vect_finish_stmt_generation (stmt, *vec_stmt, gsi);
- STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt;
+ /* Handle uses. */
+ if (j == 0)
+ vect_get_vec_defs (op, NULL, stmt, &vec_oprnds, NULL, slp_node);
+ else
+ vect_get_vec_defs_for_stmt_copy (dt, &vec_oprnds, NULL);
+
+ /* Arguments are ready. create the new vector stmt. */
+ for (i = 0; VEC_iterate (tree, vec_oprnds, i, vop); i++)
+ {
+ new_stmt = gimple_build_assign (vec_dest, vop);
+ new_temp = make_ssa_name (vec_dest, new_stmt);
+ gimple_assign_set_lhs (new_stmt, new_temp);
+ vect_finish_stmt_generation (stmt, new_stmt, gsi);
+ if (slp_node)
+ VEC_quick_push (gimple, SLP_TREE_VEC_STMTS (slp_node), new_stmt);
+ }
if (slp_node)
- VEC_quick_push (gimple, SLP_TREE_VEC_STMTS (slp_node), *vec_stmt);
- }
+ continue;
+
+ if (j == 0)
+ STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_stmt;
+ else
+ STMT_VINFO_RELATED_STMT (prev_stmt_info) = new_stmt;
+
+ prev_stmt_info = vinfo_for_stmt (new_stmt);
+ }
VEC_free (tree, heap, vec_oprnds);
return true;