Commit 19986382 by Richard Biener Committed by Richard Biener

re PR tree-optimization/84737 (20% degradation in CPU2000 172.mgrid starting with r256888)

2018-04-19  Richard Biener  <rguenther@suse.de>

	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
parent 411a771a
2018-04-19 Richard Biener <rguenther@suse.de>
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 <jakub@redhat.com> 2018-04-19 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/85446 PR tree-optimization/85446
......
...@@ -5010,6 +5010,27 @@ bump_vector_ptr (tree dataref_ptr, gimple *ptr_incr, gimple_stmt_iterator *gsi, ...@@ -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. /* Function vect_create_destination_var.
Create a new temporary of type VECTYPE. */ Create a new temporary of type VECTYPE. */
...@@ -5561,6 +5582,7 @@ vect_setup_realignment (gimple *stmt, gimple_stmt_iterator *gsi, ...@@ -5561,6 +5582,7 @@ vect_setup_realignment (gimple *stmt, gimple_stmt_iterator *gsi,
data_ref data_ref
= build2 (MEM_REF, TREE_TYPE (vec_dest), new_temp, = build2 (MEM_REF, TREE_TYPE (vec_dest), new_temp,
build_int_cst (reference_alias_ptr_type (DR_REF (dr)), 0)); 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_stmt = gimple_build_assign (vec_dest, data_ref);
new_temp = make_ssa_name (vec_dest, new_stmt); new_temp = make_ssa_name (vec_dest, new_stmt);
gimple_assign_set_lhs (new_stmt, new_temp); gimple_assign_set_lhs (new_stmt, new_temp);
......
...@@ -6660,6 +6660,7 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, ...@@ -6660,6 +6660,7 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
group_el * elsz); group_el * elsz);
newref = build2 (MEM_REF, ltype, newref = build2 (MEM_REF, ltype,
running_off, this_off); running_off, this_off);
vect_copy_ref_info (newref, DR_REF (first_dr));
/* And store it to *running_off. */ /* And store it to *running_off. */
assign = gimple_build_assign (newref, elem); assign = gimple_build_assign (newref, elem);
...@@ -7052,6 +7053,7 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, ...@@ -7052,6 +7053,7 @@ vectorizable_store (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
TREE_TYPE (data_ref) TREE_TYPE (data_ref)
= build_aligned_type (TREE_TYPE (data_ref), = build_aligned_type (TREE_TYPE (data_ref),
TYPE_ALIGN (elem_type)); TYPE_ALIGN (elem_type));
vect_copy_ref_info (data_ref, DR_REF (first_dr));
new_stmt = gimple_build_assign (data_ref, vec_oprnd); new_stmt = gimple_build_assign (data_ref, vec_oprnd);
} }
vect_finish_stmt_generation (stmt, new_stmt, gsi); vect_finish_stmt_generation (stmt, new_stmt, gsi);
...@@ -7659,9 +7661,9 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, ...@@ -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), tree this_off = build_int_cst (TREE_TYPE (alias_off),
group_el * elsz + cst_offset); group_el * elsz + cst_offset);
new_stmt = gimple_build_assign (make_ssa_name (ltype), tree data_ref = build2 (MEM_REF, ltype, running_off, this_off);
build2 (MEM_REF, ltype, vect_copy_ref_info (data_ref, DR_REF (first_dr));
running_off, this_off)); new_stmt = gimple_build_assign (make_ssa_name (ltype), data_ref);
vect_finish_stmt_generation (stmt, new_stmt, gsi); vect_finish_stmt_generation (stmt, new_stmt, gsi);
if (nloads > 1) if (nloads > 1)
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
...@@ -8205,6 +8207,7 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, ...@@ -8205,6 +8207,7 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
data_ref data_ref
= build2 (MEM_REF, vectype, ptr, = build2 (MEM_REF, vectype, ptr,
build_int_cst (ref_type, 0)); build_int_cst (ref_type, 0));
vect_copy_ref_info (data_ref, DR_REF (first_dr));
vec_dest = vect_create_destination_var (scalar_dest, vec_dest = vect_create_destination_var (scalar_dest,
vectype); vectype);
new_stmt = gimple_build_assign (vec_dest, data_ref); new_stmt = gimple_build_assign (vec_dest, data_ref);
...@@ -8254,7 +8257,10 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt, ...@@ -8254,7 +8257,10 @@ vectorizable_load (gimple *stmt, gimple_stmt_iterator *gsi, gimple **vec_stmt,
vec_dest = vect_create_destination_var (scalar_dest, vectype); vec_dest = vect_create_destination_var (scalar_dest, vectype);
/* DATA_REF is null if we've already built the statement. */ /* DATA_REF is null if we've already built the statement. */
if (data_ref) if (data_ref)
{
vect_copy_ref_info (data_ref, DR_REF (first_dr));
new_stmt = gimple_build_assign (vec_dest, data_ref); new_stmt = gimple_build_assign (vec_dest, data_ref);
}
new_temp = make_ssa_name (vec_dest, new_stmt); new_temp = make_ssa_name (vec_dest, new_stmt);
gimple_set_lhs (new_stmt, new_temp); gimple_set_lhs (new_stmt, new_temp);
vect_finish_stmt_generation (stmt, new_stmt, gsi); vect_finish_stmt_generation (stmt, new_stmt, gsi);
......
...@@ -1494,6 +1494,7 @@ extern tree vect_create_data_ref_ptr (gimple *, tree, struct loop *, tree, ...@@ -1494,6 +1494,7 @@ extern tree vect_create_data_ref_ptr (gimple *, tree, struct loop *, tree,
tree = NULL_TREE, tree = NULL_TREE); tree = NULL_TREE, tree = NULL_TREE);
extern tree bump_vector_ptr (tree, gimple *, gimple_stmt_iterator *, gimple *, extern tree bump_vector_ptr (tree, gimple *, gimple_stmt_iterator *, gimple *,
tree); tree);
extern void vect_copy_ref_info (tree, tree);
extern tree vect_create_destination_var (tree, tree); extern tree vect_create_destination_var (tree, tree);
extern bool vect_grouped_store_supported (tree, unsigned HOST_WIDE_INT); extern bool vect_grouped_store_supported (tree, unsigned HOST_WIDE_INT);
extern bool vect_store_lanes_supported (tree, unsigned HOST_WIDE_INT, bool); extern bool vect_store_lanes_supported (tree, unsigned HOST_WIDE_INT, bool);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment