From 5317b1be7eefe215ae67b8f65c8e7d8f54c6f2d2 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 8 Feb 2016 14:51:20 +0000 Subject: [PATCH] re PR tree-optimization/69719 (wrong code at -O3 on x86_64-linux-gnu) 2016-02-08 Richard Biener PR tree-optimization/69719 * tree-vect-data-refs.c (vect_prune_runtime_alias_test_list): Properly use absolute of the difference of the two offsets to compare or adjust the segment length. * gcc.dg/torture/pr69719.c: New testcase. From-SVN: r233212 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr69719.c | 24 ++++++++++++++++++++++++ gcc/tree-vect-data-refs.c | 16 +++++++++------- 4 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr69719.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c9d1d51959f..a2fb881faba 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-02-08 Richard Biener + + PR tree-optimization/69719 + * tree-vect-data-refs.c (vect_prune_runtime_alias_test_list): + Properly use absolute of the difference of the two offsets to + compare or adjust the segment length. + 2016-02-08 Richard Biener Jeff Law diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 60c95ae9530..f39a510f3ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-08 Richard Biener + + PR tree-optimization/69719 + * gcc.dg/torture/pr69719.c: New testcase. + 2016-02-08 Richard Biener Jeff Law diff --git a/gcc/testsuite/gcc.dg/torture/pr69719.c b/gcc/testsuite/gcc.dg/torture/pr69719.c new file mode 100644 index 00000000000..d7489e7810b --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr69719.c @@ -0,0 +1,24 @@ +/* { dg-do run } */ + +int b, c = 1, e, f; +int a[6][5] = { {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 1, 0, 0, 0} }; + +void __attribute__((noinline)) +fn1 () +{ + int d; + for (b = 0; b < 5; b++) + for (d = 4; d; d--) + a[c + 1][b] = a[d + 1][d]; +} + +int +main () +{ + fn1 (); + + if (a[2][1] != 0) + __builtin_abort (); + + return 0; +} diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 4c0e1352fa6..49e871b1411 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -3081,8 +3081,9 @@ vect_prune_runtime_alias_test_list (loop_vec_info loop_vinfo) || !tree_fits_shwi_p (dr_a2->offset)) continue; - HOST_WIDE_INT diff = (tree_to_shwi (dr_a2->offset) - - tree_to_shwi (dr_a1->offset)); + unsigned HOST_WIDE_INT diff + = absu_hwi (tree_to_shwi (dr_a2->offset) + - tree_to_shwi (dr_a1->offset)); /* Now we check if the following condition is satisfied: @@ -3101,13 +3102,14 @@ vect_prune_runtime_alias_test_list (loop_vec_info loop_vinfo) */ - HOST_WIDE_INT min_seg_len_b = (tree_fits_shwi_p (dr_b1->seg_len) - ? tree_to_shwi (dr_b1->seg_len) - : vect_factor); + unsigned HOST_WIDE_INT min_seg_len_b + = (tree_fits_uhwi_p (dr_b1->seg_len) + ? tree_to_uhwi (dr_b1->seg_len) + : vect_factor); if (diff <= min_seg_len_b - || (tree_fits_shwi_p (dr_a1->seg_len) - && diff - tree_to_shwi (dr_a1->seg_len) < min_seg_len_b)) + || (tree_fits_uhwi_p (dr_a1->seg_len) + && diff - tree_to_uhwi (dr_a1->seg_len) < min_seg_len_b)) { if (dump_enabled_p ()) { -- 2.30.2