This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH GCC][v2]Simplify alias check code generation in vectorizer
- From: Robin Dapp <rdapp at linux dot vnet dot ibm dot com>
- To: Richard Biener <richard dot guenther at gmail dot com>, Bernd Edlinger <bernd dot edlinger at hotmail dot de>
- Cc: Markus Trippelsdorf <markus at trippelsdorf dot de>, Richard Biener <rguenther at suse dot de>, GCC Patches <gcc-patches at gcc dot gnu dot org>, "Bin.Cheng" <amker dot cheng at gmail dot com>
- Date: Tue, 27 Sep 2016 15:13:09 +0200
- Subject: Re: [PATCH GCC][v2]Simplify alias check code generation in vectorizer
- Authentication-results: sourceware.org; auth=none
- References: <AM4PR0701MB2162A6D6AFF36191EF65F1A2E4CD0@AM4PR0701MB2162.eurprd07.prod.outlook.com> <73B9DBAB-8793-41FB-A62A-4E62DE381F5B@gmail.com> <CAFiYyc1M=fKiP+NH9n5aRNHYB8LpKi6=FJHrAWS1jzhpMQr92Q@mail.gmail.com>
> Also the '=' in the split line goes to the next line according to
> coding conventions.
fixed, I had only looked at an instance one function above which had it
wrong as well. Also changed comment grammar slightly.
Regards
Robin
--
gcc/ChangeLog:
2016-09-27 Robin Dapp <rdapp@linux.vnet.ibm.com>
* tree-vect-loop-manip.c (create_intersect_range_checks_index):
Add tree_fits_shwi_p check.
gcc/testsuite/ChangeLog:
2016-09-27 Robin Dapp <rdapp@linux.vnet.ibm.com>
* gcc.dg/vect/pr77724.c: New test.
diff --git a/gcc/testsuite/gcc.dg/vect/pr77724.c b/gcc/testsuite/gcc.dg/vect/pr77724.c
new file mode 100644
index 0000000..b3411d6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr77724.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+
+int a[81];
+int b, c;
+
+void
+fn1()
+{
+ int d = b;
+ for (; c; --c)
+ a[c + d] = a[c];
+}
diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c
index 8203040..a715fd9 100644
--- a/gcc/tree-vect-loop-manip.c
+++ b/gcc/tree-vect-loop-manip.c
@@ -2301,6 +2301,9 @@ create_intersect_range_checks_index (loop_vec_info loop_vinfo, tree *cond_expr,
if (!tree_fits_uhwi_p (dr_a.seg_len) || !tree_fits_uhwi_p (dr_b.seg_len))
return false;
+ if (!tree_fits_shwi_p (DR_STEP (dr_a.dr)))
+ return false;
+
if (!operand_equal_p (DR_BASE_OBJECT (dr_a.dr), DR_BASE_OBJECT (dr_b.dr), 0))
return false;
@@ -2310,9 +2313,8 @@ create_intersect_range_checks_index (loop_vec_info loop_vinfo, tree *cond_expr,
gcc_assert (TREE_CODE (DR_STEP (dr_a.dr)) == INTEGER_CST);
bool neg_step = tree_int_cst_compare (DR_STEP (dr_a.dr), size_zero_node) < 0;
- unsigned HOST_WIDE_INT abs_step = tree_to_uhwi (DR_STEP (dr_a.dr));
- if (neg_step)
- abs_step = -abs_step;
+ unsigned HOST_WIDE_INT abs_step
+ = absu_hwi (tree_to_shwi (DR_STEP (dr_a.dr)));
unsigned HOST_WIDE_INT seg_len1 = tree_to_uhwi (dr_a.seg_len);
unsigned HOST_WIDE_INT seg_len2 = tree_to_uhwi (dr_b.seg_len);
@@ -2331,7 +2333,7 @@ create_intersect_range_checks_index (loop_vec_info loop_vinfo, tree *cond_expr,
{
tree access1 = DR_ACCESS_FN (dr_a.dr, i);
tree access2 = DR_ACCESS_FN (dr_b.dr, i);
- /* Two index must be the same if they are not scev, or not scev wrto
+ /* Two indices must be the same if they are not scev, or not scev wrto
current loop being vecorized. */
if (TREE_CODE (access1) != POLYNOMIAL_CHREC
|| TREE_CODE (access2) != POLYNOMIAL_CHREC
@@ -2343,7 +2345,7 @@ create_intersect_range_checks_index (loop_vec_info loop_vinfo, tree *cond_expr,
return false;
}
- /* Two index must have the same step. */
+ /* The two indices must have the same step. */
if (!operand_equal_p (CHREC_RIGHT (access1), CHREC_RIGHT (access2), 0))
return false;