Commit f8d0706b by Bin Cheng Committed by Bin Cheng

tree-vect-loop-manip.c (create_intersect_range_checks_index): Pass in parameter…

tree-vect-loop-manip.c (create_intersect_range_checks_index): Pass in parameter loop, rather than loop_vinfo.

	* tree-vect-loop-manip.c (create_intersect_range_checks_index): Pass
	in parameter loop, rather than loop_vinfo.
	(create_intersect_range_checks): Ditto.
	(vect_create_cond_for_alias_checks): Update call to above functions.

From-SVN: r248513
parent cb4fe401
2017-05-26 Bin Cheng <bin.cheng@arm.com> 2017-05-26 Bin Cheng <bin.cheng@arm.com>
* tree-vect-loop-manip.c (create_intersect_range_checks_index): Pass
in parameter loop, rather than loop_vinfo.
(create_intersect_range_checks): Ditto.
(vect_create_cond_for_alias_checks): Update call to above functions.
2017-05-26 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/80815 PR tree-optimization/80815
* tree-data-ref.c (prune_runtime_alias_test_list): Simplify condition * tree-data-ref.c (prune_runtime_alias_test_list): Simplify condition
for merging runtime alias checks. Handle negative DR_STEPs. for merging runtime alias checks. Handle negative DR_STEPs.
......
...@@ -2044,11 +2044,11 @@ vect_create_cond_for_align_checks (loop_vec_info loop_vinfo, ...@@ -2044,11 +2044,11 @@ vect_create_cond_for_align_checks (loop_vec_info loop_vinfo,
*cond_expr = part_cond_expr; *cond_expr = part_cond_expr;
} }
/* Given two data references and segment lengths described by DR_A and DR_B, /* Given LOOP's two data references and segment lengths described by DR_A
create expression checking if the two addresses ranges intersect with and DR_B, create expression checking if the two addresses ranges intersect
each other based on index of the two addresses. This can only be done with each other based on index of the two addresses. This can only be
if DR_A and DR_B referring to the same (array) object and the index is done if DR_A and DR_B referring to the same (array) object and the index
the only difference. For example: is the only difference. For example:
DR_A DR_B DR_A DR_B
data-ref arr[i] arr[j] data-ref arr[i] arr[j]
...@@ -2070,7 +2070,7 @@ vect_create_cond_for_align_checks (loop_vec_info loop_vinfo, ...@@ -2070,7 +2070,7 @@ vect_create_cond_for_align_checks (loop_vec_info loop_vinfo,
Note evolution step of index needs to be considered in comparison. */ Note evolution step of index needs to be considered in comparison. */
static bool static bool
create_intersect_range_checks_index (loop_vec_info loop_vinfo, tree *cond_expr, create_intersect_range_checks_index (struct loop *loop, tree *cond_expr,
const dr_with_seg_len& dr_a, const dr_with_seg_len& dr_a,
const dr_with_seg_len& dr_b) const dr_with_seg_len& dr_b)
{ {
...@@ -2109,7 +2109,6 @@ create_intersect_range_checks_index (loop_vec_info loop_vinfo, tree *cond_expr, ...@@ -2109,7 +2109,6 @@ create_intersect_range_checks_index (loop_vec_info loop_vinfo, tree *cond_expr,
unsigned HOST_WIDE_INT niter_len2 = (seg_len2 + abs_step - 1) / abs_step; unsigned HOST_WIDE_INT niter_len2 = (seg_len2 + abs_step - 1) / abs_step;
unsigned int i; unsigned int i;
struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
for (i = 0; i < DR_NUM_DIMENSIONS (dr_a.dr); i++) for (i = 0; i < DR_NUM_DIMENSIONS (dr_a.dr); i++)
{ {
tree access1 = DR_ACCESS_FN (dr_a.dr, i); tree access1 = DR_ACCESS_FN (dr_a.dr, i);
...@@ -2186,12 +2185,12 @@ create_intersect_range_checks_index (loop_vec_info loop_vinfo, tree *cond_expr, ...@@ -2186,12 +2185,12 @@ create_intersect_range_checks_index (loop_vec_info loop_vinfo, tree *cond_expr,
|| (DR_B_addr_0 + DER_B_segment_length_0) <= DR_A_addr_0)) */ || (DR_B_addr_0 + DER_B_segment_length_0) <= DR_A_addr_0)) */
static void static void
create_intersect_range_checks (loop_vec_info loop_vinfo, tree *cond_expr, create_intersect_range_checks (struct loop *loop, tree *cond_expr,
const dr_with_seg_len& dr_a, const dr_with_seg_len& dr_a,
const dr_with_seg_len& dr_b) const dr_with_seg_len& dr_b)
{ {
*cond_expr = NULL_TREE; *cond_expr = NULL_TREE;
if (create_intersect_range_checks_index (loop_vinfo, cond_expr, dr_a, dr_b)) if (create_intersect_range_checks_index (loop, cond_expr, dr_a, dr_b))
return; return;
tree segment_length_a = dr_a.seg_len; tree segment_length_a = dr_a.seg_len;
...@@ -2263,6 +2262,7 @@ vect_create_cond_for_alias_checks (loop_vec_info loop_vinfo, tree * cond_expr) ...@@ -2263,6 +2262,7 @@ vect_create_cond_for_alias_checks (loop_vec_info loop_vinfo, tree * cond_expr)
if (comp_alias_ddrs.is_empty ()) if (comp_alias_ddrs.is_empty ())
return; return;
struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
for (size_t i = 0, s = comp_alias_ddrs.length (); i < s; ++i) for (size_t i = 0, s = comp_alias_ddrs.length (); i < s; ++i)
{ {
const dr_with_seg_len& dr_a = comp_alias_ddrs[i].first; const dr_with_seg_len& dr_a = comp_alias_ddrs[i].first;
...@@ -2279,7 +2279,7 @@ vect_create_cond_for_alias_checks (loop_vec_info loop_vinfo, tree * cond_expr) ...@@ -2279,7 +2279,7 @@ vect_create_cond_for_alias_checks (loop_vec_info loop_vinfo, tree * cond_expr)
} }
/* Create condition expression for each pair data references. */ /* Create condition expression for each pair data references. */
create_intersect_range_checks (loop_vinfo, &part_cond_expr, dr_a, dr_b); create_intersect_range_checks (loop, &part_cond_expr, dr_a, dr_b);
if (*cond_expr) if (*cond_expr)
*cond_expr = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, *cond_expr = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
*cond_expr, part_cond_expr); *cond_expr, part_cond_expr);
......
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