Commit 17fc049f by Richard Guenther Committed by Richard Biener

re PR rtl-optimization/44479 (false dependencies are computed after vectorization)

2010-07-04  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/44479
	* tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Avoid
	extra SSA name copy statements which preserves points-to
	information.
	* tree-vect-data-refs.c (vect_create_addr_base_for_vector_ref):
	Copy points-to information for all pointers.  Properly handle
	MEM_REFs.
	(vect_create_data_ref_ptr): Likewise.  Avoid extra SSA name
	copy statements.
	* Makefile.in (tree-ssa-loop-ivopts.o): Add tree-ssa-propagate.h
	dependency.

From-SVN: r161802
parent c9dfc414
2010-07-04 Richard Guenther <rguenther@suse.de> 2010-07-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/44479
* tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Avoid
extra SSA name copy statements which preserves points-to
information.
* tree-vect-data-refs.c (vect_create_addr_base_for_vector_ref):
Copy points-to information for all pointers. Properly handle
MEM_REFs.
(vect_create_data_ref_ptr): Likewise. Avoid extra SSA name
copy statements.
* Makefile.in (tree-ssa-loop-ivopts.o): Add tree-ssa-propagate.h
dependency.
2010-07-04 Richard Guenther <rguenther@suse.de>
PR middle-end/44785 PR middle-end/44785
* tree-inline.c (initialize_inlined_parameters): Do not * tree-inline.c (initialize_inlined_parameters): Do not
re-use pointer-map slot over remap_type call. re-use pointer-map slot over remap_type call.
......
...@@ -2566,7 +2566,7 @@ tree-ssa-loop-ivopts.o : tree-ssa-loop-ivopts.c $(TREE_FLOW_H) $(CONFIG_H) \ ...@@ -2566,7 +2566,7 @@ tree-ssa-loop-ivopts.o : tree-ssa-loop-ivopts.c $(TREE_FLOW_H) $(CONFIG_H) \
$(TREE_PASS_H) $(GGC_H) $(RECOG_H) insn-config.h $(HASHTAB_H) $(SCEV_H) \ $(TREE_PASS_H) $(GGC_H) $(RECOG_H) insn-config.h $(HASHTAB_H) $(SCEV_H) \
$(CFGLOOP_H) $(PARAMS_H) langhooks.h $(BASIC_BLOCK_H) \ $(CFGLOOP_H) $(PARAMS_H) langhooks.h $(BASIC_BLOCK_H) \
tree-affine.h pointer-set.h $(TARGET_H) tree-pretty-print.h \ tree-affine.h pointer-set.h $(TARGET_H) tree-pretty-print.h \
gimple-pretty-print.h gimple-pretty-print.h tree-ssa-propagate.h
tree-affine.o : tree-affine.c tree-affine.h $(CONFIG_H) pointer-set.h \ tree-affine.o : tree-affine.c tree-affine.h $(CONFIG_H) pointer-set.h \
$(SYSTEM_H) $(TREE_H) $(GIMPLE_H) \ $(SYSTEM_H) $(TREE_H) $(GIMPLE_H) \
output.h $(DIAGNOSTIC_H) coretypes.h $(TREE_DUMP_H) $(FLAGS_H) \ output.h $(DIAGNOSTIC_H) coretypes.h $(TREE_DUMP_H) $(FLAGS_H) \
......
...@@ -89,6 +89,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -89,6 +89,7 @@ along with GCC; see the file COPYING3. If not see
#include "langhooks.h" #include "langhooks.h"
#include "tree-affine.h" #include "tree-affine.h"
#include "target.h" #include "target.h"
#include "tree-ssa-propagate.h"
/* FIXME: Expressions are expanded to RTL in this pass to determine the /* FIXME: Expressions are expanded to RTL in this pass to determine the
cost of different addressing modes. This should be moved to a TBD cost of different addressing modes. This should be moved to a TBD
...@@ -5481,12 +5482,18 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data, ...@@ -5481,12 +5482,18 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data,
gcc_unreachable (); gcc_unreachable ();
} }
op = force_gimple_operand_gsi (&bsi, comp, false, SSA_NAME_VAR (tgt), if (!valid_gimple_rhs_p (comp)
true, GSI_SAME_STMT); || (gimple_code (use->stmt) != GIMPLE_PHI
/* We can't allow re-allocating the stmt as it might be pointed
to still. */
&& (get_gimple_rhs_num_ops (TREE_CODE (comp))
>= gimple_num_ops (gsi_stmt (bsi)))))
comp = force_gimple_operand_gsi (&bsi, comp, false, SSA_NAME_VAR (tgt),
true, GSI_SAME_STMT);
if (gimple_code (use->stmt) == GIMPLE_PHI) if (gimple_code (use->stmt) == GIMPLE_PHI)
{ {
ass = gimple_build_assign (tgt, op); ass = gimple_build_assign (tgt, comp);
gsi_insert_before (&bsi, ass, GSI_SAME_STMT); gsi_insert_before (&bsi, ass, GSI_SAME_STMT);
bsi = gsi_for_stmt (use->stmt); bsi = gsi_for_stmt (use->stmt);
...@@ -5494,7 +5501,7 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data, ...@@ -5494,7 +5501,7 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data,
} }
else else
{ {
gimple_assign_set_rhs_from_tree (&bsi, op); gimple_assign_set_rhs_from_tree (&bsi, comp);
use->stmt = gsi_stmt (bsi); use->stmt = gsi_stmt (bsi);
} }
} }
......
...@@ -2787,7 +2787,7 @@ vect_create_addr_base_for_vector_ref (gimple stmt, ...@@ -2787,7 +2787,7 @@ vect_create_addr_base_for_vector_ref (gimple stmt,
vect_ptr_type = build_pointer_type (STMT_VINFO_VECTYPE (stmt_info)); vect_ptr_type = build_pointer_type (STMT_VINFO_VECTYPE (stmt_info));
base = get_base_address (DR_REF (dr)); base = get_base_address (DR_REF (dr));
if (base if (base
&& INDIRECT_REF_P (base)) && TREE_CODE (base) == MEM_REF)
vect_ptr_type vect_ptr_type
= build_qualified_type (vect_ptr_type, = build_qualified_type (vect_ptr_type,
TYPE_QUALS (TREE_TYPE (TREE_OPERAND (base, 0)))); TYPE_QUALS (TREE_TYPE (TREE_OPERAND (base, 0))));
...@@ -2799,6 +2799,10 @@ vect_create_addr_base_for_vector_ref (gimple stmt, ...@@ -2799,6 +2799,10 @@ vect_create_addr_base_for_vector_ref (gimple stmt,
vec_stmt = force_gimple_operand (vec_stmt, &seq, false, addr_expr); vec_stmt = force_gimple_operand (vec_stmt, &seq, false, addr_expr);
gimple_seq_add_seq (new_stmt_list, seq); gimple_seq_add_seq (new_stmt_list, seq);
if (DR_PTR_INFO (dr)
&& TREE_CODE (vec_stmt) == SSA_NAME)
duplicate_ssa_name_ptr_info (vec_stmt, DR_PTR_INFO (dr));
if (vect_print_dump_info (REPORT_DETAILS)) if (vect_print_dump_info (REPORT_DETAILS))
{ {
fprintf (vect_dump, "created "); fprintf (vect_dump, "created ");
...@@ -2934,7 +2938,7 @@ vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop, ...@@ -2934,7 +2938,7 @@ vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop,
vect_ptr_type = build_pointer_type (vectype); vect_ptr_type = build_pointer_type (vectype);
base = get_base_address (DR_REF (dr)); base = get_base_address (DR_REF (dr));
if (base if (base
&& INDIRECT_REF_P (base)) && TREE_CODE (base) == MEM_REF)
vect_ptr_type vect_ptr_type
= build_qualified_type (vect_ptr_type, = build_qualified_type (vect_ptr_type,
TYPE_QUALS (TREE_TYPE (TREE_OPERAND (base, 0)))); TYPE_QUALS (TREE_TYPE (TREE_OPERAND (base, 0))));
...@@ -3032,17 +3036,26 @@ vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop, ...@@ -3032,17 +3036,26 @@ vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop,
*initial_address = new_temp; *initial_address = new_temp;
/* Create: p = (vectype *) initial_base */ /* Create: p = (vectype *) initial_base */
vec_stmt = gimple_build_assign (vect_ptr, if (TREE_CODE (new_temp) != SSA_NAME
fold_convert (vect_ptr_type, new_temp)); || !useless_type_conversion_p (vect_ptr_type, TREE_TYPE (new_temp)))
vect_ptr_init = make_ssa_name (vect_ptr, vec_stmt);
gimple_assign_set_lhs (vec_stmt, vect_ptr_init);
if (pe)
{ {
new_bb = gsi_insert_on_edge_immediate (pe, vec_stmt); vec_stmt = gimple_build_assign (vect_ptr,
gcc_assert (!new_bb); fold_convert (vect_ptr_type, new_temp));
vect_ptr_init = make_ssa_name (vect_ptr, vec_stmt);
/* Copy the points-to information if it exists. */
if (DR_PTR_INFO (dr))
duplicate_ssa_name_ptr_info (vect_ptr_init, DR_PTR_INFO (dr));
gimple_assign_set_lhs (vec_stmt, vect_ptr_init);
if (pe)
{
new_bb = gsi_insert_on_edge_immediate (pe, vec_stmt);
gcc_assert (!new_bb);
}
else
gsi_insert_before (&gsi, vec_stmt, GSI_SAME_STMT);
} }
else else
gsi_insert_before (&gsi, vec_stmt, GSI_SAME_STMT); vect_ptr_init = new_temp;
/** (4) Handle the updating of the vector-pointer inside the loop. /** (4) Handle the updating of the vector-pointer inside the loop.
This is needed when ONLY_INIT is false, and also when AT_LOOP This is needed when ONLY_INIT is false, and also when AT_LOOP
...@@ -3051,12 +3064,7 @@ vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop, ...@@ -3051,12 +3064,7 @@ vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop,
/* No update in loop is required. */ /* No update in loop is required. */
if (only_init && (!loop_vinfo || at_loop == loop)) if (only_init && (!loop_vinfo || at_loop == loop))
{ vptr = vect_ptr_init;
/* Copy the points-to information if it exists. */
if (DR_PTR_INFO (dr))
duplicate_ssa_name_ptr_info (vect_ptr_init, DR_PTR_INFO (dr));
vptr = vect_ptr_init;
}
else else
{ {
/* The step of the vector pointer is the Vector Size. */ /* The step of the vector pointer is the Vector Size. */
......
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