aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-03-16 09:54:36 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-03-16 09:54:36 +0000
commit50a763ab474ddf0f9c2d3649c5a89fdb511d8ca7 (patch)
tree222248ef75fc9b6a3c7c0bfe3657c6acaef2e6b2 /gcc
parent6a26a74d8e650ac559c6fc60d061a59b5f8a93bb (diff)
downloadgcc-50a763ab474ddf0f9c2d3649c5a89fdb511d8ca7.zip
gcc-50a763ab474ddf0f9c2d3649c5a89fdb511d8ca7.tar.gz
gcc-50a763ab474ddf0f9c2d3649c5a89fdb511d8ca7.tar.bz2
tree-vect-loop.c (get_initial_def_for_induction): Use build_constructor directly.
2012-03-16 Richard Guenther <rguenther@suse.de> * tree-vect-loop.c (get_initial_def_for_induction): Use build_constructor directly. * tree-vect-stmts.c (vect_get_vec_def_for_operand): Use build_vector_from_val. * tree.c (build_vector_from_val): Avoid creating a constructor first when we want a constant vector. From-SVN: r185461
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/tree-vect-loop.c10
-rw-r--r--gcc/tree-vect-stmts.c11
-rw-r--r--gcc/tree.c21
4 files changed, 29 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fec9c36..4fef9b1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2012-03-16 Richard Guenther <rguenther@suse.de>
+
+ * tree-vect-loop.c (get_initial_def_for_induction): Use
+ build_constructor directly.
+ * tree-vect-stmts.c (vect_get_vec_def_for_operand): Use
+ build_vector_from_val.
+ * tree.c (build_vector_from_val): Avoid creating a constructor
+ first when we want a constant vector.
+
2012-03-16 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* doc/install.texi (Specific, *-*-solaris2*): Improve wording.
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index abba2b9..abf131e 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -3041,6 +3041,8 @@ get_initial_def_for_induction (gimple iv_phi)
}
else
{
+ VEC(constructor_elt,gc) *v;
+
/* iv_loop is the loop to be vectorized. Create:
vec_init = [X, X+S, X+2*S, X+3*S] (S = step_expr, X = init_expr) */
new_var = vect_get_new_vect_var (scalar_type, vect_scalar_var, "var_");
@@ -3053,8 +3055,8 @@ get_initial_def_for_induction (gimple iv_phi)
gcc_assert (!new_bb);
}
- t = NULL_TREE;
- t = tree_cons (NULL_TREE, new_name, t);
+ v = VEC_alloc (constructor_elt, gc, nunits);
+ CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, new_name);
for (i = 1; i < nunits; i++)
{
/* Create: new_name_i = new_name + step_expr */
@@ -3073,10 +3075,10 @@ get_initial_def_for_induction (gimple iv_phi)
fprintf (vect_dump, "created new init_stmt: ");
print_gimple_stmt (vect_dump, init_stmt, 0, TDF_SLIM);
}
- t = tree_cons (NULL_TREE, new_name, t);
+ CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, new_name);
}
/* Create a vector from [new_name_0, new_name_1, ..., new_name_nunits-1] */
- vec = build_constructor_from_list (vectype, nreverse (t));
+ vec = build_constructor (vectype, v);
vec_init = vect_init_vector (iv_phi, vec, vectype, NULL);
}
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 13859af..8a1c678 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -1227,9 +1227,7 @@ vect_get_vec_def_for_operand (tree op, gimple stmt, tree *scalar_def)
loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_vinfo);
tree vec_inv;
tree vec_cst;
- tree t = NULL_TREE;
tree def;
- int i;
enum vect_def_type dt;
bool is_simple_use;
tree vector_type;
@@ -1284,7 +1282,6 @@ vect_get_vec_def_for_operand (tree op, gimple stmt, tree *scalar_def)
{
vector_type = get_vectype_for_scalar_type (TREE_TYPE (def));
gcc_assert (vector_type);
- nunits = TYPE_VECTOR_SUBPARTS (vector_type);
if (scalar_def)
*scalar_def = def;
@@ -1293,13 +1290,7 @@ vect_get_vec_def_for_operand (tree op, gimple stmt, tree *scalar_def)
if (vect_print_dump_info (REPORT_DETAILS))
fprintf (vect_dump, "Create vector_inv.");
- for (i = nunits - 1; i >= 0; --i)
- {
- t = tree_cons (NULL_TREE, def, t);
- }
-
- /* FIXME: use build_constructor directly. */
- vec_inv = build_constructor_from_list (vector_type, t);
+ vec_inv = build_vector_from_val (vector_type, def);
return vect_init_vector (stmt, vec_inv, vector_type, NULL);
}
diff --git a/gcc/tree.c b/gcc/tree.c
index 1734fc5..cfea9f7 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -1372,7 +1372,6 @@ tree
build_vector_from_val (tree vectype, tree sc)
{
int i, nunits = TYPE_VECTOR_SUBPARTS (vectype);
- VEC(constructor_elt, gc) *v = NULL;
if (sc == error_mark_node)
return sc;
@@ -1386,14 +1385,20 @@ build_vector_from_val (tree vectype, tree sc)
gcc_checking_assert (types_compatible_p (TYPE_MAIN_VARIANT (TREE_TYPE (sc)),
TREE_TYPE (vectype)));
- v = VEC_alloc (constructor_elt, gc, nunits);
- for (i = 0; i < nunits; ++i)
- CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, sc);
-
if (CONSTANT_CLASS_P (sc))
- return build_vector_from_ctor (vectype, v);
- else
- return build_constructor (vectype, v);
+ {
+ tree *v = XALLOCAVEC (tree, nunits);
+ for (i = 0; i < nunits; ++i)
+ v[i] = sc;
+ return build_vector (vectype, v);
+ }
+ else
+ {
+ VEC(constructor_elt, gc) *v = VEC_alloc (constructor_elt, gc, nunits);
+ for (i = 0; i < nunits; ++i)
+ CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, sc);
+ return build_constructor (vectype, v);
+ }
}
/* Return a new CONSTRUCTOR node whose type is TYPE and whose values