diff options
Diffstat (limited to 'gcc/tree-vect-patterns.c')
-rw-r--r-- | gcc/tree-vect-patterns.c | 129 |
1 files changed, 65 insertions, 64 deletions
diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c index dea3595eb34..4b30ab2395c 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -40,24 +40,24 @@ along with GCC; see the file COPYING3. If not see #include "dumpfile.h" /* Pattern recognition functions */ -static gimple vect_recog_widen_sum_pattern (VEC (gimple, heap) **, tree *, +static gimple vect_recog_widen_sum_pattern (vec<gimple> *, tree *, tree *); -static gimple vect_recog_widen_mult_pattern (VEC (gimple, heap) **, tree *, +static gimple vect_recog_widen_mult_pattern (vec<gimple> *, tree *, tree *); -static gimple vect_recog_dot_prod_pattern (VEC (gimple, heap) **, tree *, +static gimple vect_recog_dot_prod_pattern (vec<gimple> *, tree *, tree *); -static gimple vect_recog_pow_pattern (VEC (gimple, heap) **, tree *, tree *); -static gimple vect_recog_over_widening_pattern (VEC (gimple, heap) **, tree *, +static gimple vect_recog_pow_pattern (vec<gimple> *, tree *, tree *); +static gimple vect_recog_over_widening_pattern (vec<gimple> *, tree *, tree *); -static gimple vect_recog_widen_shift_pattern (VEC (gimple, heap) **, +static gimple vect_recog_widen_shift_pattern (vec<gimple> *, tree *, tree *); -static gimple vect_recog_vector_vector_shift_pattern (VEC (gimple, heap) **, +static gimple vect_recog_vector_vector_shift_pattern (vec<gimple> *, tree *, tree *); -static gimple vect_recog_divmod_pattern (VEC (gimple, heap) **, +static gimple vect_recog_divmod_pattern (vec<gimple> *, tree *, tree *); -static gimple vect_recog_mixed_size_cond_pattern (VEC (gimple, heap) **, +static gimple vect_recog_mixed_size_cond_pattern (vec<gimple> *, tree *, tree *); -static gimple vect_recog_bool_pattern (VEC (gimple, heap) **, tree *, tree *); +static gimple vect_recog_bool_pattern (vec<gimple> *, tree *, tree *); static vect_recog_func_ptr vect_vect_recog_func_ptrs[NUM_PATTERNS] = { vect_recog_widen_mult_pattern, vect_recog_widen_sum_pattern, @@ -255,10 +255,10 @@ vect_recog_temp_ssa_var (tree type, gimple stmt) inner-loop nested in an outer-loop that us being vectorized). */ static gimple -vect_recog_dot_prod_pattern (VEC (gimple, heap) **stmts, tree *type_in, +vect_recog_dot_prod_pattern (vec<gimple> *stmts, tree *type_in, tree *type_out) { - gimple stmt, last_stmt = VEC_index (gimple, *stmts, 0); + gimple stmt, last_stmt = (*stmts)[0]; tree oprnd0, oprnd1; tree oprnd00, oprnd01; stmt_vec_info stmt_vinfo = vinfo_for_stmt (last_stmt); @@ -446,7 +446,7 @@ vect_recog_dot_prod_pattern (VEC (gimple, heap) **stmts, tree *type_in, static bool vect_handle_widen_op_by_const (gimple stmt, enum tree_code code, tree const_oprnd, tree *oprnd, - VEC (gimple, heap) **stmts, tree type, + vec<gimple> *stmts, tree type, tree *half_type, gimple def_stmt) { tree new_type, new_oprnd; @@ -491,7 +491,7 @@ vect_handle_widen_op_by_const (gimple stmt, enum tree_code code, || TREE_TYPE (gimple_assign_lhs (new_stmt)) != new_type) return false; - VEC_safe_push (gimple, heap, *stmts, def_stmt); + stmts->safe_push (def_stmt); *oprnd = gimple_assign_lhs (new_stmt); } else @@ -502,7 +502,7 @@ vect_handle_widen_op_by_const (gimple stmt, enum tree_code code, new_stmt = gimple_build_assign_with_ops (NOP_EXPR, new_oprnd, *oprnd, NULL_TREE); STMT_VINFO_RELATED_STMT (vinfo_for_stmt (def_stmt)) = new_stmt; - VEC_safe_push (gimple, heap, *stmts, def_stmt); + stmts->safe_push (def_stmt); *oprnd = new_oprnd; } @@ -585,10 +585,10 @@ vect_handle_widen_op_by_const (gimple stmt, enum tree_code code, */ static gimple -vect_recog_widen_mult_pattern (VEC (gimple, heap) **stmts, +vect_recog_widen_mult_pattern (vec<gimple> *stmts, tree *type_in, tree *type_out) { - gimple last_stmt = VEC_pop (gimple, *stmts); + gimple last_stmt = stmts->pop (); gimple def_stmt0, def_stmt1; tree oprnd0, oprnd1; tree type, half_type0, half_type1; @@ -597,7 +597,7 @@ vect_recog_widen_mult_pattern (VEC (gimple, heap) **stmts, tree var; enum tree_code dummy_code; int dummy_int; - VEC (tree, heap) *dummy_vec; + vec<tree> dummy_vec; bool op1_ok; bool promotion; @@ -702,7 +702,7 @@ vect_recog_widen_mult_pattern (VEC (gimple, heap) **stmts, if (dump_enabled_p ()) dump_gimple_stmt_loc (MSG_NOTE, vect_location, TDF_SLIM, pattern_stmt, 0); - VEC_safe_push (gimple, heap, *stmts, last_stmt); + stmts->safe_push (last_stmt); return pattern_stmt; } @@ -734,10 +734,10 @@ vect_recog_widen_mult_pattern (VEC (gimple, heap) **stmts, */ static gimple -vect_recog_pow_pattern (VEC (gimple, heap) **stmts, tree *type_in, +vect_recog_pow_pattern (vec<gimple> *stmts, tree *type_in, tree *type_out) { - gimple last_stmt = VEC_index (gimple, *stmts, 0); + gimple last_stmt = (*stmts)[0]; tree fn, base, exp = NULL; gimple stmt; tree var; @@ -847,10 +847,10 @@ vect_recog_pow_pattern (VEC (gimple, heap) **stmts, tree *type_in, inner-loop nested in an outer-loop that us being vectorized). */ static gimple -vect_recog_widen_sum_pattern (VEC (gimple, heap) **stmts, tree *type_in, +vect_recog_widen_sum_pattern (vec<gimple> *stmts, tree *type_in, tree *type_out) { - gimple stmt, last_stmt = VEC_index (gimple, *stmts, 0); + gimple stmt, last_stmt = (*stmts)[0]; tree oprnd0, oprnd1; stmt_vec_info stmt_vinfo = vinfo_for_stmt (last_stmt); tree type, half_type; @@ -958,7 +958,7 @@ vect_recog_widen_sum_pattern (VEC (gimple, heap) **stmts, tree *type_in, static bool vect_operation_fits_smaller_type (gimple stmt, tree def, tree *new_type, tree *op0, tree *op1, gimple *new_def_stmt, - VEC (gimple, heap) **stmts) + vec<gimple> *stmts) { enum tree_code code; tree const_oprnd, oprnd; @@ -1096,7 +1096,7 @@ vect_operation_fits_smaller_type (gimple stmt, tree def, tree *new_type, || TREE_TYPE (gimple_assign_lhs (new_stmt)) != interm_type) return false; - VEC_safe_push (gimple, heap, *stmts, def_stmt); + stmts->safe_push (def_stmt); oprnd = gimple_assign_lhs (new_stmt); } else @@ -1107,7 +1107,7 @@ vect_operation_fits_smaller_type (gimple stmt, tree def, tree *new_type, new_stmt = gimple_build_assign_with_ops (NOP_EXPR, new_oprnd, oprnd, NULL_TREE); STMT_VINFO_RELATED_STMT (vinfo_for_stmt (def_stmt)) = new_stmt; - VEC_safe_push (gimple, heap, *stmts, def_stmt); + stmts->safe_push (def_stmt); oprnd = new_oprnd; } } @@ -1163,10 +1163,10 @@ vect_operation_fits_smaller_type (gimple stmt, tree def, tree *new_type, demotion operation. We also check that S3 and S4 have only one use. */ static gimple -vect_recog_over_widening_pattern (VEC (gimple, heap) **stmts, +vect_recog_over_widening_pattern (vec<gimple> *stmts, tree *type_in, tree *type_out) { - gimple stmt = VEC_pop (gimple, *stmts); + gimple stmt = stmts->pop (); gimple pattern_stmt = NULL, new_def_stmt, prev_stmt = NULL, use_stmt = NULL; tree op0, op1, vectype = NULL_TREE, use_lhs, use_type; tree var = NULL_TREE, new_type = NULL_TREE, new_oprnd; @@ -1208,7 +1208,7 @@ vect_recog_over_widening_pattern (VEC (gimple, heap) **stmts, in the sequence. Therefore, we only add the original statement to the list if we know that it is not the last. */ if (prev_stmt) - VEC_safe_push (gimple, heap, *stmts, prev_stmt); + stmts->safe_push (prev_stmt); var = vect_recog_temp_ssa_var (new_type, NULL); pattern_stmt @@ -1266,7 +1266,7 @@ vect_recog_over_widening_pattern (VEC (gimple, heap) **stmts, statement created for PREV_STMT. Therefore, we add PREV_STMT to the list in order to mark it later in vect_pattern_recog_1. */ if (prev_stmt) - VEC_safe_push (gimple, heap, *stmts, prev_stmt); + stmts->safe_push (prev_stmt); } else { @@ -1278,7 +1278,7 @@ vect_recog_over_widening_pattern (VEC (gimple, heap) **stmts, *type_out = NULL_TREE; } - VEC_safe_push (gimple, heap, *stmts, use_stmt); + stmts->safe_push (use_stmt); } else /* TODO: support general case, create a conversion to the correct type. */ @@ -1353,10 +1353,10 @@ vect_recog_over_widening_pattern (VEC (gimple, heap) **stmts, WIDEN_LSHIFT_EXPR <a_t, CONST>. */ static gimple -vect_recog_widen_shift_pattern (VEC (gimple, heap) **stmts, +vect_recog_widen_shift_pattern (vec<gimple> *stmts, tree *type_in, tree *type_out) { - gimple last_stmt = VEC_pop (gimple, *stmts); + gimple last_stmt = stmts->pop (); gimple def_stmt0; tree oprnd0, oprnd1; tree type, half_type0; @@ -1365,7 +1365,7 @@ vect_recog_widen_shift_pattern (VEC (gimple, heap) **stmts, tree var; enum tree_code dummy_code; int dummy_int; - VEC (tree, heap) * dummy_vec; + vec<tree> dummy_vec; gimple use_stmt; bool promotion; @@ -1448,7 +1448,7 @@ vect_recog_widen_shift_pattern (VEC (gimple, heap) **stmts, if (dump_enabled_p ()) dump_gimple_stmt_loc (MSG_NOTE, vect_location, TDF_SLIM, pattern_stmt, 0); - VEC_safe_push (gimple, heap, *stmts, last_stmt); + stmts->safe_push (last_stmt); return pattern_stmt; } @@ -1493,10 +1493,10 @@ vect_recog_widen_shift_pattern (VEC (gimple, heap) **stmts, S3 stmt. */ static gimple -vect_recog_vector_vector_shift_pattern (VEC (gimple, heap) **stmts, +vect_recog_vector_vector_shift_pattern (vec<gimple> *stmts, tree *type_in, tree *type_out) { - gimple last_stmt = VEC_pop (gimple, *stmts); + gimple last_stmt = stmts->pop (); tree oprnd0, oprnd1, lhs, var; gimple pattern_stmt, def_stmt; enum tree_code rhs_code; @@ -1578,7 +1578,7 @@ vect_recog_vector_vector_shift_pattern (VEC (gimple, heap) **stmts, if (dump_enabled_p ()) dump_gimple_stmt_loc (MSG_NOTE, vect_location, TDF_SLIM, pattern_stmt, 0); - VEC_safe_push (gimple, heap, *stmts, last_stmt); + stmts->safe_push (last_stmt); return pattern_stmt; } @@ -1623,10 +1623,10 @@ vect_recog_vector_vector_shift_pattern (VEC (gimple, heap) **stmts, S1 or modulo S4 stmt. */ static gimple -vect_recog_divmod_pattern (VEC (gimple, heap) **stmts, +vect_recog_divmod_pattern (vec<gimple> *stmts, tree *type_in, tree *type_out) { - gimple last_stmt = VEC_pop (gimple, *stmts); + gimple last_stmt = stmts->pop (); tree oprnd0, oprnd1, vectype, itype, cond; gimple pattern_stmt, def_stmt; enum tree_code rhs_code; @@ -1793,7 +1793,7 @@ vect_recog_divmod_pattern (VEC (gimple, heap) **stmts, dump_gimple_stmt_loc (MSG_NOTE, vect_location, TDF_SLIM, pattern_stmt, 0); - VEC_safe_push (gimple, heap, *stmts, last_stmt); + stmts->safe_push (last_stmt); *type_in = vectype; *type_out = vectype; @@ -2038,7 +2038,7 @@ vect_recog_divmod_pattern (VEC (gimple, heap) **stmts, dump_gimple_stmt (MSG_OPTIMIZED_LOCATIONS, TDF_SLIM, pattern_stmt, 0); } - VEC_safe_push (gimple, heap, *stmts, last_stmt); + stmts->safe_push (last_stmt); *type_in = vectype; *type_out = vectype; @@ -2076,10 +2076,10 @@ vect_recog_divmod_pattern (VEC (gimple, heap) **stmts, a_T = (TYPE) a_it; */ static gimple -vect_recog_mixed_size_cond_pattern (VEC (gimple, heap) **stmts, tree *type_in, +vect_recog_mixed_size_cond_pattern (vec<gimple> *stmts, tree *type_in, tree *type_out) { - gimple last_stmt = VEC_index (gimple, *stmts, 0); + gimple last_stmt = (*stmts)[0]; tree cond_expr, then_clause, else_clause; stmt_vec_info stmt_vinfo = vinfo_for_stmt (last_stmt), def_stmt_info; tree type, vectype, comp_vectype, itype = NULL_TREE, vecitype; @@ -2321,7 +2321,7 @@ adjust_bool_pattern_cast (tree type, tree var) static tree adjust_bool_pattern (tree var, tree out_type, tree trueval, - VEC (gimple, heap) **stmts) + vec<gimple> *stmts) { gimple stmt = SSA_NAME_DEF_STMT (var); enum tree_code rhs_code, def_rhs_code; @@ -2400,9 +2400,9 @@ adjust_bool_pattern (tree var, tree out_type, tree trueval, gimple tstmt; stmt_vec_info stmt_def_vinfo = vinfo_for_stmt (def_stmt); irhs2 = adjust_bool_pattern (rhs2, out_type, irhs1, stmts); - tstmt = VEC_pop (gimple, *stmts); + tstmt = stmts->pop (); gcc_assert (tstmt == def_stmt); - VEC_quick_push (gimple, *stmts, stmt); + stmts->quick_push (stmt); STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt)) = STMT_VINFO_RELATED_STMT (stmt_def_vinfo); gcc_assert (!STMT_VINFO_PATTERN_DEF_SEQ (stmt_def_vinfo)); @@ -2425,9 +2425,9 @@ adjust_bool_pattern (tree var, tree out_type, tree trueval, gimple tstmt; stmt_vec_info stmt_def_vinfo = vinfo_for_stmt (def_stmt); irhs1 = adjust_bool_pattern (rhs1, out_type, irhs2, stmts); - tstmt = VEC_pop (gimple, *stmts); + tstmt = stmts->pop (); gcc_assert (tstmt == def_stmt); - VEC_quick_push (gimple, *stmts, stmt); + stmts->quick_push (stmt); STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt)) = STMT_VINFO_RELATED_STMT (stmt_def_vinfo); gcc_assert (!STMT_VINFO_PATTERN_DEF_SEQ (stmt_def_vinfo)); @@ -2494,7 +2494,7 @@ adjust_bool_pattern (tree var, tree out_type, tree trueval, break; } - VEC_safe_push (gimple, heap, *stmts, stmt); + stmts->safe_push (stmt); gimple_set_location (pattern_stmt, loc); STMT_VINFO_RELATED_STMT (vinfo_for_stmt (stmt)) = pattern_stmt; return gimple_assign_lhs (pattern_stmt); @@ -2546,10 +2546,10 @@ adjust_bool_pattern (tree var, tree out_type, tree trueval, but the above is more efficient. */ static gimple -vect_recog_bool_pattern (VEC (gimple, heap) **stmts, tree *type_in, +vect_recog_bool_pattern (vec<gimple> *stmts, tree *type_in, tree *type_out) { - gimple last_stmt = VEC_pop (gimple, *stmts); + gimple last_stmt = stmts->pop (); enum tree_code rhs_code; tree var, lhs, rhs, vectype; stmt_vec_info stmt_vinfo = vinfo_for_stmt (last_stmt); @@ -2591,7 +2591,7 @@ vect_recog_bool_pattern (VEC (gimple, heap) **stmts, tree *type_in, = gimple_build_assign_with_ops (NOP_EXPR, lhs, rhs, NULL_TREE); *type_out = vectype; *type_in = vectype; - VEC_safe_push (gimple, heap, *stmts, last_stmt); + stmts->safe_push (last_stmt); if (dump_enabled_p ()) dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, vect_location, "vect_recog_bool_pattern: detected: "); @@ -2637,7 +2637,7 @@ vect_recog_bool_pattern (VEC (gimple, heap) **stmts, tree *type_in, DR_STMT (STMT_VINFO_DATA_REF (stmt_vinfo)) = pattern_stmt; *type_out = vectype; *type_in = vectype; - VEC_safe_push (gimple, heap, *stmts, last_stmt); + stmts->safe_push (last_stmt); if (dump_enabled_p ()) dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, vect_location, "vect_recog_bool_pattern: detected: "); @@ -2726,7 +2726,7 @@ vect_mark_pattern_stmts (gimple orig_stmt, gimple pattern_stmt, static void vect_pattern_recog_1 (vect_recog_func_ptr vect_recog_func, gimple_stmt_iterator si, - VEC (gimple, heap) **stmts_to_replace) + vec<gimple> *stmts_to_replace) { gimple stmt = gsi_stmt (si), pattern_stmt; stmt_vec_info stmt_info; @@ -2737,13 +2737,13 @@ vect_pattern_recog_1 (vect_recog_func_ptr vect_recog_func, int i; gimple next; - VEC_truncate (gimple, *stmts_to_replace, 0); - VEC_quick_push (gimple, *stmts_to_replace, stmt); + stmts_to_replace->truncate (0); + stmts_to_replace->quick_push (stmt); pattern_stmt = (* vect_recog_func) (stmts_to_replace, &type_in, &type_out); if (!pattern_stmt) return; - stmt = VEC_last (gimple, *stmts_to_replace); + stmt = stmts_to_replace->last (); stmt_info = vinfo_for_stmt (stmt); loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info); @@ -2801,15 +2801,15 @@ vect_pattern_recog_1 (vect_recog_func_ptr vect_recog_func, /* Patterns cannot be vectorized using SLP, because they change the order of computation. */ if (loop_vinfo) - FOR_EACH_VEC_ELT (gimple, LOOP_VINFO_REDUCTIONS (loop_vinfo), i, next) + FOR_EACH_VEC_ELT (LOOP_VINFO_REDUCTIONS (loop_vinfo), i, next) if (next == stmt) - VEC_ordered_remove (gimple, LOOP_VINFO_REDUCTIONS (loop_vinfo), i); + LOOP_VINFO_REDUCTIONS (loop_vinfo).ordered_remove (i); /* It is possible that additional pattern stmts are created and inserted in STMTS_TO_REPLACE. We create a stmt_info for each of them, and mark the relevant statements. */ - for (i = 0; VEC_iterate (gimple, *stmts_to_replace, i, stmt) - && (unsigned) i < (VEC_length (gimple, *stmts_to_replace) - 1); + for (i = 0; stmts_to_replace->iterate (i, &stmt) + && (unsigned) i < (stmts_to_replace->length () - 1); i++) { stmt_info = vinfo_for_stmt (stmt); @@ -2912,7 +2912,8 @@ vect_pattern_recog (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo) gimple_stmt_iterator si; unsigned int i, j; vect_recog_func_ptr vect_recog_func; - VEC (gimple, heap) *stmts_to_replace = VEC_alloc (gimple, heap, 1); + vec<gimple> stmts_to_replace; + stmts_to_replace.create (1); gimple stmt; if (dump_enabled_p ()) @@ -2953,5 +2954,5 @@ vect_pattern_recog (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo) } } - VEC_free (gimple, heap, stmts_to_replace); + stmts_to_replace.release (); } |