Commit 4bdd44c4 by Richard Biener Committed by Richard Biener

tree-vect-loop-manip.c (vect_create_cond_for_alias_checks): Remove…

tree-vect-loop-manip.c (vect_create_cond_for_alias_checks): Remove cond_expr_stmt_list argument and do not gimplify the built expression.

2013-03-18  Richard Biener  <rguenther@suse.de>

	* tree-vect-loop-manip.c (vect_create_cond_for_alias_checks):
	Remove cond_expr_stmt_list argument and do not gimplify the
	built expression.
	(vect_loop_versioning): Adjust.
	* tree-vect-data-refs.c (vect_create_addr_base_for_vector_ref):
	Cleanup to use less temporaries.
	(vect_create_data_ref_ptr): Cleanup.

From-SVN: r196782
parent 38c56a5b
2013-03-18 Richard Biener <rguenther@suse.de>
* tree-vect-loop-manip.c (vect_create_cond_for_alias_checks):
Remove cond_expr_stmt_list argument and do not gimplify the
built expression.
(vect_loop_versioning): Adjust.
* tree-vect-data-refs.c (vect_create_addr_base_for_vector_ref):
Cleanup to use less temporaries.
(vect_create_data_ref_ptr): Cleanup.
2013-03-18 Jakub Jelinek <jakub@redhat.com> 2013-03-18 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/56635 PR tree-optimization/56635
......
...@@ -3470,19 +3470,16 @@ vect_create_addr_base_for_vector_ref (gimple stmt, ...@@ -3470,19 +3470,16 @@ vect_create_addr_base_for_vector_ref (gimple stmt,
{ {
stmt_vec_info stmt_info = vinfo_for_stmt (stmt); stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info); struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
tree data_ref_base = unshare_expr (DR_BASE_ADDRESS (dr)); tree data_ref_base;
const char *base_name; const char *base_name;
tree data_ref_base_var; tree addr_base;
tree vec_stmt;
tree addr_base, addr_expr;
tree dest; tree dest;
gimple_seq seq = NULL; gimple_seq seq = NULL;
tree base_offset = unshare_expr (DR_OFFSET (dr)); tree base_offset;
tree init = unshare_expr (DR_INIT (dr)); tree init;
tree vect_ptr_type; tree vect_ptr_type;
tree step = TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (dr))); tree step = TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (dr)));
loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info); loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
tree base;
if (loop_vinfo && loop && loop != (gimple_bb (stmt))->loop_father) if (loop_vinfo && loop && loop != (gimple_bb (stmt))->loop_father)
{ {
...@@ -3494,6 +3491,12 @@ vect_create_addr_base_for_vector_ref (gimple stmt, ...@@ -3494,6 +3491,12 @@ vect_create_addr_base_for_vector_ref (gimple stmt,
base_offset = unshare_expr (STMT_VINFO_DR_OFFSET (stmt_info)); base_offset = unshare_expr (STMT_VINFO_DR_OFFSET (stmt_info));
init = unshare_expr (STMT_VINFO_DR_INIT (stmt_info)); init = unshare_expr (STMT_VINFO_DR_INIT (stmt_info));
} }
else
{
data_ref_base = unshare_expr (DR_BASE_ADDRESS (dr));
base_offset = unshare_expr (DR_OFFSET (dr));
init = unshare_expr (DR_INIT (dr));
}
if (loop_vinfo) if (loop_vinfo)
base_name = get_name (data_ref_base); base_name = get_name (data_ref_base);
...@@ -3504,29 +3507,17 @@ vect_create_addr_base_for_vector_ref (gimple stmt, ...@@ -3504,29 +3507,17 @@ vect_create_addr_base_for_vector_ref (gimple stmt,
base_name = get_name (DR_REF (dr)); base_name = get_name (DR_REF (dr));
} }
data_ref_base_var = create_tmp_var (TREE_TYPE (data_ref_base), "batmp");
data_ref_base = force_gimple_operand (data_ref_base, &seq, true,
data_ref_base_var);
gimple_seq_add_seq (new_stmt_list, seq);
/* Create base_offset */ /* Create base_offset */
base_offset = size_binop (PLUS_EXPR, base_offset = size_binop (PLUS_EXPR,
fold_convert (sizetype, base_offset), fold_convert (sizetype, base_offset),
fold_convert (sizetype, init)); fold_convert (sizetype, init));
dest = create_tmp_var (sizetype, "base_off");
base_offset = force_gimple_operand (base_offset, &seq, true, dest);
gimple_seq_add_seq (new_stmt_list, seq);
if (offset) if (offset)
{ {
tree tmp = create_tmp_var (sizetype, "offset");
offset = fold_build2 (MULT_EXPR, sizetype, offset = fold_build2 (MULT_EXPR, sizetype,
fold_convert (sizetype, offset), step); fold_convert (sizetype, offset), step);
base_offset = fold_build2 (PLUS_EXPR, sizetype, base_offset = fold_build2 (PLUS_EXPR, sizetype,
base_offset, offset); base_offset, offset);
base_offset = force_gimple_operand (base_offset, &seq, false, tmp);
gimple_seq_add_seq (new_stmt_list, seq);
} }
/* base + base_offset */ /* base + base_offset */
...@@ -3540,34 +3531,26 @@ vect_create_addr_base_for_vector_ref (gimple stmt, ...@@ -3540,34 +3531,26 @@ 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)); addr_base = fold_convert (vect_ptr_type, addr_base);
if (base dest = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var, base_name);
&& TREE_CODE (base) == MEM_REF) addr_base = force_gimple_operand (addr_base, &seq, false, dest);
vect_ptr_type
= build_qualified_type (vect_ptr_type,
TYPE_QUALS (TREE_TYPE (TREE_OPERAND (base, 0))));
vec_stmt = fold_convert (vect_ptr_type, addr_base);
addr_expr = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var,
base_name);
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) if (DR_PTR_INFO (dr)
&& TREE_CODE (vec_stmt) == SSA_NAME) && TREE_CODE (addr_base) == SSA_NAME)
{ {
duplicate_ssa_name_ptr_info (vec_stmt, DR_PTR_INFO (dr)); duplicate_ssa_name_ptr_info (addr_base, DR_PTR_INFO (dr));
if (offset) if (offset)
mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (vec_stmt)); mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (addr_base));
} }
if (dump_enabled_p ()) if (dump_enabled_p ())
{ {
dump_printf_loc (MSG_NOTE, vect_location, "created "); dump_printf_loc (MSG_NOTE, vect_location, "created ");
dump_generic_expr (MSG_NOTE, TDF_SLIM, vec_stmt); dump_generic_expr (MSG_NOTE, TDF_SLIM, addr_base);
} }
return vec_stmt; return addr_base;
} }
...@@ -3647,7 +3630,6 @@ vect_create_data_ref_ptr (gimple stmt, tree aggr_type, struct loop *at_loop, ...@@ -3647,7 +3630,6 @@ vect_create_data_ref_ptr (gimple stmt, tree aggr_type, struct loop *at_loop,
gimple incr; gimple incr;
tree step; tree step;
bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info); bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
tree base;
gcc_assert (TREE_CODE (aggr_type) == ARRAY_TYPE gcc_assert (TREE_CODE (aggr_type) == ARRAY_TYPE
|| TREE_CODE (aggr_type) == VECTOR_TYPE); || TREE_CODE (aggr_type) == VECTOR_TYPE);
...@@ -3699,53 +3681,37 @@ vect_create_data_ref_ptr (gimple stmt, tree aggr_type, struct loop *at_loop, ...@@ -3699,53 +3681,37 @@ vect_create_data_ref_ptr (gimple stmt, tree aggr_type, struct loop *at_loop,
dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_BASE_OBJECT (dr)); dump_generic_expr (MSG_NOTE, TDF_SLIM, DR_BASE_OBJECT (dr));
} }
/* (1) Create the new aggregate-pointer variable. */ /* (1) Create the new aggregate-pointer variable.
aggr_ptr_type = build_pointer_type (aggr_type); Vector and array types inherit the alias set of their component
base = get_base_address (DR_REF (dr));
if (base
&& TREE_CODE (base) == MEM_REF)
aggr_ptr_type
= build_qualified_type (aggr_ptr_type,
TYPE_QUALS (TREE_TYPE (TREE_OPERAND (base, 0))));
aggr_ptr = vect_get_new_vect_var (aggr_ptr_type, vect_pointer_var, base_name);
/* Vector and array types inherit the alias set of their component
type by default so we need to use a ref-all pointer if the data type by default so we need to use a ref-all pointer if the data
reference does not conflict with the created aggregated data reference does not conflict with the created aggregated data
reference because it is not addressable. */ reference because it is not addressable. */
if (!alias_sets_conflict_p (get_deref_alias_set (aggr_ptr), bool need_ref_all = false;
if (!alias_sets_conflict_p (get_alias_set (aggr_type),
get_alias_set (DR_REF (dr)))) get_alias_set (DR_REF (dr))))
{ need_ref_all = true;
aggr_ptr_type
= build_pointer_type_for_mode (aggr_type,
TYPE_MODE (aggr_ptr_type), true);
aggr_ptr = vect_get_new_vect_var (aggr_ptr_type, vect_pointer_var,
base_name);
}
/* Likewise for any of the data references in the stmt group. */ /* Likewise for any of the data references in the stmt group. */
else if (STMT_VINFO_GROUP_SIZE (stmt_info) > 1) else if (STMT_VINFO_GROUP_SIZE (stmt_info) > 1)
{ {
gimple orig_stmt = STMT_VINFO_GROUP_FIRST_ELEMENT (stmt_info); gimple orig_stmt = STMT_VINFO_GROUP_FIRST_ELEMENT (stmt_info);
do do
{ {
tree lhs = gimple_assign_lhs (orig_stmt); stmt_vec_info sinfo = vinfo_for_stmt (orig_stmt);
if (!alias_sets_conflict_p (get_deref_alias_set (aggr_ptr), struct data_reference *sdr = STMT_VINFO_DATA_REF (sinfo);
get_alias_set (lhs))) if (!alias_sets_conflict_p (get_alias_set (aggr_type),
get_alias_set (DR_REF (sdr))))
{ {
aggr_ptr_type need_ref_all = true;
= build_pointer_type_for_mode (aggr_type,
TYPE_MODE (aggr_ptr_type), true);
aggr_ptr
= vect_get_new_vect_var (aggr_ptr_type, vect_pointer_var,
base_name);
break; break;
} }
orig_stmt = STMT_VINFO_GROUP_NEXT_ELEMENT (sinfo);
orig_stmt = STMT_VINFO_GROUP_NEXT_ELEMENT (vinfo_for_stmt (orig_stmt));
} }
while (orig_stmt); while (orig_stmt);
} }
aggr_ptr_type = build_pointer_type_for_mode (aggr_type, ptr_mode,
need_ref_all);
aggr_ptr = vect_get_new_vect_var (aggr_ptr_type, vect_pointer_var, base_name);
/* Note: If the dataref is in an inner-loop nested in LOOP, and we are /* Note: If the dataref is in an inner-loop nested in LOOP, and we are
vectorizing LOOP (i.e., outer-loop vectorization), we need to create two vectorizing LOOP (i.e., outer-loop vectorization), we need to create two
......
...@@ -2271,20 +2271,14 @@ vect_vfa_segment_size (struct data_reference *dr, tree length_factor) ...@@ -2271,20 +2271,14 @@ vect_vfa_segment_size (struct data_reference *dr, tree length_factor)
Output: Output:
COND_EXPR - conditional expression. COND_EXPR - conditional expression.
COND_EXPR_STMT_LIST - statements needed to construct the conditional
expression.
The returned value is the conditional expression to be used in the if The returned value is the conditional expression to be used in the if
statement that controls which version of the loop gets executed at runtime. statement that controls which version of the loop gets executed at runtime.
*/ */
static void static void
vect_create_cond_for_alias_checks (loop_vec_info loop_vinfo, vect_create_cond_for_alias_checks (loop_vec_info loop_vinfo, tree * cond_expr)
tree * cond_expr,
gimple_seq * cond_expr_stmt_list)
{ {
struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
vec<ddr_p> may_alias_ddrs = vec<ddr_p> may_alias_ddrs =
LOOP_VINFO_MAY_ALIAS_DDRS (loop_vinfo); LOOP_VINFO_MAY_ALIAS_DDRS (loop_vinfo);
int vect_factor = LOOP_VINFO_VECT_FACTOR (loop_vinfo); int vect_factor = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
...@@ -2333,12 +2327,14 @@ vect_create_cond_for_alias_checks (loop_vec_info loop_vinfo, ...@@ -2333,12 +2327,14 @@ vect_create_cond_for_alias_checks (loop_vec_info loop_vinfo,
dr_b = STMT_VINFO_DATA_REF (vinfo_for_stmt (stmt_b)); dr_b = STMT_VINFO_DATA_REF (vinfo_for_stmt (stmt_b));
} }
addr_base_a = addr_base_a
vect_create_addr_base_for_vector_ref (stmt_a, cond_expr_stmt_list, = fold_build_pointer_plus (DR_BASE_ADDRESS (dr_a),
NULL_TREE, loop); size_binop (PLUS_EXPR, DR_OFFSET (dr_a),
addr_base_b = DR_INIT (dr_a)));
vect_create_addr_base_for_vector_ref (stmt_b, cond_expr_stmt_list, addr_base_b
NULL_TREE, loop); = fold_build_pointer_plus (DR_BASE_ADDRESS (dr_b),
size_binop (PLUS_EXPR, DR_OFFSET (dr_b),
DR_INIT (dr_b)));
if (!operand_equal_p (DR_STEP (dr_a), DR_STEP (dr_b), 0)) if (!operand_equal_p (DR_STEP (dr_a), DR_STEP (dr_b), 0))
length_factor = scalar_loop_iters; length_factor = scalar_loop_iters;
...@@ -2435,8 +2431,7 @@ vect_loop_versioning (loop_vec_info loop_vinfo, ...@@ -2435,8 +2431,7 @@ vect_loop_versioning (loop_vec_info loop_vinfo,
&cond_expr_stmt_list); &cond_expr_stmt_list);
if (LOOP_REQUIRES_VERSIONING_FOR_ALIAS (loop_vinfo)) if (LOOP_REQUIRES_VERSIONING_FOR_ALIAS (loop_vinfo))
vect_create_cond_for_alias_checks (loop_vinfo, &cond_expr, vect_create_cond_for_alias_checks (loop_vinfo, &cond_expr);
&cond_expr_stmt_list);
cond_expr = force_gimple_operand_1 (cond_expr, &gimplify_stmt_list, cond_expr = force_gimple_operand_1 (cond_expr, &gimplify_stmt_list,
is_gimple_condexpr, NULL_TREE); is_gimple_condexpr, NULL_TREE);
......
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