aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-04-11 14:03:09 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-04-11 14:03:09 +0000
commit1d42c1ec472cf4d6604d1848cf6220d158ca0bdf (patch)
tree5d4910ad8f77a8ac100cf9768d4d40e057a15633 /gcc/tree-vect-loop.c
parentf6fcbc56da3aee8329a2c9c675b661ccd0cbb0b3 (diff)
downloadgcc-1d42c1ec472cf4d6604d1848cf6220d158ca0bdf.zip
gcc-1d42c1ec472cf4d6604d1848cf6220d158ca0bdf.tar.gz
gcc-1d42c1ec472cf4d6604d1848cf6220d158ca0bdf.tar.bz2
tree-vect-loop.c (get_initial_def_for_induction): Properly generate vector constants.
2013-04-11 Richard Biener <rguenther@suse.de> * tree-vect-loop.c (get_initial_def_for_induction): Properly generate vector constants. From-SVN: r197803
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r--gcc/tree-vect-loop.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 2fc20f3..a684c9f 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -3226,30 +3226,36 @@ get_initial_def_for_induction (gimple iv_phi)
}
vec_alloc (v, nunits);
+ bool constant_p = is_gimple_min_invariant (new_name);
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, new_name);
for (i = 1; i < nunits; i++)
{
/* Create: new_name_i = new_name + step_expr */
enum tree_code code = POINTER_TYPE_P (scalar_type)
? POINTER_PLUS_EXPR : PLUS_EXPR;
- init_stmt = gimple_build_assign_with_ops (code, new_var,
- new_name, step_expr);
- new_name = make_ssa_name (new_var, init_stmt);
- gimple_assign_set_lhs (init_stmt, new_name);
-
- new_bb = gsi_insert_on_edge_immediate (pe, init_stmt);
- gcc_assert (!new_bb);
-
- if (dump_enabled_p ())
+ new_name = fold_build2 (code, scalar_type, new_name, step_expr);
+ if (!is_gimple_min_invariant (new_name))
{
- dump_printf_loc (MSG_NOTE, vect_location,
- "created new init_stmt: ");
- dump_gimple_stmt (MSG_NOTE, TDF_SLIM, init_stmt, 0);
+ init_stmt = gimple_build_assign (new_var, new_name);
+ new_name = make_ssa_name (new_var, init_stmt);
+ gimple_assign_set_lhs (init_stmt, new_name);
+ new_bb = gsi_insert_on_edge_immediate (pe, init_stmt);
+ gcc_assert (!new_bb);
+ if (dump_enabled_p ())
+ {
+ dump_printf_loc (MSG_NOTE, vect_location,
+ "created new init_stmt: ");
+ dump_gimple_stmt (MSG_NOTE, TDF_SLIM, init_stmt, 0);
+ }
+ constant_p = false;
}
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, new_name);
}
/* Create a vector from [new_name_0, new_name_1, ..., new_name_nunits-1] */
- new_vec = build_constructor (vectype, v);
+ if (constant_p)
+ new_vec = build_vector_from_ctor (vectype, v);
+ else
+ new_vec = build_constructor (vectype, v);
vec_init = vect_init_vector (iv_phi, new_vec, vectype, NULL);
}