From b09d93475d8e4f86e3b2bce19ef05dbb669e55fb Mon Sep 17 00:00:00 2001 From: Alan Hayward Date: Fri, 20 Nov 2015 14:20:24 +0000 Subject: [PATCH] re PR tree-optimization/68413 (internal compiler error: in vect_transform_stmt) 2015-11-20 Alan Hayward PR tree-optimization/68413 * tree-vect-loop.c (vect_analyze_scalar_cycles_1): Cache evolution base (vectorizable_reduction): Use cached base From-SVN: r230658 --- gcc/ChangeLog | 7 +++++++ gcc/tree-vect-loop.c | 42 ++++++++++++++++++++++++------------------ gcc/tree-vectorizer.h | 7 +++++-- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eae42df47e2..b9beee772a7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-11-20 Alan Hayward + + PR tree-optimization/68413 + * tree-vect-loop.c (vect_analyze_scalar_cycles_1): Cache + evolution base + (vectorizable_reduction): Use cached base + 2015-11-20 Tom de Vries * tree-parloops.c (build_new_reduction): Fix trailing whitespace in diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index c3dbfd3fa76..41e50319f00 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -815,6 +815,8 @@ vect_analyze_scalar_cycles_1 (loop_vec_info loop_vinfo, struct loop *loop) dump_generic_expr (MSG_NOTE, TDF_SLIM, access_fn); dump_printf (MSG_NOTE, "\n"); } + STMT_VINFO_LOOP_PHI_EVOLUTION_BASE_UNCHANGED (stmt_vinfo) + = initial_condition_in_loop_num (access_fn, loop->num); STMT_VINFO_LOOP_PHI_EVOLUTION_PART (stmt_vinfo) = evolution_part_in_loop_num (access_fn, loop->num); } @@ -828,6 +830,8 @@ vect_analyze_scalar_cycles_1 (loop_vec_info loop_vinfo, struct loop *loop) continue; } + gcc_assert (STMT_VINFO_LOOP_PHI_EVOLUTION_BASE_UNCHANGED (stmt_vinfo) + != NULL_TREE); gcc_assert (STMT_VINFO_LOOP_PHI_EVOLUTION_PART (stmt_vinfo) != NULL_TREE); if (dump_enabled_p ()) @@ -5128,7 +5132,7 @@ static bool is_nonwrapping_integer_induction (gimple *stmt, struct loop *loop) { stmt_vec_info stmt_vinfo = vinfo_for_stmt (stmt); - tree base = PHI_ARG_DEF_FROM_EDGE (stmt, loop_preheader_edge (loop)); + tree base = STMT_VINFO_LOOP_PHI_EVOLUTION_BASE_UNCHANGED (stmt_vinfo); tree step = STMT_VINFO_LOOP_PHI_EVOLUTION_PART (stmt_vinfo); tree lhs_type = TREE_TYPE (gimple_phi_result (stmt)); widest_int ni, max_loop_value, lhs_max; @@ -5263,7 +5267,7 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi, tree def0, def1, tem, op0, op1 = NULL_TREE; bool first_p = true; tree cr_index_scalar_type = NULL_TREE, cr_index_vector_type = NULL_TREE; - bool cond_expr_is_nonwrapping_integer_induction = false; + gimple *cond_expr_induction_def_stmt = NULL; /* In case of reduction chain we switch to the first stmt in the chain, but we don't update STMT_INFO, since only the last stmt is marked as reduction @@ -5413,15 +5417,8 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi, reduc_index = i; } - if (i == 1 && code == COND_EXPR && dt == vect_induction_def - && is_nonwrapping_integer_induction (def_stmt, loop)) - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_NOTE, vect_location, - "condition expression based on integer " - "induction.\n"); - cond_expr_is_nonwrapping_integer_induction = true; - } + if (i == 1 && code == COND_EXPR && dt == vect_induction_def) + cond_expr_induction_def_stmt = def_stmt; } is_simple_use = vect_is_simple_use (ops[reduc_index], loop_vinfo, @@ -5448,14 +5445,23 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi, return false; } - gimple *tmp = vect_is_simple_reduction - (loop_vinfo, reduc_def_stmt, - !nested_cycle, &dummy, false, - &STMT_VINFO_VEC_REDUCTION_TYPE (stmt_info)); + enum vect_reduction_type v_reduc_type; + gimple *tmp = vect_is_simple_reduction (loop_vinfo, reduc_def_stmt, + !nested_cycle, &dummy, false, + &v_reduc_type); - if (cond_expr_is_nonwrapping_integer_induction - && STMT_VINFO_VEC_REDUCTION_TYPE (stmt_info) == COND_REDUCTION) - STMT_VINFO_VEC_REDUCTION_TYPE (stmt_info) = INTEGER_INDUC_COND_REDUCTION; + /* If we have a condition reduction, see if we can simplify it further. */ + if (v_reduc_type == COND_REDUCTION + && cond_expr_induction_def_stmt != NULL + && is_nonwrapping_integer_induction (cond_expr_induction_def_stmt, loop)) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_NOTE, vect_location, + "condition expression based on integer induction.\n"); + STMT_VINFO_VEC_REDUCTION_TYPE (stmt_info) = INTEGER_INDUC_COND_REDUCTION; + } + else + STMT_VINFO_VEC_REDUCTION_TYPE (stmt_info) = v_reduc_type; if (orig_stmt) gcc_assert (tmp == orig_stmt diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 7867c262a6c..327f08d79ed 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -518,11 +518,13 @@ typedef struct _stmt_vec_info { tree dr_step; tree dr_aligned_to; - /* For loop PHI nodes, the evolution part of it. This makes sure + /* For loop PHI nodes, the base and evolution part of it. This makes sure this information is still available in vect_update_ivs_after_vectorizer where we may not be able to re-analyze the PHI nodes evolution as peeling for the prologue loop can make it unanalyzable. The evolution - part is still correct though. */ + part is still correct after peeling, but the base may have changed from + the version here. */ + tree loop_phi_evolution_base_unchanged; tree loop_phi_evolution_part; /* Used for various bookkeeping purposes, generally holding a pointer to @@ -645,6 +647,7 @@ STMT_VINFO_BB_VINFO (stmt_vec_info stmt_vinfo) #define STMT_VINFO_GROUP_GAP(S) (S)->gap #define STMT_VINFO_GROUP_SAME_DR_STMT(S) (S)->same_dr_stmt #define STMT_VINFO_GROUPED_ACCESS(S) ((S)->first_element != NULL && (S)->data_ref_info) +#define STMT_VINFO_LOOP_PHI_EVOLUTION_BASE_UNCHANGED(S) (S)->loop_phi_evolution_base_unchanged #define STMT_VINFO_LOOP_PHI_EVOLUTION_PART(S) (S)->loop_phi_evolution_part #define STMT_VINFO_MIN_NEG_DIST(S) (S)->min_neg_dist -- 2.30.2