From c374907d3d137a6b7ed5898617b74b620924c72d Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 1 Mar 2011 17:04:26 +0000 Subject: [PATCH] backport: [multiple changes] 2011-03-01 Richard Guenther Backport from mainline 2011-03-01 Richard Guenther PR tree-optimization/47890 * tree-vect-loop.c (get_initial_def_for_induction): Set related stmt properly. * gcc.dg/torture/pr47890.c: New testcase. 2010-12-01 Richard Guenther PR tree-optimization/46723 * tree-vect-loop.c (get_initial_def_for_induction): Strip conversions from the induction evolution and apply it to the result instead. * tree-vect-stmts.c (vect_get_vec_def_for_operand): Handle assigns for induction defs. * gcc.dg/torture/pr46723.c: New testcase. From-SVN: r170595 --- gcc/ChangeLog | 18 +++++++ gcc/testsuite/ChangeLog | 13 +++++ gcc/testsuite/gcc.dg/torture/pr46723.c | 10 ++++ gcc/testsuite/gcc.dg/torture/pr47890.c | 9 ++++ gcc/tree-vect-loop.c | 66 ++++++++++++++++++-------- gcc/tree-vect-stmts.c | 6 ++- 6 files changed, 100 insertions(+), 22 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr46723.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr47890.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 45fcaf83aa31..2e8044800f9d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,21 @@ +2011-03-01 Richard Guenther + + Backport from mainline + 2011-03-01 Richard Guenther + + PR tree-optimization/47890 + * tree-vect-loop.c (get_initial_def_for_induction): Set + related stmt properly. + + 2010-12-01 Richard Guenther + + PR tree-optimization/46723 + * tree-vect-loop.c (get_initial_def_for_induction): Strip + conversions from the induction evolution and apply it to + the result instead. + * tree-vect-stmts.c (vect_get_vec_def_for_operand): Handle + assigns for induction defs. + 2011-02-28 Georg-Johann Lay PR target/45261 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5055e516c98c..43b8604ec894 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,16 @@ +2011-03-01 Richard Guenther + + Backport from mainline + 2011-03-01 Richard Guenther + + PR tree-optimization/47890 + * gcc.dg/torture/pr47890.c: New testcase. + + 2010-12-01 Richard Guenther + + PR tree-optimization/46723 + * gcc.dg/torture/pr46723.c: New testcase. + 2011-02-26 Jason Merrill * g++.dg/template/this-targ1.C: New. diff --git a/gcc/testsuite/gcc.dg/torture/pr46723.c b/gcc/testsuite/gcc.dg/torture/pr46723.c new file mode 100644 index 000000000000..40c6e8cd6901 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr46723.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ + +short *m; +void test() +{ + short x = 128; + unsigned int i; + for (i = 0; i < 128; ++i, x = (unsigned short)x + 1) + m[i] = x; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr47890.c b/gcc/testsuite/gcc.dg/torture/pr47890.c new file mode 100644 index 000000000000..83cb5e6d9363 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr47890.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ + +void f(char *s) +{ + signed short i; + + for (i = 0; i < 19; i = i + 1) + s[i] = i; +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 60392334040e..c8ad3a63154b 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -2363,7 +2363,7 @@ get_initial_def_for_induction (gimple iv_phi) stmt_vec_info stmt_vinfo = vinfo_for_stmt (iv_phi); loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_vinfo); struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo); - tree scalar_type = TREE_TYPE (gimple_phi_result (iv_phi)); + tree scalar_type; tree vectype; int nunits; edge pe = loop_preheader_edge (loop); @@ -2392,24 +2392,7 @@ get_initial_def_for_induction (gimple iv_phi) gimple_stmt_iterator si; basic_block bb = gimple_bb (iv_phi); tree stepvectype; - - vectype = get_vectype_for_scalar_type (scalar_type); - gcc_assert (vectype); - nunits = TYPE_VECTOR_SUBPARTS (vectype); - ncopies = vf / nunits; - - gcc_assert (phi_info); - gcc_assert (ncopies >= 1); - - /* Find the first insertion point in the BB. */ - si = gsi_after_labels (bb); - - if (INTEGRAL_TYPE_P (scalar_type)) - step_expr = build_int_cst (scalar_type, 0); - else if (POINTER_TYPE_P (scalar_type)) - step_expr = build_int_cst (sizetype, 0); - else - step_expr = build_real (scalar_type, dconst0); + tree resvectype; /* Is phi in an inner-loop, while vectorizing an enclosing outer-loop? */ if (nested_in_vect_loop_p (loop, iv_phi)) @@ -2426,11 +2409,25 @@ get_initial_def_for_induction (gimple iv_phi) access_fn = analyze_scalar_evolution (iv_loop, PHI_RESULT (iv_phi)); gcc_assert (access_fn); + STRIP_NOPS (access_fn); ok = vect_is_simple_iv_evolution (iv_loop->num, access_fn, &init_expr, &step_expr); gcc_assert (ok); pe = loop_preheader_edge (iv_loop); + scalar_type = TREE_TYPE (init_expr); + vectype = get_vectype_for_scalar_type (scalar_type); + resvectype = get_vectype_for_scalar_type (TREE_TYPE (PHI_RESULT (iv_phi))); + gcc_assert (vectype); + nunits = TYPE_VECTOR_SUBPARTS (vectype); + ncopies = vf / nunits; + + gcc_assert (phi_info); + gcc_assert (ncopies >= 1); + + /* Find the first insertion point in the BB. */ + si = gsi_after_labels (bb); + /* Create the vector that holds the initial_value of the induction. */ if (nested_in_vect_loop) { @@ -2456,7 +2453,7 @@ get_initial_def_for_induction (gimple iv_phi) } t = NULL_TREE; - t = tree_cons (NULL_TREE, init_expr, t); + t = tree_cons (NULL_TREE, new_name, t); for (i = 1; i < nunits; i++) { /* Create: new_name_i = new_name + step_expr */ @@ -2575,6 +2572,19 @@ get_initial_def_for_induction (gimple iv_phi) gimple_assign_set_lhs (new_stmt, vec_def); gsi_insert_before (&si, new_stmt, GSI_SAME_STMT); + if (!useless_type_conversion_p (resvectype, vectype)) + { + new_stmt = gimple_build_assign_with_ops + (VIEW_CONVERT_EXPR, + vect_get_new_vect_var (resvectype, vect_simple_var, + "vec_iv_"), + build1 (VIEW_CONVERT_EXPR, resvectype, + gimple_assign_lhs (new_stmt)), NULL_TREE); + gimple_assign_set_lhs (new_stmt, + make_ssa_name + (gimple_assign_lhs (new_stmt), new_stmt)); + gsi_insert_before (&si, new_stmt, GSI_SAME_STMT); + } set_vinfo_for_stmt (new_stmt, new_stmt_vec_info (new_stmt, loop_vinfo, NULL)); STMT_VINFO_RELATED_STMT (prev_stmt_vinfo) = new_stmt; @@ -2622,6 +2632,22 @@ get_initial_def_for_induction (gimple iv_phi) } STMT_VINFO_VEC_STMT (phi_info) = induction_phi; + if (!useless_type_conversion_p (resvectype, vectype)) + { + new_stmt = gimple_build_assign_with_ops + (VIEW_CONVERT_EXPR, + vect_get_new_vect_var (resvectype, vect_simple_var, "vec_iv_"), + build1 (VIEW_CONVERT_EXPR, resvectype, induc_def), NULL_TREE); + induc_def = make_ssa_name (gimple_assign_lhs (new_stmt), new_stmt); + gimple_assign_set_lhs (new_stmt, induc_def); + si = gsi_start_bb (bb); + gsi_insert_before (&si, new_stmt, GSI_SAME_STMT); + set_vinfo_for_stmt (new_stmt, + new_stmt_vec_info (new_stmt, loop_vinfo, NULL)); + STMT_VINFO_RELATED_STMT (vinfo_for_stmt (new_stmt)) + = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (induction_phi)); + } + return induc_def; } diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 49dfc3d8134c..635d759e1f38 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -1014,8 +1014,10 @@ vect_get_vec_def_for_operand (tree op, gimple stmt, tree *scalar_def) /* Get the def from the vectorized stmt. */ def_stmt_info = vinfo_for_stmt (def_stmt); vec_stmt = STMT_VINFO_VEC_STMT (def_stmt_info); - gcc_assert (vec_stmt && gimple_code (vec_stmt) == GIMPLE_PHI); - vec_oprnd = PHI_RESULT (vec_stmt); + if (gimple_code (vec_stmt) == GIMPLE_PHI) + vec_oprnd = PHI_RESULT (vec_stmt); + else + vec_oprnd = gimple_get_lhs (vec_stmt); return vec_oprnd; } -- 2.47.2