diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cf5b238e8c0..479364658a6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-09-27 Robin Dapp + + PR tree-optimization/77724 + * tree-vect-loop-manip.c (create_intersect_range_checks_index): + Add tree_fits_shwi_p check. + 2016-09-27 Jakub Jelinek * auto-inc-dec.c (try_merge): Remove break after return. diff --git a/gcc/testsuite/gcc.dg/vect/pr77724.c b/gcc/testsuite/gcc.dg/vect/pr77724.c new file mode 100644 index 00000000000..b3411d68117 --- /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 82030406ded..a715fd931ce 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;