From 19986382015e2aa8dc539bf31065af4bdff5ce84 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 19 Apr 2018 12:41:42 +0000 Subject: [PATCH] re PR tree-optimization/84737 (20% degradation in CPU2000 172.mgrid starting with r256888) 2018-04-19 Richard Biener PR tree-optimization/84737 * tree-vect-data-refs.c (vect_copy_ref_info): New function copying restrict info. (vect_setup_realignment): Use it. * tree-vectorizer.h (vect_copy_ref_info): Declare. * tree-vect-stmts.c (vectorizable_store): Copy ref info from the first DR to all generated stores. (vectorizable_load): Likewise for loads. From-SVN: r259493 --- gcc/ChangeLog | 11 +++++++++++ gcc/tree-vect-data-refs.c | 22 ++++++++++++++++++++++ gcc/tree-vect-stmts.c | 14 ++++++++++---- gcc/tree-vectorizer.h | 1 + 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0fa244a..12c2ec1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2018-04-19 Richard Biener + + PR tree-optimization/84737 + * tree-vect-data-refs.c (vect_copy_ref_info): New function + copying restrict info. + (vect_setup_realignment): Use it. + * tree-vectorizer.h (vect_copy_ref_info): Declare. + * tree-vect-stmts.c (vectorizable_store): Copy ref info from + the first DR to all generated stores. + (vectorizable_load): Likewise for loads. + 2018-04-19 Jakub Jelinek PR tree-optimization/85446 diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 161a886..9aabcc1 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -5010,6 +5010,27 @@ bump_vector_ptr (tree dataref_ptr, gimple *ptr_incr, gimple_stmt_iterator *gsi, } +/* Copy memory reference info such as base/clique from the SRC reference + to the DEST MEM_REF. */ + +void +vect_copy_ref_info (tree dest, tree src) +{ + if (TREE_CODE (dest) != MEM_REF) + return; + + tree src_base = src; + while (handled_component_p (src_base)) + src_base = TREE_OPERAND (src_base, 0); + if (TREE_CODE (src_base) != MEM_REF + && TREE_CODE (src_base) != TARGET_MEM_REF) + return; + + MR_DEPENDENCE_CLIQUE (dest) = MR_DEPENDENCE_CLIQUE (src_base); + MR_DEPENDENCE_BASE (dest) = MR_DEPENDENCE_BASE (src_base); +} + + /* Function vect_create_destination_var. Create a new temporary of type VECTYPE. */ @@ -5561,6 +5582,7 @@ vect_setup_realignment (gimple *stmt, gimple_stmt_iterator *gsi, data_ref = build2 (MEM_REF, TREE_TYPE (vec_dest), new_temp, build_int_cst (reference_alias_ptr_type (DR_REF (dr)), 0)); + vect_copy_ref_info (data_ref, DR_REF (dr)); new_stmt = gimple_build_assign (vec_dest, data_ref); new_temp = make_ssa_name (vec_dest, new_stmt); gimple_assign_set_lhs (new_stmt, new_temp); diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 7cdabe1..3e73118 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -6660,6 +6660,7 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, group_el * elsz); newref = build2 (MEM_REF, ltype, running_off, this_off); + vect_copy_ref_info (newref, DR_REF (first_dr)); /* And store it to *running_off. */ assign = gimple_build_assign (newref, elem); @@ -7052,6 +7053,7 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, TREE_TYPE (data_ref) = build_aligned_type (TREE_TYPE (data_ref), TYPE_ALIGN (elem_type)); + vect_copy_ref_info (data_ref, DR_REF (first_dr)); new_stmt = gimple_build_assign (data_ref, vec_oprnd); } vect_finish_stmt_generation (stmt, new_stmt, gsi); @@ -7659,9 +7661,9 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, { tree this_off = build_int_cst (TREE_TYPE (alias_off), group_el * elsz + cst_offset); - new_stmt = gimple_build_assign (make_ssa_name (ltype), - build2 (MEM_REF, ltype, - running_off, this_off)); + tree data_ref = build2 (MEM_REF, ltype, running_off, this_off); + vect_copy_ref_info (data_ref, DR_REF (first_dr)); + new_stmt = gimple_build_assign (make_ssa_name (ltype), data_ref); vect_finish_stmt_generation (stmt, new_stmt, gsi); if (nloads > 1) CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, @@ -8205,6 +8207,7 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, data_ref = build2 (MEM_REF, vectype, ptr, build_int_cst (ref_type, 0)); + vect_copy_ref_info (data_ref, DR_REF (first_dr)); vec_dest = vect_create_destination_var (scalar_dest, vectype); new_stmt = gimple_build_assign (vec_dest, data_ref); @@ -8254,7 +8257,10 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, vec_dest = vect_create_destination_var (scalar_dest, vectype); /* DATA_REF is null if we've already built the statement. */ if (data_ref) - new_stmt = gimple_build_assign (vec_dest, data_ref); + { + vect_copy_ref_info (data_ref, DR_REF (first_dr)); + new_stmt = gimple_build_assign (vec_dest, data_ref); + } new_temp = make_ssa_name (vec_dest, new_stmt); gimple_set_lhs (new_stmt, new_temp); vect_finish_stmt_generation (stmt, new_stmt, gsi); diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 33e6a91..7e2b00f 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -1494,6 +1494,7 @@ extern tree vect_create_data_ref_ptr (gimple *, tree, struct loop *, tree, tree = NULL_TREE, tree = NULL_TREE); extern tree bump_vector_ptr (tree, gimple *, gimple_stmt_iterator *, gimple *, tree); +extern void vect_copy_ref_info (tree, tree); extern tree vect_create_destination_var (tree, tree); extern bool vect_grouped_store_supported (tree, unsigned HOST_WIDE_INT); extern bool vect_store_lanes_supported (tree, unsigned HOST_WIDE_INT, bool); -- 2.7.4