From: Jakub Jelinek Date: Sun, 5 Jul 2015 12:11:57 +0000 (+0200) Subject: re PR tree-optimization/66718 (Non-invariant ADDR_EXPR not vectorized) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=465c8c1983a68b36059414b7bd589a48693f94e0;p=gcc.git re PR tree-optimization/66718 (Non-invariant ADDR_EXPR not vectorized) PR tree-optimization/66718 * tree-vect-stmts.c (vectorizable_assignment, vectorizable_store, vectorizable_load, vectorizable_condition): Move vectype, nunits, ncopies computation after checking what kind of statement stmt is. From-SVN: r225433 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index be4471c9331..4ccf4396074 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-07-05 Jakub Jelinek + + PR tree-optimization/66718 + * tree-vect-stmts.c (vectorizable_assignment, vectorizable_store, + vectorizable_load, vectorizable_condition): Move vectype, + nunits, ncopies computation after checking what kind of statement + stmt is. + 2015-07-05 Richard Sandiford * target-insns.def (extv, extzv, insv): New targetm instruction diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 6592be2e884..c6565228d08 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -4043,13 +4043,11 @@ vectorizable_assignment (gimple stmt, gimple_stmt_iterator *gsi, tree scalar_dest; tree op; stmt_vec_info stmt_info = vinfo_for_stmt (stmt); - tree vectype = STMT_VINFO_VECTYPE (stmt_info); loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info); tree new_temp; tree def; gimple def_stmt; enum vect_def_type dt[2] = {vect_unknown_def_type, vect_unknown_def_type}; - unsigned int nunits = TYPE_VECTOR_SUBPARTS (vectype); int ncopies; int i, j; vec vec_oprnds = vNULL; @@ -4060,16 +4058,6 @@ vectorizable_assignment (gimple stmt, gimple_stmt_iterator *gsi, enum tree_code code; tree vectype_in; - /* Multiple types in SLP are handled by creating the appropriate number of - vectorized stmts for each SLP node. Hence, NCOPIES is always 1 in - case of SLP. */ - if (slp_node || PURE_SLP_STMT (stmt_info)) - ncopies = 1; - else - ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; - - gcc_assert (ncopies >= 1); - if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) return false; @@ -4095,6 +4083,19 @@ vectorizable_assignment (gimple stmt, gimple_stmt_iterator *gsi, if (code == VIEW_CONVERT_EXPR) op = TREE_OPERAND (op, 0); + tree vectype = STMT_VINFO_VECTYPE (stmt_info); + unsigned int nunits = TYPE_VECTOR_SUBPARTS (vectype); + + /* Multiple types in SLP are handled by creating the appropriate number of + vectorized stmts for each SLP node. Hence, NCOPIES is always 1 in + case of SLP. */ + if (slp_node || PURE_SLP_STMT (stmt_info)) + ncopies = 1; + else + ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; + + gcc_assert (ncopies >= 1); + if (!vect_is_simple_use_1 (op, stmt, loop_vinfo, bb_vinfo, &def_stmt, &def, &dt[0], &vectype_in)) { @@ -5006,7 +5007,6 @@ vectorizable_store (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, tree vec_oprnd = NULL_TREE; stmt_vec_info stmt_info = vinfo_for_stmt (stmt); struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info), *first_dr = NULL; - tree vectype = STMT_VINFO_VECTYPE (stmt_info); tree elem_type; loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info); struct loop *loop = NULL; @@ -5020,7 +5020,6 @@ vectorizable_store (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, tree dataref_ptr = NULL_TREE; tree dataref_offset = NULL_TREE; gimple ptr_incr = NULL; - unsigned int nunits = TYPE_VECTOR_SUBPARTS (vectype); int ncopies; int j; gimple next_stmt, first_stmt = NULL; @@ -5039,28 +5038,6 @@ vectorizable_store (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info); tree aggr_type; - if (loop_vinfo) - loop = LOOP_VINFO_LOOP (loop_vinfo); - - /* Multiple types in SLP are handled by creating the appropriate number of - vectorized stmts for each SLP node. Hence, NCOPIES is always 1 in - case of SLP. */ - if (slp || PURE_SLP_STMT (stmt_info)) - ncopies = 1; - else - ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; - - gcc_assert (ncopies >= 1); - - /* FORNOW. This restriction should be relaxed. */ - if (loop && nested_in_vect_loop_p (loop, stmt) && ncopies > 1) - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "multiple types in nested loop.\n"); - return false; - } - if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) return false; @@ -5086,6 +5063,32 @@ vectorizable_store (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, return false; gcc_assert (gimple_assign_single_p (stmt)); + + tree vectype = STMT_VINFO_VECTYPE (stmt_info); + unsigned int nunits = TYPE_VECTOR_SUBPARTS (vectype); + + if (loop_vinfo) + loop = LOOP_VINFO_LOOP (loop_vinfo); + + /* Multiple types in SLP are handled by creating the appropriate number of + vectorized stmts for each SLP node. Hence, NCOPIES is always 1 in + case of SLP. */ + if (slp || PURE_SLP_STMT (stmt_info)) + ncopies = 1; + else + ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; + + gcc_assert (ncopies >= 1); + + /* FORNOW. This restriction should be relaxed. */ + if (loop && nested_in_vect_loop_p (loop, stmt) && ncopies > 1) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "multiple types in nested loop.\n"); + return false; + } + op = gimple_assign_rhs1 (stmt); if (!vect_is_simple_use (op, stmt, loop_vinfo, bb_vinfo, &def_stmt, &def, &dt)) @@ -5834,7 +5837,6 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, struct loop *containing_loop = (gimple_bb (stmt))->loop_father; bool nested_in_vect_loop = false; struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info), *first_dr = NULL; - tree vectype = STMT_VINFO_VECTYPE (stmt_info); tree elem_type; tree new_temp; machine_mode mode; @@ -5844,7 +5846,6 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, tree dataref_ptr = NULL_TREE; tree dataref_offset = NULL_TREE; gimple ptr_incr = NULL; - int nunits = TYPE_VECTOR_SUBPARTS (vectype); int ncopies; int i, j, group_size = -1, group_gap_adj; tree msq = NULL_TREE, lsq; @@ -5872,6 +5873,37 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, int gather_scale = 1; enum vect_def_type gather_dt = vect_unknown_def_type; + if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) + return false; + + if (STMT_VINFO_DEF_TYPE (stmt_info) != vect_internal_def) + return false; + + /* Is vectorizable load? */ + if (!is_gimple_assign (stmt)) + return false; + + scalar_dest = gimple_assign_lhs (stmt); + if (TREE_CODE (scalar_dest) != SSA_NAME) + return false; + + code = gimple_assign_rhs_code (stmt); + if (code != ARRAY_REF + && code != BIT_FIELD_REF + && code != INDIRECT_REF + && code != COMPONENT_REF + && code != IMAGPART_EXPR + && code != REALPART_EXPR + && code != MEM_REF + && TREE_CODE_CLASS (code) != tcc_declaration) + return false; + + if (!STMT_VINFO_DATA_REF (stmt_info)) + return false; + + tree vectype = STMT_VINFO_VECTYPE (stmt_info); + int nunits = TYPE_VECTOR_SUBPARTS (vectype); + if (loop_vinfo) { loop = LOOP_VINFO_LOOP (loop_vinfo); @@ -5914,34 +5946,6 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, return false; } - if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) - return false; - - if (STMT_VINFO_DEF_TYPE (stmt_info) != vect_internal_def) - return false; - - /* Is vectorizable load? */ - if (!is_gimple_assign (stmt)) - return false; - - scalar_dest = gimple_assign_lhs (stmt); - if (TREE_CODE (scalar_dest) != SSA_NAME) - return false; - - code = gimple_assign_rhs_code (stmt); - if (code != ARRAY_REF - && code != BIT_FIELD_REF - && code != INDIRECT_REF - && code != COMPONENT_REF - && code != IMAGPART_EXPR - && code != REALPART_EXPR - && code != MEM_REF - && TREE_CODE_CLASS (code) != tcc_declaration) - return false; - - if (!STMT_VINFO_DATA_REF (stmt_info)) - return false; - elem_type = TREE_TYPE (vectype); mode = TYPE_MODE (vectype); @@ -7021,7 +7025,6 @@ vectorizable_condition (gimple stmt, gimple_stmt_iterator *gsi, tree vec_dest = NULL_TREE; tree cond_expr, then_clause, else_clause; stmt_vec_info stmt_info = vinfo_for_stmt (stmt); - tree vectype = STMT_VINFO_VECTYPE (stmt_info); tree comp_vectype = NULL_TREE; tree vec_cond_lhs = NULL_TREE, vec_cond_rhs = NULL_TREE; tree vec_then_clause = NULL_TREE, vec_else_clause = NULL_TREE; @@ -7030,7 +7033,6 @@ vectorizable_condition (gimple stmt, gimple_stmt_iterator *gsi, loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info); tree def; enum vect_def_type dt, dts[4]; - int nunits = TYPE_VECTOR_SUBPARTS (vectype); int ncopies; enum tree_code code; stmt_vec_info prev_stmt_info = NULL; @@ -7042,15 +7044,6 @@ vectorizable_condition (gimple stmt, gimple_stmt_iterator *gsi, vec vec_oprnds3 = vNULL; tree vec_cmp_type; - if (slp_node || PURE_SLP_STMT (stmt_info)) - ncopies = 1; - else - ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; - - gcc_assert (ncopies >= 1); - if (reduc_index && ncopies > 1) - return false; /* FORNOW */ - if (reduc_index && STMT_SLP_TYPE (stmt_info)) return false; @@ -7080,6 +7073,18 @@ vectorizable_condition (gimple stmt, gimple_stmt_iterator *gsi, if (code != COND_EXPR) return false; + tree vectype = STMT_VINFO_VECTYPE (stmt_info); + int nunits = TYPE_VECTOR_SUBPARTS (vectype); + + if (slp_node || PURE_SLP_STMT (stmt_info)) + ncopies = 1; + else + ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; + + gcc_assert (ncopies >= 1); + if (reduc_index && ncopies > 1) + return false; /* FORNOW */ + cond_expr = gimple_assign_rhs1 (stmt); then_clause = gimple_assign_rhs2 (stmt); else_clause = gimple_assign_rhs3 (stmt);